【问题标题】:PDO Error: " Invalid parameter number: parameter was not defined"PDO 错误:“无效的参数号:未定义参数”
【发布时间】:2012-06-15 10:27:06
【问题描述】:

我正在尝试使用带有数组形式参数的简单 MySQL 插入查询。它一直告诉我参数的数量是错误的。我尝试了以下方法,都产生了相同的错误:

$stmt3 = $link->prepare('INSERT INTO messages VALUES(null, :room, :name, :message, :time, :color)');
$stmt3->execute(array(':room' => $Clean['room'],':name' => $Clean['name'],':message' => $Clean['message'],':time' => $time,':color:' => $Clean['color']));

$stmt3 = $link->prepare('INSERT INTO messages VALUES(:null, :room, :name, :message, :time, :color)');
$stmt3->execute(array(':null' => null, ':room' => $Clean['room'],':name' => $Clean['name'],':message' => $Clean['message'],':time' => $time,':color:' => $Clean['color']));

以及专门声明列以避免空插入:

$stmt3 = $link->prepare('INSERT INTO messages (room, name, message, time, color) VALUES(:room, :name, :message, :time, :color)');
$stmt3->execute(array(':room' => $Clean['room'],':name' => $Clean['name'],':message' => $Clean['message'],':time' => $time,':color:' => $Clean['color']));

这是我第一次使用 PDO(我通常使用 mysqli,但我当前的共享主机没有 mysqlnd 插件,导致我无法使用 prepare(),因此从这个角度的任何见解都值得赞赏。

【问题讨论】:

    标签: php mysql pdo prepared-statement parameterized-query


    【解决方案1】:

    问题 - 你会自责的 - 在于:color

    调用execute() 时为该标记传递的值的数组键名为:color:。删除尾随的:(我猜这只是一个错字)。

    $stmt3->execute(array(
        ':room' => $Clean['room'],
        ':name' => $Clean['name'],
        ':message' => $Clean['message'],
        ':time' => $time,
        ':color' => $Clean['color'],
        ));
    

    【讨论】:

    • 天哪。我恨自己现在。我不敢相信我盯着这个看了一个半小时却没有看到它......
    • 我花了几分钟。有时您只需要新鲜的眼睛,这就是我们在这里的目的;-)
    • 嘿嘿嘿 +1 新鲜的眼睛!很好的抓住戴夫
    • @Dave 你是对的。我太专注于它,无法捕捉到那么小的东西。非常感谢!
    • 只有我的 5 美分。我对这个通用错误有同样的问题。在命名约定中将近 1 小时后找到了解决方案。参数名称中不能有连字符 (-)。删除连字符后,一切都按预期工作!
    【解决方案2】:

    我在这里可能错了,但据我所知你需要这样做:

    $stmt3->bindParam(':room', $Clean['room']);
    $stmt3->bindParam(':name', $Clean['name']);
    //and so on
    

    但作为个人喜好,我一直都是这样的

    $stmt3 = $link->prepare('INSERT INTO messages VALUES(null, ?, ?, ?, ?, ?)');
    $stmt3->execute(array($Clean['room'], $Clean['name'], $Clean['message'], $time, $Clean['color']))
    

    【讨论】:

    • 这是一种可选的方法,根据php.net/manual/en/pdostatement.execute.php,我使用的数组方法应该可以工作。
    • 你的第二个例子是我是如何用 mysqli 做的,但我真的很想这样做以提高可读性,而且我非常想知道错误现在是什么原因造成的。
    猜你喜欢
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多