将字符串数组传递给WordPress插件中的SQL语句

时间:2021-07-28 作者:Ramona Morea

我对passing an array of strings to a SQL statement in a WordPress plugin, 因为prepare方法在每个撇号之前都添加了反斜杠。

// I have an array of strings.
$the_array = [\'red\', \'green\', \'blue\'];

// I convert the array into a single string containing comma separated values surrounded by apostrophes.
$the_string = "\'" . implode("\', \'", $the_array) . "\'";

// And I pass the string to the query, using prepare (necessary to avoid SQL injections).
$db_options = $wpdb->get_col(
                $wpdb->prepare(
                    "SELECT option_name
                    FROM $wpdb->options
                    WHERE option_name NOT IN (%s)",
                    $the_string
                )
            );
此代码生成的SQL语句如下,并添加了反斜杠:

SELECT option_name
FROM wp_options
WHERE option_name NOT IN (\'\\\'red\\\', \\\'green\\\', \\\'blue\\\'\')
但这将返回表中的所有值,忽略NOT IN part!

如何从PHP代码生成下面的正确语句(同时保留prepare方法)?

我需要这个:

SELECT option_name
FROM wp_options
WHERE option_name NOT IN (\'red\', \'green\', \'blue\')
谢谢大家!

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

$wpdb->prepare() 接受单个参数数组作为第二个参数,例如。

$wpdb->prepare(
    "SELECT * FROM table WHERE field1 = %s AND field2 = %d AND field3 = %s",
    array( \'foo-bar\', 123, \'[email protected]\' )
)
因此,您可以将占位符数组与SQL命令(第一个参数)一起使用,如下所示:

// Create an array of placeholders, e.g. array( %s, %s, %s ) in your case.
$placeholders = implode( \', \', array_fill( 0, count( $the_array ), \'%s\' ) );

$db_options = $wpdb->get_col(
    $wpdb->prepare(
        // 1st parameter: The SQL command.
        "SELECT option_name
        FROM $wpdb->options
        WHERE option_name NOT IN ($placeholders)",

        // 2nd parameter: A single array of arguments.
        $the_array
    )
);
此外,请注意,如果传递一个数组,如$the_array 则必须没有第3、4、5等参数;否则,将出现错误。因此,请传递单个参数或所有参数的单个数组,但决不能同时传递这两个参数!

// Good
$wpdb->prepare( "...", \'foo\', 123, \'etc.\' );
$wpdb->prepare( "...", array( \'foo\', 123, \'etc.\' ) );

// Bad - there is a 3rd parameter (\'etc.\')!
$wpdb->prepare( "...", array( \'foo\', 123 ), \'etc.\' );

相关推荐

Error missing MySQL extension

昨天我删除了一些文件来清理我的存储。之后,我在访问我的网站时遇到以下错误。您的PHP安装似乎缺少WordPress所需的MySQL扩展。我删除了WordPress旧的安装程序并安装了新的安装程序,但问题仍然存在。恢复我的网站的可能解决方案是什么。非常感谢。