为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
莫回无 2022-07-29 15:26:11
当用户登录时,我需要更改数据库表中的整数。由于某种原因,对象中的变量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,但事实并非如此。如果我不将它嵌套在条件中,查询就会触发。
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

您创建自己的 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 ) );


查看完整回答
反对 回复 2022-07-29
  • 1 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信