PHP中带有外键的MySQL插入问题
我使用PDO在表中插入值,如下所示: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
$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的困惑