MySQL INSERT与PHP中的外键问题

时间:2016-02-10 20:15:55

标签: php mysql sql pdo insert

我正在使用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(我再次肯定存在)我得到

  

SQLSTATE [HY000]:常规错误

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:4)

在您的代码中:

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()绑定每个值,然后调用{ {1}}没有参数。

答案 1 :(得分:1)

除了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