【发布时间】:2013-08-24 09:23:30
【问题描述】:
我对 PDO 还很陌生,如果我误解了一些事情,请原谅。我花了很长时间阅读网上提供的材料,但找不到合适的解决方案。
我尝试编写的代码应该执行以下操作:获取两个 $_GET 变量,其中包含特定点纬度 ($lat) 和经度 ($lon),然后选择存储在 PostGIS 中的与这些坐标最近的点-启用的数据库(加上到该点的返回距离)。这是当前(和工作)代码的样子:
$courts = $pdo->query("SELECT * , ST_ASTEXT(geog) , ST_distance( ST_GeographyFromText('POINT($lon $lat)') , geog ) AS distance FROM bvbcourts WHERE ST_DWithin( ST_GeographyFromText('POINT($lon $lat)' ) , geog , 20000) ORDER BY distance LIMIT 1");
但是,我想尝试使用 prepare 语句,因为我读到这些语句是 SQL 注入证明。
$courts = $pdo->prepare("SELECT * , ST_ASTEXT(geog) , ST_distance( ST_GeographyFromText('POINT( :lon :lat )') , geog ) AS distance FROM bvbcourts WHERE ST_DWithin( ST_GeographyFromText('POINT( :lon :lat )' ) , geog , 20000) ORDER BY distance LIMIT 1" );
$courts->execute(array( ':lon' => $lon , ':lat' => $lat ) )
但上面的代码不起作用。执行errorInfo()只返回如下错误码:HY093
根据我目前了解到的情况,我认为上面的代码不起作用,因为->prepare 占位符只能用于通常插入输入参数的地方。
例如->prepare( "SELECT * FROM x WHERE field=:field" ); 会工作
而->prepare( "SELECT * FROM x WHERE field='someprefix:field'" ); 不会。我在上面尝试使用的代码有点类似于“someprefix”-example。
所以,我的问题是,如何让我尝试执行的语句生效,而无需使用 ->query 并手动阻止注入。或者我最好确保传递的参数是正确的、简单的坐标并使用->query?
这只是我在这里提出的第二个问题,如果我对所提供的研究和信息不够清楚或透彻,请原谅。
【问题讨论】:
标签: php pdo prepared-statement postgis