你可以使用OR将多个参数传递给sql / php单绑定语句吗?

时间:2018-03-22 16:51:58

标签: php mysql sql bind sqlbindparameter

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

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

  $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] );

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

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

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

2 个答案:

答案 0 :(得分:4)

  

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

请考虑以下规则:您可以在SQL查询中使用参数代替一个标量值

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

参数不能代替:

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

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

$posts = DB::select('SELECT * FROM cars
WHERE color IN (?, ?, ?, ?)');

将包含以逗号分隔的值列表的字符串传递给单个占位符并不起作用。您最终得到的查询就像您以这种方式编写的一样:

SELECT * FROM cars WHERE color IN ('12,34,56,78');

此查询将无误地运行,但它不会让您想要。在数字上下文中,字符串'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);

答案 1 :(得分:0)

您应该使用In来搜索不同的项目,如果是搜索,OR运算符会更好用:

    $posts = DB::select('SELECT * FROM cars
    WHERE color in (?) or
    model in (?)',
    implode(',', $terms), implode(',', $terms));