PHP PDO查询未插入-错误HY093

时间:2018-10-09 14:55:08

标签: php mysql pdo

经过大量的网络搜索之后,我看到此错误的次数看起来​​确实是特定于场景的。到目前为止,我还没有找到适合我的情况的方案。我认为我的问题来自具有空间数据类型参数的准备好的语句。

我执行代码的方式是:

$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中的参数就很好了。

1 个答案:

答案 0 :(得分:4)

最后的代码无法正常工作。查询中的参数一定不能放在引号内。

由于GEOMETRYCOLLECTION(:coords)必须在字符串中,因此您需要使用CONCAT()来创建此字符串。

$sql = $conn->prepare("
    INSERT INTO states(`name`, `poly`) 
    VALUES(:name,GeomFromText(CONCAT('GEOMETRYCOLLECTION(', :coords, ')')));");