Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用PDOStatement::prepare with PostGIS函数_Php_Pdo_Prepared Statement_Postgis - Fatal编程技术网

Php 使用PDOStatement::prepare with PostGIS函数

Php 使用PDOStatement::prepare with PostGIS函数,php,pdo,prepared-statement,postgis,Php,Pdo,Prepared Statement,Postgis,我是PDO的新手,所以如果我误解了一些事情,请原谅。我花了相当长的时间阅读网上提供的资料,但找不到合适的解决办法 我试图编写的代码应该执行以下操作:获取两个$\u GET变量,其中包含特定的点纬度($lat)和经度($lon),然后选择与这些坐标最近的点,这些点存储在支持PostGIS的数据库中(加上到该点的返回距离)。这就是当前(和正在工作的)代码段的外观: $courts = $pdo->query("SELECT * , ST_ASTEXT(geog) , ST_distance(

我是PDO的新手,所以如果我误解了一些事情,请原谅。我花了相当长的时间阅读网上提供的资料,但找不到合适的解决办法

我试图编写的代码应该执行以下操作:获取两个$\u 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(“从x中选择*,其中字段=:字段”)将起作用
鉴于
->prepare(“从x中选择*,其中field='someprefix:field'”)不会。我在上面尝试使用的代码与“someprefix”示例有些类似

所以,我的问题是,我如何让我试图执行的语句工作,而不必使用
->query
和手动阻止注入。或者我最好只是确保传递的参数是正确的普通坐标,并使用
->query


这只是我在这里提出的第二个问题,请原谅我对所提供的研究和信息不够清楚或透彻。

我真的很想知道如何向新来者提供关于该主题的基本知识

在常人看来,这些问题似乎很重复。这让程序员想到网站的低效。然而,网站政策似乎鼓励重复问题。好了,就这样

准备好的语句只能表示竞争数据文本。坦率地说,一个完整的字符串数字

查看您的代码:

'POINT($lon $lat)'
已是数据文字。所以,你不能让文字成为文字的一部分。你必须把它捆起来:

$courts = $pdo->prepare("SELECT * , ST_ASTEXT(geog) , ST_distance( ST_GeographyFromText(:point) , geog ) AS distance FROM bvbcourts WHERE ST_DWithin( ST_GeographyFromText(:point ) , geog , 20000) ORDER BY distance LIMIT 1" );
$courts->execute(array( ':point' => "POINT($lon $lat)") );

我真的很想知道如何向新来者提供关于这个主题的基本知识

在常人看来,这些问题似乎很重复。这让程序员想到网站的低效。然而,网站政策似乎鼓励重复问题。好了,就这样

准备好的语句只能表示竞争数据文本。坦率地说,一个完整的字符串数字

查看您的代码:

'POINT($lon $lat)'
已是数据文字。所以,你不能让文字成为文字的一部分。你必须把它捆起来:

$courts = $pdo->prepare("SELECT * , ST_ASTEXT(geog) , ST_distance( ST_GeographyFromText(:point) , geog ) AS distance FROM bvbcourts WHERE ST_DWithin( ST_GeographyFromText(:point ) , geog , 20000) ORDER BY distance LIMIT 1" );
$courts->execute(array( ':point' => "POINT($lon $lat)") );

最好的方法是不创建WKT字符串,而是将坐标浮动直接传递给PostGIS几何体构造函数。以下是您的prepare语句的外观

SELECT *, ST_ASTEXT(geog), ST_Distance(poi, geog) AS distance
FROM bvbcourts,
 (SELECT ST_MakePoint(:lon, :lat)::geography AS poi) AS f
WHERE ST_DWithin(poi, geog, 20000)
ORDER BY distance
LIMIT 1;

最好的方法是不创建WKT字符串,而是将坐标浮动直接传递给PostGIS几何体构造函数。以下是您的prepare语句的外观

SELECT *, ST_ASTEXT(geog), ST_Distance(poi, geog) AS distance
FROM bvbcourts,
 (SELECT ST_MakePoint(:lon, :lat)::geography AS poi) AS f
WHERE ST_DWithin(poi, geog, 20000)
ORDER BY distance
LIMIT 1;

根据PostGIS文档,ST_MakePoint解决方案也可以工作,并且比ST_GeographyFromText(参见此处)快一点。对我来说,它也更容易使用,因为我可以使用与其他查询相同的编码样式,并且不必添加检查输入参数是否为实际浮点。然而,该文档还指出ST_MakePoint不符合OGC。这可能是将来的问题(例如,当迁移到不同的dbms时)?正确,
ST_MakePoint
不符合OGC,因此在不同的dbms上不可用,但地理类型(和
ST_GeographyFromText
)也不是OGC的一部分。我知道MS SQL Server也有类似的类型,但不确定其他类型。ST_MakePoint解决方案也可以工作,并且根据PostGIS文档,它比ST_GeographyFromText(参见此处)快一点。对我来说,它也更容易使用,因为我可以使用与其他查询相同的编码样式,并且不必添加检查输入参数是否为实际浮点。然而,该文档还指出ST_MakePoint不符合OGC。这可能是将来的问题(例如,当迁移到不同的dbms时)?正确,
ST_MakePoint
不符合OGC,因此在不同的dbms上不可用,但地理类型(和
ST_GeographyFromText
)也不是OGC的一部分。我知道MS SQL Server有类似的类型,但不确定其他类型。