RSS

  • YouTube
  • LinkedIn
  • 谷歌

档案 : 绑定倍数值

在 PDO SQL 语句中绑定多个值 (PDOStatement)

有时, 我们需要在生成 SQL 指令时通过几个列搜索单个值.

假设下表

  • [ENTITY_ONE]
    • Id
    • COLUMN_A
    • COLUMN_B
    • COLUMN_C
    • COLUMN_D
    • COLUMN_E

如果需要搜索列上的单个值 B,DE 我们将需要使用以下指令

选择 ID, COLUMN_A,(...列。。), COLUMN_E 从 ENTITY_ONE 那里 COLUMN_B 喜欢 '%search_value% ' 或 COLUMN_D 象 '%search_value% ' 或 COLUMN_E 象 '%search_value% ';

在 PHP 代码中, 我们可以做

$q = '%search_value% ';
$sql = "选择 * 从 ENTITY_ONE 那里 COLUMN_B 喜欢 ' $q ' 或 COLUMN_D 喜欢 ' $q ' 或 COLUMN_E 喜欢 ' $q '; 
$pdo = 新的 pdo($Dsn, $用户, $通过); 
$stmt = $pdo->;查询($Sql);

很好, this can work but we know that isn’;最好的方法. 我们需要使用绑定值来避免 SQL 注入和其他恶意处理.

所以, 代码可以修改为

$q = '%search_value% '; 
$sql = "选择 * 从COLUMN_B喜欢的地方ENTITY_ONE ? 或COLUMN_D喜欢 ? 或COLUMN_E喜欢 ?; 
$阿格斯= [$问, $问, $问]; // 我们每个条目需要一个条目 "?" on instruction
$pdo = new PDO($Dsn, $用户, $通过); 
$stmt = $pdo->;准备($Sql);
$stmt->;执行($阿格斯);

好多了, 但, 构建复杂的 SQL 指令时, things can be confusing with lots of arguments and don’;别忘了: 订单事项.

愉快的 PDO 可以在使用命名绑定时以不同的顺序绑定值.

$q = '%search_value% '; 
$sql = "选择 * 从COLUMN_B喜欢的地方ENTITY_ONE :first_arg或COLUMN_D喜欢 :second_arg或COLUMN_E喜欢 :third_arg; 

$pdo = 新的 pdo($Dsn, $用户, $通过); 
$stmt = $pdo->;准备($Sql); 
// One way
$args = [':first_arg' =>; $问, ':third_arg' =>;$问, ':second_arg' =>; $问]; // 我们每个条目需要一个条目 ":名字" on instruction 
$stmt->;执行($阿格斯); 
// Another way
$stmt->;bindValue(':third_arg '. $问);
$stmt->;bindValue(':first_arg ', $问); 
$stmt->;bindValue(':second_arg ', $问);

$stmt->;执行(); 

嗯, seems that this isn’;不够好. 我们只改变使用 1-索引占位符 到一个 :命名占位符. There’;没有超出代码可读性的增益, 并且有可能以任何顺序绑定.

是的, 但现在我们可以做最好的方法时, 使用一个独特的搜索词在几列. 我们只能使用一个绑定到一个或多个 :named placeholders ’;因为 PDO 聪明聪明. 看我们的最终代码在这里.

$q = '%search_value% '; 
$sql = "选择 * 从COLUMN_B喜欢的地方ENTITY_ONE :unique_arg或COLUMN_D喜欢 :unique_arg或COLUMN_E喜欢 :unique_arg; 
$pdo = 新的 pdo($Dsn, $用户, $通过); 
$stmt = $pdo->;准备($Sql); 
// One way 
$args = [':unique_arg' =>; $问]; // 我们可以绑定所有 :name with only one term 
$stmt->;执行($阿格斯); 
// Another way 
$stmt->;bindValue(':unique_arg', $问); 
$stmt->;执行(); 

使用相同的参数编写许多 SQL 指令时可以节省大量的输入.