【问题标题】:php prepared statement SQLSTATE[42000]: Syntax error or access violation: 1064php 准备好的语句 SQLSTATE [42000]:语法错误或访问冲突:1064
【发布时间】:2013-06-12 16:24:45
【问题描述】:

我正在尝试更改为准备好的语句,但不断收到以下错误:

警告:PDO::query(): SQLSTATE[42000]: 语法错误或访问冲突:1064 你有一个 SQL 语法错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 ':fname AND

附近使用的正确语法

这是我使用的代码:

$street = 'astreet';
$lname = 'alname';
$fname = 'afname';
$list = '1,2,3,4,5';

   $var = 'admin';  

   $db = new PDO("mysql:dbname=customers;host=localhost",$var,$var);

   $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

$sql = "SELECT * FROM `table` WHERE `id` in ($list) AND `first_name` LIKE :fname AND `last_name` LIKE :lname AND `street_name` LIKE :street";

   $stmt = $db->prepare($sql);

   $stmt->execute(array(':street' => $street));
   $stmt->execute(array(':fname' => $fname));
   $stmt->execute(array(':lname' => $lname));

   $result = $db->query($sql);



foreach ($result as $row) {

        echo $row['post_code'];

              }

如果我正常运行查询 - 不是准备好的状态,它工作正常 - 只有当我开始将 :variables 添加到查询时,我才会收到错误

是否有任何代码丢失/不正确?

谢谢

【问题讨论】:

    标签: php mysql pdo syntax-error prepared-statement


    【解决方案1】:
    $stmt = $db->prepare($sql);
    
    $stmt->execute(array(':street' => $street));
    $stmt->execute(array(':fname' => $fname));
    $stmt->execute(array(':lname' => $lname));
    

    您正在运行相同的查询 3 次,每次使用不同的参数。您需要这样运行查询:

    $stmt = $db->prepare($sql);
    
    $stmt->execute(array(':street' => $street, ':fname' => $fname, ':lname' => $lname));
    

    并一次性传递所有三个参数。

    编辑添加:

    您也可以尝试显式绑定参数:

    $stmt = $db->prepare($sql);
    
    $stmt->bindParam(':street', $street);
    $stmt->bindParam(':fname', $fname);
    $stmt->bindParam(':lname', $lname);
    
    $stmt->execute();
    

    或者将它们添加为数组:

    $sql = "SELECT * FROM `table` WHERE `id` in ($list) AND `first_name` LIKE ? AND `last_name` LIKE ? AND `street_name` LIKE ?";
    $stmt = $db->prepare($sql);
    
    $stmt->execute(array($fname, $lname, $street));
    

    【讨论】:

    • @asdf1234 - 我添加了更多建议
    • 谢谢,但这些仍然不起作用 - 相同的错误加上警告:为 foreach() 提供的参数无效
    • @asdf1234 - 你从第三个得到同样的错误?这根本不包括字符串:fname
    • 相同的错误代码,但有问号:MySQL 服务器版本,以便在 '? 附近使用正确的语法?
    • 这很有趣。我猜你的 SQL 有问题,但它看起来很完美 - 字段和表名都被正确引用。您可以尝试在执行之前添加var_dump($stmt->ErrorInfo())var_dump($db->ErrorInfo()),看看它们是否会产生任何有趣的东西吗?另外,我假设如果你交换 WHERE 子句,那么你会得到类似的错误,所以 lname 是第一个?
    【解决方案2】:

    据我所知,您必须在 SQL 中转义字符串。 所以我会替换

    $sql = "SELECT * FROM `table` WHERE `id` in ($list) AND `first_name` LIKE :fname AND `last_name` LIKE :lname AND `street_name` LIKE :street";
    

    通过

    $sql = "SELECT * FROM `table` WHERE `id` in ($list) AND `first_name` LIKE ':fname' AND `last_name` LIKE ':lname' AND `street_name` LIKE ':street' ";
    

    【讨论】:

    • 请注意,这是引用字符串,而不是转义它们。此外,准备好的语句参数不仅不需要引用,也不应该被引用,因为它们不是值,而是值的占位符。想想函数参数之类的参数。
    • @outis - 是的,你是绝对正确的。感谢您的澄清。
    猜你喜欢
    • 2015-10-12
    • 1970-01-01
    • 2014-10-30
    • 2022-01-25
    • 2018-07-02
    • 2017-10-29
    • 2014-01-14
    • 2013-12-02
    相关资源
    最近更新 更多