使用$wpdb查询Materials表无结果无报错,求排查SELECT语句问题
问题分析与解决办法
这条SELECT语句确实存在问题,正是两个关键原因导致你查不到结果,甚至看不到报错:
字符串未加引号导致语法逻辑错误
你的mtrname字段应该是存储字符串类型的数据(比如用户名),但直接写WHERE mtrname=$user时,SQL会把$user的取值当作列名而非字符串值解析。举个例子,如果$user的值是Yosra,SQL实际执行的是WHERE mtrname=Yosra——这里的Yosra会被识别为一个列名,而不是你要查询的字符串内容,自然查不到匹配的数据。另外你没在查询后调用$wpdb->print_error(),所以即使有语法错误也看不到报错信息。存在严重的SQL注入风险
直接把用户提交的$_POST['uusername']拼进SQL语句里是非常不安全的做法,恶意用户可以通过构造特殊输入篡改SQL语句,窃取甚至破坏数据库数据。
正确的写法(安全且能正常查询)
WordPress的$wpdb提供了prepare()方法来处理这类场景,它会自动帮你处理字符串引号和特殊字符转义,既解决语法问题又防范注入:
// 先检查用户输入是否存在,避免Undefined index警告 if (isset($_POST['uusername']) && !empty($_POST['uusername'])) { $user = $_POST['uusername']; // 使用prepare绑定参数,%s表示字符串类型的占位符 $query = $wpdb->prepare("SELECT * FROM Materials WHERE mtrname = %s", $user); $result = $wpdb->get_results($query); // 检查并输出错误(如果有的话) if ($wpdb->last_error) { $wpdb->print_error(); } // 遍历输出结果 foreach($result as $print) { echo '<pre>', print_r($print->id_customer, 1), '</pre>'; } } else { echo '请提供有效的用户名'; }
补充说明
%s是prepare()的字符串占位符,如果你的字段是数字类型,就用%d作为占位符;- 永远不要直接将用户输入(POST/GET/COOKIE等)直接拼进SQL语句中,一定要用
$wpdb->prepare()处理; - 查询后记得调用错误检查方法,方便排查问题。
内容的提问来源于stack exchange,提问作者Yosra MH
相关产品推荐
相关产品推荐

