您可以使用 OR 将多个参数传递给 SQL/PHP 单绑定语句吗?

sea*_*mus 2 php mysql sql bindparam

我有一个将数据传递到服务器的搜索栏。我正在接收发送的句子并将其分解为单独的单词。

然后我将一列与句子中的每个单词进行比较。

$term = filter_var($input['term'], FILTER_SANITIZE_STRING);
$terms = explode(" ", $term);
$size = sizeof($terms);

$posts = DB::select('SELECT * FROM cars
WHERE color = ?',
$terms[0] || $terms[1] || $terms[2] || $terms[3] || $terms[4] );
Run Code Online (Sandbox Code Playgroud)

在一个绑定上绑定多个参数的正确方法是什么?

这种方式会变得混乱,因为我想搜索其他列。

for ($i=0; $i < $size ; $i++) {
    $posts = DB::select('SELECT * FROM cars
        WHERE color = ? AND
        WHERE model =?',
    $terms[$i], $terms[$i],);
}
Run Code Online (Sandbox Code Playgroud)

Bil*_*win 5

在一个绑定上绑定多个参数的正确方法是什么?

想一想这个规则:您可以在 SQL 查询中使用参数来代替单个标量值

也就是说,当您通常在 SQL 语句中使用一个数值常量、一个带引号的字符串常量或一个带引号的日期常量时,您可以用一个参数替换该一个查询元素。

参数不能代替:

  • 多个值的列表
  • SQL 表达式
  • SQL关键字
  • 表名、列名或数据库名称等标识符

如果要将color列与多个值进行比较,则需要多个参数占位符。

$posts = DB::select('SELECT * FROM cars
WHERE color IN (?, ?, ?, ?)');
Run Code Online (Sandbox Code Playgroud)

将包含逗号分隔值列表的字符串传递给单个占位符是行不通的。您最终会得到一个查询,就像您这样编写的一样:

SELECT * FROM cars WHERE color IN ('12,34,56,78');
Run Code Online (Sandbox Code Playgroud)

该查询将运行而不会出现错误,但它不会给您想要的结果。在数字上下文中,字符串'12,34,56,78'的数值为 12。它会忽略字符串中第一个非数字字符之后的所有其余字符,。因此它将成功搜索颜色 12,但将无法找到其他颜色。


PDO 使处理值列表变得容易,因为当需要为参数化查询提供值时,您只需将数组传递给函数即可PDOStatement::execute()

如果您不知道需要搜索多少个颜色值,可以使用 PHP 内置函数来创建一个与颜色值数组长度相同的问号占位符列表:

$list_of_question_marks = implode(',', array_fill(1, count($color_values), '?'));
$sql = "SELECT * FROM cars WHERE color IN ($list_of_question_marks)" 
$stmt = $pdo->prepare($sql);
$stmt->execute($color_values);
Run Code Online (Sandbox Code Playgroud)