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 ) );