有时, 我们需要在生成 SQL 指令时通过几个列搜索单个值.
假设下表
- [ENTITY_ONE]
- Id
- COLUMN_A
- COLUMN_B
- COLUMN_C
- COLUMN_D
- COLUMN_E
如果需要搜索列上的单个值 B,D 和 E 我们将需要使用以下指令
选择 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 指令时可以节省大量的输入.