我没有理解正确的准备。

时间:2018-06-28 作者:Geoff Ebbs

我有一个在原始PHP中运行良好的查询,但我无法使用$wpdb运行。我似乎在提供的建议中遗漏了一些东西How do you properly prepare a %LIKE% SQL statement?

我的代码是

global $wpdb;
// Create a SQL statement with placeholders for the string input.
$sql3 = "SELECT id, post_date, post_title, guid FROM $wpdb->posts where post_type=\'attachment\' and post_mime_type like %s;";
// Prepare the SQL statement so the string input gets escaped for security.
$sql3 = $wpdb->prepare( $sql3, $wpdb->esc_like(\'image\').\'%\' );
echo $sql3;
$result3 = $wpdb->get_results( $sql3, OBJECT );
$wpdb->print_error();
echo "<script>var NumImages=".$result3->num_rows."</script>\\n"; //pass global variable

$sql2 = "SELECT id, post_date, post_title, guid FROM wp_posts where post_type=\'attachment\' and post_mime_type like \'image/%\' ";
$result2 = $mx_conn->query($sql2);
echo "<script>var NumImages2=".$result2->num_rows."</script>\\n"; //pass global variable 
结果是

SELECT id, post_date, post_title, guid FROM wp_posts where post_type=\'attachment\' and post_mime_type like \'image{eba84c0d1eba4e4059d0be4f26c5b63f33813b7eb78af4b6237419122fccde3f}\'; 
<script>var NumImages=</script>
<script>var NumImages2=917</script>
我尝试重新转义百分号“\\%”,但没有成功。

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

好的,那么代码有一个主要问题,它与SQL中的类转义语句无关。但让我从那开始。。。

你逃跑没什么错。你应该这样做:

global $wpdb;
// Create a SQL statement with placeholders for the string input.
$sql3 = "SELECT id, post_date, post_title, guid FROM $wpdb->posts where 
post_type=\'attachment\' and post_mime_type like %s;";
// Prepare the SQL statement so the string input gets escaped for security.
$sql3 = $wpdb->prepare( $sql3, $wpdb->esc_like(\'image\').\'%\' );
echo $sql3;
$result3 = $wpdb->get_results( $sql3, OBJECT );
虽然这次转义没有意义,但您确切地知道传入的字符串是什么,并且它是安全的。

那么为什么$wpdb会生成如此奇怪的SQL呢

这是对该漏洞的修复:https://blog.ircmaxell.com/2017/10/disclosure-wordpress-wpdb-sql-injection-technical.html

WP 4.8.3中引入了这种行为,它使“双重准备”sql注入安全。。。

那么,为什么您的代码工作不正确

$wpdb->get_results( $sql3, OBJECT );
正在返回一个对象数组(每个选定行一个)。这是一个数组,所以你不能调用->num_rows 在上面。。。

如果要计算行数,可以使用:

count( $result3 );

$wpdb->num_rows;

结束

相关推荐

从php文件中获取wpdb数据似乎会崩溃?

因此,我有一个html元素,其中文本反映了数据库中的文本字段,这是正常工作的。我需要经常更新,以便:<script> setInterval(function(){ $(\"#marque_element\").load(\"XXXload_marque.php\"); }, 1000); </script> 它只是从load\\u marque获取回声。php。load\\u品牌内部。php我有: <