经过大量的网络搜索之后,我看到此错误的次数看起来确实是特定于场景的。到目前为止,我还没有找到适合我的情况的方案。我认为我的问题来自具有空间数据类型参数的准备好的语句。
我执行代码的方式是:
$sql = $conn->prepare("INSERT INTO states(`name`, `poly`) VALUES(':name',GeomFromText('GEOMETRYCOLLECTION(:coords)'));");
$res = $sql->execute(['name'=>$name, 'coords'=>$coords]);
if($res){
echo "... Successfully Inserted<br><br>";
}
else{
echo "... Failed<br><br>";
print_r($sql->errorInfo());
echo "<br><br>";
}
以上失败。与数据库的连接已经过测试。由于这些是相当大的几何集,因此,我将展示如何验证我的SQL,而不是粘贴代码:
转储原始SQL文件并将SQL复制/粘贴到phpMyAdmin窗口中,一切都插入正确。
$sqlStr = "INSERT INTO states(`name`, `poly`) VALUES('$name',GeomFromText('GEOMETRYCOLLECTION($coords)'));";
$check = file_put_contents('./states/'.$name.'2.sql', $sqlStr);
因此,我相信我的sql是正确的,但是正是由于这个原因,我的问题很可能是由于prepare / execute部分所致。我不确定是否不能像这样分配空间数据类型?
我还想指出,我使用的是PHP 5.5.9版,并且已经在原始方法中执行了查询,而execute中的参数就很好了。
答案 0 :(得分:4)
最后的代码无法正常工作。查询中的参数一定不能放在引号内。
由于GEOMETRYCOLLECTION(:coords)
必须在字符串中,因此您需要使用CONCAT()
来创建此字符串。
$sql = $conn->prepare("
INSERT INTO states(`name`, `poly`)
VALUES(:name,GeomFromText(CONCAT('GEOMETRYCOLLECTION(', :coords, ')')));");