在请求ID列表时,如何使用Prepare

时间:2012-12-09 作者:Brian Barnes

我希望从数据库中获得一些记录,并给出一个数字列表,我想知道如何使用$wpdb->准备这样做(利用它提供的清理vs SQL注入攻击)。

我想实现的一个错误方式是$wpdb->query($wpdb->prepare(\'SELECT * FROM wp_postmeta WHERE post_id IN (\' . implode(\',\', $ids) .\') 但这会带来SQL注入攻击的机会(假设其中一个ID的值为“0”);DROP TABLE wp\\u posts;“”)。

注意:我并没有试图从wp\\U Posteta中选择数据,我只是将其用作示例。

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

$wpdb->prepare() 使用与php相同的语法进行格式化printf(). 所以你需要... WHERE post_id IN (%d,%d,%d) ...

这将适合三个ID。但是如果我们得到的身份证多于或少于三个呢?我们将使用php工具创建所需的格式字符串(假设$ids 是一个ID为的数组):

计算ID

count( $ids )
为$ids中的每个ID创建一个带\'\'%1!\'\'的字符串

str_repeat( \'%d,\', count( $ids ) )
现在我们有一个字符串%d,%d,%d,. 结尾有一个逗号。让我们移除它

$ids_format_string = rtrim( str_repeat( \'%d,\', count( $ids ) ), \',\' );
并以这种方式使用\'... WHERE post_id IN (\' . $ids_format_string . \') ...\'

SO网友:fuxia

在你的情况下,你知道你想要什么样的数据,所以我会强制这种类型:

$ids = array_map( \'absint\', $ids );
然后可以使用这些值,无需进一步准备。

结束

相关推荐

Using WPDB class

我想使用wpdb 我的外部页面上的类与wordpress没有关联。我尝试在php文件中包含以下内容:// include wordpress functions include( $_SERVER[\'DOCUMENT_ROOT\'] . \'/wp-load.php\'); require_wp_db(); global $wpdb; 现在,我使用$wpdb->query$product_info_query = $wpdb->query(\"select