我正在使用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]:常规错误
我在这里错过了什么吗?
答案 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);
你必须传递所有值以将数组绑定到
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
。)