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



当用户登录时,我需要更改数据库上表中的整数。由于某种原因,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,但事实并非如此。

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

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

如果您需要使用自己的 mysqli 连接,请随时将 $wpdb->update 函数替换为下面的查询 - 但正如@Dharman所说,您需要使用参数化的预准备语句,否则您将对 SQL 注入持开放态度。

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

如果您查看 Docs 中的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 ) );

最新更新