【发布时间】:2021-03-16 22:16:23
【问题描述】:
我在使用 PDO 方法的 SQL 查询中使用 REGEXP 时遇到问题。当我执行该语句时,我从数据库中什么也得不到。我想免受 SQL 注入的影响,我只是在学习它。 如果我这样做(不安全的方式),它可以工作:
try {
$db = new PDO('mysql:host=localhost;dbname='.'vodici', 'root', '');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $db->prepare("SELECT * FROM users WHERE vodicaky REGEXP '$a1' AND vodicaky REGEXP '$a2 ' AND vodicaky REGEXP ' $a ' AND vodicaky REGEXP ' $b1 ' AND vodicaky REGEXP ' $b '
AND vodicaky REGEXP ' $be ' AND vodicaky REGEXP ' $c1 ' AND vodicaky REGEXP ' $c1e ' AND vodicaky REGEXP ' $c ' AND vodicaky
REGEXP ' $ce ' AND vodicaky REGEXP ' $d1 ' AND vodicaky REGEXP ' $d1e ' AND vodicaky REGEXP ' $d ' AND vodicaky REGEXP
' $de ' AND vodicaky REGEXP ' $t'");
$stmt->execute();
if($stmt->execute()){
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
echo $row['meno']." (".$row['id'].")<br>";
}
}
} catch (PDOException $e){
echo 'ERROR PDO Exception thrown: '.$e->getMessage();
}
但是当我想以正确的方式进行操作时,我从数据库中什么也得不到。变量中的这些值是通过复选框从用户输入中插入的。当用户不选中框变量为空时,选中时变量具有 ex 值。 “D1”或“A1”。
$vodicak = $a1."' AND vodicaky REGEXP '".$a2."' AND vodicaky REGEXP '".$a."' AND vodicaky REGEXP '".$b1."' AND vodicaky REGEXP '".$b."'
AND vodicaky REGEXP '".$be."' AND vodicaky REGEXP '".$c1."' AND vodicaky REGEXP '".$c1e."' AND vodicaky REGEXP '".$c."' AND vodicaky
REGEXP '".$ce."' AND vodicaky REGEXP '".$d1."' AND vodicaky REGEXP '".$d1e."' AND vodicaky REGEXP '".$d."' AND vodicaky REGEXP
'".$de."' AND vodicaky REGEXP '".$t;
try {
$db = new PDO('mysql:host=localhost;dbname='.'vodici', 'root', '');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $db->prepare("SELECT * FROM users WHERE vodicaky REGEXP :vodic");
$stmt->execute();
if($stmt->execute()){
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
echo $row['meno']." (".$row['id'].")<br>";
}
}
} catch (PDOException $e){
echo 'ERROR PDO Exception thrown: '.$e->getMessage();
}
我的想法和 StackOverflow 线程都用完了 :) 谢谢
【问题讨论】:
-
1) 您在查询中定义了一个参数占位符 (
:vodic),但您没有在execute中为其传递参数(您应该会收到错误消息)。 2) 这不是构建查询的正确方法(手动创建整个WHERE子句并将其作为参数传递)。您应该为每个变量(:a1、:be等)创建一个占位符,并将它们全部传递给execute调用。 -
那我应该这样做吗? -> ``` WHERE vodickay REGEXP :a AND vodickay REGEXP :a1 ``` 等等?感谢您的回答@El_Vanja
-
是的,就是这样。但不能与查询的其余部分分开(您不能将查询的一部分作为参数插入),将它们全部写在一起并将参数数组传递给
execute。 -
喜欢这个? $stmt->execute(['a' => $a, 'a1' => $a1]);对不起,我真的很新,我不太了解所有 PDO 的东西:/
-
你真的需要这个长的复合 REGEXP 过滤器作为多个 AND 吗?您可以构建单个字符串并将其作为单个参数传递