我有一个在原始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>
我尝试重新转义百分号“\\%”,但没有成功。
最合适的回答,由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.htmlWP 4.8.3中引入了这种行为,它使“双重准备”sql注入安全。。。
那么,为什么您的代码工作不正确
$wpdb->get_results( $sql3, OBJECT );
正在返回一个对象数组(每个选定行一个)。这是一个数组,所以你不能调用
->num_rows
在上面。。。
如果要计算行数,可以使用:
count( $result3 );
或
$wpdb->num_rows;