Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Wordpress wp_试图更新MySQLi列时未加载用户对象变量_Php_Wordpress_Mysqli - Fatal编程技术网

Php Wordpress wp_试图更新MySQLi列时未加载用户对象变量

Php Wordpress wp_试图更新MySQLi列时未加载用户对象变量,php,wordpress,mysqli,Php,Wordpress,Mysqli,当用户登录时,我需要更改数据库表中的整数。由于某些原因,wp\u user对象中的变量为空,表中没有任何内容被更新。如果我将查询回显到测试页面,所有内容都会正确显示。这是我的确切密码: function mv_update_notification_data() { mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSW

当用户登录时,我需要更改数据库表中的整数。由于某些原因,
wp\u 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\u facility
设置为“test”,则表中的
doc\u notified
列应更改为1,但不是


如果我没有将查询嵌套在条件中,则会触发查询。

您创建自己的mysqli连接和处理程序有什么特殊原因吗?因为您使用的是WordPress,所以您可以访问
$wpdb
类,该类使用起来非常简单,只需较少的设置,而且不必担心清理值等问题(除非您使用的是运行严格SQL查询的方法之一,此时您需要使用)

如果您需要使用自己的mysqli连接,可以用下面的查询替换$wpdb->update函数——但正如@Dharman所说,您需要使用参数化的预处理语句,否则您将无法使用

也就是说,问题在于钩子的触发时间不够晚,无法正确访问函数

如果查看钩子的文档,您将看到它有两个参数,
$user\u login
$user
,这两个参数分别为您提供对用户名和对象的访问权限

为了使这些参数在函数的作用域中可用,您需要告诉钩子在调用时要接受多少个参数。默认值为
1

一旦您更改了表名,下面的代码应该可以使用。你会注意到我正在使用这个方法。此方法负责为您进行调用,因此您不必再担心清理该值-,但确保正在检查的数据的格式符合您的期望,这绝不是一个坏主意。我没有包含任何类似的内容,但是如果您愿意,可以通过WP的一些函数和/或PHP运行该值

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
如何处理SQL查询,您可以替换整个
$wpdb->update()具有以下功能的上述功能:

$sql = "UPDATE db SET doc_notified = 1 WHERE facility = %s";
$args = array( $user_facility );

$result = $wpdb->query( $wpdb->prepare( $sql, $args ) );