【问题标题】:MySQL INSERT issue with foreign keys in PHPPHP中外键的MySQL INSERT问题
【发布时间】:2016-05-21 09:13:55
【问题描述】:

我正在使用 PDO 将值插入到我的表中,如下所示:

$query = "INSERT INTO Maps(meetingId, street, city, code, centerLat, centerLon, zoom, markerVisible, markerLat, markerLon) VALUES (:meetingId, :street, :city, :code, :centerLat, :centerLon, :zoom, :markerVisible, :markerLat, :markerLon)";

$paramArr = array(
    ":meetingId" => intval($mapInfo['meetingId']),
    ":street" => $mapInfo['street'],
    ":city" => $mapInfo['city'],
    ":code" => $mapInfo['code'],
    ":zoom" => $mapInfo['zoom'],
    ":centerLat" => $mapInfo['center']['lat'],
    ":centerLon" => $mapInfo['center']['lon'],
    ":markerVisible" => $mapInfo['marker']['visible'],
    ":markerLat" => $mapInfo['marker']['lat'],
    ":markerLon" => $mapInfo['marker']['lon']
);

$db = $this->databaseManager ->getDB();
$query = $db->prepare($query);

foreach ($paramsArray as $key => $value) {
    $query->bindParam($key, $value, PDO::PARAM_INT);
}

当我执行这个查询时,我得到:

SQLSTATE[23000]:违反完整性约束:1452 无法添加或更新子行:外键约束

meetingId 是外键,但我添加了一个我 100% 确定存在于相关表中的键。此键的类型为 int。

另一方面,如果我删除第一个变量并在其位置输入正确的 id(我再次确定存在)我得到 ​​p>

SQLSTATE[HY000]:一般错误

我错过了什么吗?

【问题讨论】:

  • 如果您在执行查询时使用您最喜欢的 mysql 管理器应用程序中的值替换参数,那么您会得到同样的错误吗?您确定将 tge 正确的值替换为 meetingid 参数吗?表中是否还有其他外键?
  • @Shadow,是的,我确定。当我手动进行查询时替换时,一切正常。我还发现,当我直接将 $paramsArray 传递给执行语句(而不是在循环中手动绑定每个参数)时,一切正常。

标签: php mysql sql pdo insert


【解决方案1】:

在您的代码中:

foreach ($params as $key => $value) {
    $query->bindParam($key, $value, PDO::PARAM_INT);
}

您声明您传递的每个值都是一个整数 (PDO::PARAM_INT),但事实并非如此,因此存在完整性约束错误(整数与另一个表中的数据不匹配),然后“修复”meetingId 时的一般错误。

要解决这个问题,您不需要绑定循环,只需使用数组执行查询:

$queryResults = $db->prepare($query);
$queryResults->execute($paramArr);

来自Demystifying PHP PDO

您必须传递所有值以在数组中绑定到 PDOStatement->execute()您必须将每个值与 PDOStatement->bindValue() 绑定,然后调用 PDOStatement->execute() 不参数。

【讨论】:

  • 应该没什么区别。
  • 你不会相信的。它确实做到了。当我一一绑定时,我总是遇到完整性约束问题。当我确实通过数组来执行时,一切都像魅力一样工作。我现在很困惑。
  • 更新应该消除@RobertPorter 的困惑
【解决方案2】:

除了 Jay Blanchard 的回答中指出的问题

PDO bindParam按引用传递,而不是按值传递。

因此,解决此问题的一种可能方法是调整这一行代码:

foreach ($paramsArray as $key => $value) {

$value之前添加一个&字符,使其成为参考&$value

foreach ($paramsArray as $key => &$value) {
                                 ^

这应该足以修复代码。


或者,您可以只使用 bindValue 函数而不是 bindParam 函数。这就是杰伊布兰查德的回答中发生的事情。 (将值作为数组传递给 execute 相当于 bindValue。)

参考:http://php.net/manual/en/pdostatement.bindparam.php

【讨论】:

    猜你喜欢
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    相关资源
    最近更新 更多