Php 如何将多个GET参数合并到一个准备好的语句中
我正在使用地理定位应用程序,希望根据用户的标签返回radius结果Php 如何将多个GET参数合并到一个准备好的语句中,php,mysql,rest,Php,Mysql,Rest,我正在使用地理定位应用程序,希望根据用户的标签返回radius结果 $tags = preg_replace('/\s+/', '', $tags); $tags_list = []; $tags_list = explode(',', $tags); $tags = implode(" OR c.title=", $tags_list); echo $tags; if( !empty($latitude) && !empty($longtitude) && !e
$tags = preg_replace('/\s+/', '', $tags);
$tags_list = [];
$tags_list = explode(',', $tags);
$tags = implode(" OR c.title=", $tags_list);
echo $tags;
if(
!empty($latitude) &&
!empty($longtitude) &&
!empty($radius)
){
$qry = "SELECT o.id, o.title, o.icon, o.description,
(
6371 * acos
(
cos(
radians( :lat )
)
* cos(
radians( lat)
) * cos(
radians( lng) - radians( :lng )
) + sin(
radians( :lat )
) * sin(
radians( lat)
)
)
) AS distance
FROM objects o, category_object co, category c
WHERE o.id = co.id_object AND co.id_category = c.id AND c.title=:title
HAVING distance/1000 <= :radius
ORDER BY distance/1000 ASC;";
$stmt = $db->prepare($qry);
$stmt->bindParam(":lat", $latitude);
$stmt->bindParam(":lng", $longtitude);
//Here
$stmt->bindParam(":title", $tags);
$stmt->bindParam(":radius", $radius);
if($stmt->execute()){
while ($result = $stmt->fetch(PDO::FETCH_OBJ)) {
echo json_encode(array("type" => "FeatureCollection",
"features" => array(
"type" => "Feature",
"geometry" => array("type" => "Point",
"coordinates" => [$latitude, $longtitude]),
"properties" => array(
"ID" => $result->id,
"icon" => $result->icon,
"tags" => "",
"title" => $result->title,
"description" => $result->description))), JSON_UNESCAPED_SLASHES);
echo "\n\n";
}
}
$tags=preg_replace('/\s+/','.$tags);
$tags_list=[];
$tags_list=分解(“,”,$tags);
$tags=内爆(“或c.title=”,$tags\u列表);
echo$标签;
如果(
!空($latitude)&&
!空($longtudity)&&
!空($radius)
){
$qry=“选择o.id、o.title、o.icon、o.description、,
(
6371*acos
(
因为(
弧度(:lat)
)
*因为(
弧度(纬度)
)*cos(
弧度(lng)-弧度(:lng)
)+罪(
弧度(:lat)
)*罪(
弧度(纬度)
)
)
)作为距离
来自对象o、类别\对象co、类别c
其中o.id=co.id\u对象和co.id\u类别=c.id和c.title=:title
距离/1000的问题在于:
$tags = implode(" OR c.title=", $tags_list);
您需要在SQL中使用where子句:
AND (c.title = 'mexican' OR c.title = 'restaurants')
如果你想绑定参数,你必须做更多的工作。
比如:
您可以使用以下代码指定值:
$title_1 = $tags_list[0];
$title_2 = $tags_list[1];
$stmt->bindParam(':title_1', $title_1);
$stmt->bindParam(':title_2', $title_2);
问题在于:
$tags = implode(" OR c.title=", $tags_list);
您需要在SQL中使用where子句:
AND (c.title = 'mexican' OR c.title = 'restaurants')
如果你想绑定参数,你必须做更多的工作。
比如:
您可以使用以下代码指定值:
$title_1 = $tags_list[0];
$title_2 = $tags_list[1];
$stmt->bindParam(':title_1', $title_1);
$stmt->bindParam(':title_2', $title_2);
这不应该是一个数据库连接问题,因为第一个查询工作得很好,识别了代码,并认为这与上次添加的问题相同。不过,我认为bindParam破坏了我的内爆()方法您的代码将生成类似于的sql,其中o.id=co.id\u object和co.id\u category=c.id和c.title='mexican或c.title=restaurant'
这是不合法的sql这是我认为的谢谢!太简单了:DIt不应该是数据库连接问题,因为第一个查询工作得很好,所以识别代码并思考这和上次添加的问题是一样的,不过,我认为bindParam破坏了我的内爆()方法您的代码将生成sql,如o.id=co.id\u object和co.id\u category=c.id和c.title='mexican或c.title=restaurant'
这是不合法的sql这是我认为的谢谢!太简单了:我如何以保持动态的方式创建代码?标题的数量可以是可变的。您知道吗必须动态构建sql字符串我不知道如何在代码中添加for循环来添加它,你有什么提示吗?简单的添加。for(…)。在我的语法中引发一个错误。我如何以保持动态的方式创建代码?标题的数量可以是可变的。可以是。你必须动态构建sql字符串。我不明白我如何在代码中放入for循环来添加它,你有什么提示吗?简单的添加。for(…)。在我的语法中引发一个错误
$title_1 = $tags_list[0];
$title_2 = $tags_list[1];
$stmt->bindParam(':title_1', $title_1);
$stmt->bindParam(':title_2', $title_2);