【问题标题】:Using REGEXP with PDO (PHP) issue将 REGEXP 与 PDO (PHP) 问题一起使用
【发布时间】: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 吗?您可以构建单个字符串并将其作为单个参数传递

标签: php mysql sql regex pdo


【解决方案1】:

这应该让您的代码按预期工作。然而,根据 cmets,你最好改变你的表情,这样你就不需要 15 个了!

// Define database connection parameters
$db_host = "127.0.0.1";
$db_name = "name_of_database";
$db_user = "user_name";
$db_pass = "user_password";


// Create a connection to the MySQL database using PDO
$pdo = new pdo(
    "mysql:host={$db_host};dbname={$db_name}",
    $db_user,
    $db_pass,
    [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_EMULATE_PREPARES => FALSE
    ]
);


$sql   = "
    SELECT * FROM users 
    WHERE vodicaky REGEXP ?
        AND vodicaky REGEXP ?
        AND vodicaky REGEXP ?
        AND vodicaky REGEXP ?
        AND vodicaky REGEXP ?
        AND vodicaky REGEXP ?
        AND vodicaky REGEXP ?
        AND vodicaky REGEXP ?
        AND vodicaky REGEXP ?
        AND vodicaky REGEXP ?
        AND vodicaky REGEXP ?
        AND vodicaky REGEXP ?
        AND vodicaky REGEXP ?
        AND vodicaky REGEXP ?
        AND vodicaky REGEXP ?
    ";
$query = $pdo->prepare($sql);

// Using `?` as placeholders in the SQL means we can pass an array of parameters
// to the `execute` method and they will be applied to the query in the order they
// appear. I.e. the first value in the array is mapped to the first `?` in the SQL
$query->execute([$a1,$a2,$a,$b1,$b,$be,$c1,$c1e,$c,$ce,$d1,$d1e,$d,$de,$t]);

while($row = $query->fetch(PDO::FETCH_ASSOC)){
    echo "{$row["meno"]} ({$row["id"]})<br>";
}

【讨论】:

  • 它正在工作,谢谢,但是当我尝试添加另一个变量时,我再次从数据库中什么也得不到:/
  • @luxx 你是如何尝试添加另一个变量的?
  • 我刚刚在最后一个 REGEXP 后面添加了这个:AND [name_of_column] ?并在执行数组中添加了另一个变量
  • @luxx 好的,所以你没有在最后一个中使用 REGEXP?在这种情况下,您需要在 column name? 之间添加一个 =
  • 是的,我也这样做了,但我没有得到任何东西,我什至没有得到任何错误。当我在 PHPMyAdmin 的数据库中直接运行此查询时,我会显示行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
相关资源
最近更新 更多