Quotes in table name

时间:2015-06-17 作者:Lea Cohen

自WP3起。5.prepare() 接受占位符作为安全措施,而不仅仅是将参数附加到查询中。因此$wpdb->prefix 需要成为第二个参数,由调用%s:

$count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(id) FROM %s WHERE answer !=\' \'", $wpdb->prefix . "faq_questions" ) );  
但是,这样做会以引号返回表名:

SELECT COUNT(id) FROM \'wp_faq_questions\' WHERE answer !=\' \'

我怎样才能解决这个问题?

2 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

我怎样才能解决这个问题?

你不能,但它没有坏。你在说prepare 使用字符串。将引用字符串。它并不是要生成MySQL语法,这是您要求它做的。您的tablename与其说是字符串值,不如说是MySQL命令或关键字。那不是什么prepare 用于。

prepare 旨在对用户提供的数据进行操作。您的tablename不是用户提供的数据,所以不需要“准备”它。这是不必要的。只需在SQL本身中构造表名:

"SELECT COUNT(id) FROM ".$wpdb->prefix."faq_questions WHERE answer !=\' \'"
请参见:https://wordpress.stackexchange.com/a/93861/21376

SO网友:Tom Auger

你有一些选择。白名单是一个很好的选择,也就是说,对照一个允许的字段名数组进行检查,只有在识别出其中一个字段名时才添加ORDERBY子句。

if ( in_array( $table_name, [\'faq_questions\', \'faq_responses\', \'some_other_table\'] ) )...

否则,WordPress有一个专门为您构建的功能:https://codex.wordpress.org/Function_Reference/sanitize_sql_orderby

结束