PHP中带有外键的MySQL插入问题

PHP中带有外键的MySQL插入问题,php,mysql,sql,pdo,insert,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, :marke

我使用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%确定存在于te相关表中的键。此键的类型为int

另一方面,如果我删除第一个变量并在它的位置键入正确的id(我确信它仍然存在),我得到

SQLSTATE[HY000]:一般错误

我在这里遗漏了什么吗?

在您的代码中:

foreach ($params as $key => $value) {
    $query->bindParam($key, $value, PDO::PARAM_INT);
}
您正在声明要传递的每个值都是一个整数(
PDO::PARAM_INT
),但事实并非如此,因此会出现完整性约束错误(该整数与另一个表中的数据不匹配),然后是“修复”meetingId时的一般错误

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

$queryResults = $db->prepare($query);
$queryResults->execute($paramArr);
发件人:

您必须将数组中要绑定的所有值传递给
PDOStatement->execute()
您必须使用
PDOStatement->bindValue()
绑定每个值,然后调用
PDOStatement->execute()


除了Jay Blanchard回答中确定的问题之外

PDO
bindParam
通过引用传递,而不是通过值传递

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

foreach ($paramsArray as $key => $value) {
$value
之前添加
&
字符,使其成为参考
和$value

foreach ($paramsArray as $key => &$value) {
                                 ^
这应该足以修复代码


或者,您可以只使用
bindValue
函数,而不使用
bindParam
函数。杰伊·布兰查德的回答就是这样。(在
execute
上以数组形式传递值相当于
bindValue


参考资料:

如果在您最喜爱的mysql manager应用程序中执行查询时,参数被值替换,那么是否会出现相同的错误?您确定tge right值已替换为meetingid参数吗?表中还有其他外键吗?@Shadow,是的,我确定。当我手动执行查询时,一切正常。我还发现,当我将$paramsArray直接传递给execute语句(而不是在循环中手动绑定每个param)时,一切正常。应该不会有太大的区别。你不会相信的。事实上是这样。当我一个接一个地绑定时,我总是遇到完整性约束问题。当我通过数组来执行时,一切都很有魅力。我现在很困惑。更新应该可以消除@RobertPorter的困惑