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 ) );
- 1 回答
- 0 关注
- 96 浏览
添加回答
举报