您可以使用 OR 将多个参数传递给 SQL/PHP 单个绑定语句吗?
Can you pass multiple params using OR to an SQL/PHP single bind statement?
我有一个将数据传递到服务器的搜索栏。我正在将发送的句子拆分成单独的单词。
然后我将一列与句子中的每个单词进行比较。
$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],);
}
您应该使用 In 在各种项目之间进行搜索,如果是搜索,OR 运算符会更好:
$posts = DB::select('SELECT * FROM cars
WHERE color in (?) or
model in (?)',
implode(',', $terms), implode(',', $terms));
What is the proper way to bind with multiple parameters on one bind.
想想这个规则:您可以在 SQL 查询中使用参数代替 一个标量值 .
也就是说,您通常会在 SQL 语句中使用一个数字常量、一个带引号的字符串常量或一个带引号的日期常量,您可以用一个参数替换那个查询元素。
参数不能用于代替:
- 多值列表
- SQL 表达式
- SQL 关键字
- 像 table 名称、列名称或数据库名称这样的标识符
如果要将 color
列与多个值进行比较,则需要多个参数占位符。
$posts = DB::select('SELECT * FROM cars
WHERE color IN (?, ?, ?, ?)');
将包含 comma-separated 值列表的字符串传递给单个占位符不起作用。您最终得到的查询就像您以这种方式编写的一样:
SELECT * FROM cars WHERE color IN ('12,34,56,78');
这个查询 运行 没有错误,但它不会给你想要的。在数字上下文中,字符串 '12,34,56,78'
的数值为 12。它会忽略字符串中第一个 non-numeric 字符 ,
之后的所有其余字符。所以它会成功搜索到颜色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);
我有一个将数据传递到服务器的搜索栏。我正在将发送的句子拆分成单独的单词。
然后我将一列与句子中的每个单词进行比较。
$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],);
}
您应该使用 In 在各种项目之间进行搜索,如果是搜索,OR 运算符会更好:
$posts = DB::select('SELECT * FROM cars
WHERE color in (?) or
model in (?)',
implode(',', $terms), implode(',', $terms));
What is the proper way to bind with multiple parameters on one bind.
想想这个规则:您可以在 SQL 查询中使用参数代替 一个标量值 .
也就是说,您通常会在 SQL 语句中使用一个数字常量、一个带引号的字符串常量或一个带引号的日期常量,您可以用一个参数替换那个查询元素。
参数不能用于代替:
- 多值列表
- SQL 表达式
- SQL 关键字
- 像 table 名称、列名称或数据库名称这样的标识符
如果要将 color
列与多个值进行比较,则需要多个参数占位符。
$posts = DB::select('SELECT * FROM cars
WHERE color IN (?, ?, ?, ?)');
将包含 comma-separated 值列表的字符串传递给单个占位符不起作用。您最终得到的查询就像您以这种方式编写的一样:
SELECT * FROM cars WHERE color IN ('12,34,56,78');
这个查询 运行 没有错误,但它不会给你想要的。在数字上下文中,字符串 '12,34,56,78'
的数值为 12。它会忽略字符串中第一个 non-numeric 字符 ,
之后的所有其余字符。所以它会成功搜索到颜色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);