尝试更新 MySQLi 列时未加载 Wordpress wp_user 对象变量

当用户登录时,我需要更改数据库表中的整数。由于某种原因,对象中的变量wp_user是空的,并且表中没有更新任何内容。如果我将查询回显到测试页面,一切都会正确显示。这是我的确切代码:


function mv_update_notification_data() {

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    $conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

    $current_user = wp_get_current_user();

    $user_id = $current_user->ID;

    $user_email = $current_user->user_email;

    $user_facility = get_user_meta( $user_id, 'user_facility',  true );

    $username = $current_user->user_login;


    if ( $username == $user_facility . 'DOC' ){

        $conn->query("UPDATE db SET doc_notified = 1 WHERE facility = '$user_facility'");

    }

}

add_action('wp_login', 'mv_update_notification_data');

如果用户登录并具有“testDOC”的用户名并且该用户$user_facility设置为“test”,doc_notified则表中的列应更改为 1,但事实并非如此。


如果我不将它嵌套在条件中,查询就会触发。


莫回无
浏览 101回答 1
1回答

慕尼黑的夜晚无繁华

您创建自己的 mysqli 连接和处理程序有什么特别的原因吗?由于您使用的是 WordPress,因此您可以访问$wpdb该类,该类使用较少的设置更容易使用,并且无需担心清理值等(除非您使用运行严格 SQL 查询的方法之一,在这一点上你会想要使用$wpdb::prepare())如果您需要使用自己的 mysqli 连接,请随时用下面的查询替换 $wpdb->update 函数 - 但正如@Dharman 所说,您需要使用参数化的准备好的语句,否则您可以使用SQL 注入。也就是说,问题在于wp_login钩子没有足够晚地触发以正确访问该wp_get_current_user()函数。如果您查看该wp_login钩子的文档,您会看到它有 2 个参数,$user_login并且,它们分别为您提供了对用户名和对象$user的访问权限。WP_User为了使这些参数在您的函数范围内可用,您需要告诉该钩子在您调用时接受多少个参数add_action()。默认值为1.更改表名后,下面的代码应该可以工作。你会注意到我正在使用该$wpdb::update()方法。此方法负责调用$wpdb::prepare()您,因此您不必再担心清理该值 -但确保您检查的数据采用您期望的格式绝不是一个坏主意!. 我没有包含任何类似的内容,但是如果您愿意,您可以通过一些 WP 的清理/转义函数和/或 PHP 的filter_var来运行该值。add_action( 'wp_login', 'mv_update_notification_data', 99, 2 ); // Later priority, and pass 2 args)function mv_update_notification_data( $user_login, $user ){    global $wpdb; // Give this function access to the `$wpdb` class    $user_facility = get_user_meta( $user->ID, 'user_facility', true );    if( $user_login == $user_facility . 'DOC' ){        $result = $wpdb->update(            $YOUR_TABLE_NAME,            array(                'doc_notified' => 1            ),            array(                'facility' => $user_facility            ),            array(                '%d'            ),            array(                '%s'            )        );        // Do something with `$result` (returns: [int|false])    }}编辑:如果(出于某种原因)您想使用严格查询而不是$wpdb->update(),则可以使用该$wpdb::query()方法。对于简单的插入/更新,内置的静态函数通常就足够了,但是为了了解如何$wpdb处理 SQL 查询,您可以将$wpdb->update();上面的整个函数替换为以下内容:$sql = "UPDATE db SET doc_notified = 1 WHERE facility = %s";$args = array( $user_facility );$result = $wpdb->query( $wpdb->prepare( $sql, $args ) );
打开App,查看更多内容
随时随地看视频慕课网APP