如何在php查询中使用sql数据库值
因此,我尝试使用多个变量进行radius类型的搜索,我的数据库中存储了每个城市的Lat/Long,但我注意到,大多数解决方案都要求我查询整个数据库(最终可能是50000多行),以便在函数中使用存储的Lat/Long值 是否仍然可以使用此存储的数据库值,而无需先从查询中获取它,然后在查询过程中使用它 我现在就是这样做的,但我认为这需要很多,特别是当数据库达到100000多行时,可能需要一些时间来检查每一行,如果我能在查询过程中检查距离会更好,这样我就可以更好地过滤结果,而不必检查每一行如何在php查询中使用sql数据库值,php,sql,google-maps-api-3,Php,Sql,Google Maps Api 3,因此,我尝试使用多个变量进行radius类型的搜索,我的数据库中存储了每个城市的Lat/Long,但我注意到,大多数解决方案都要求我查询整个数据库(最终可能是50000多行),以便在函数中使用存储的Lat/Long值 是否仍然可以使用此存储的数据库值,而无需先从查询中获取它,然后在查询过程中使用它 我现在就是这样做的,但我认为这需要很多,特别是当数据库达到100000多行时,可能需要一些时间来检查每一行,如果我能在查询过程中检查距离会更好,这样我就可以更好地过滤结果,而不必检查每一行 funct
function getLocation($address) {
if (!empty($address)) {
//Formatted address
$formattedAddr = str_replace(' ', '+', $address);
//Send request and receive json data by address
$geocodeFromAddr = file_get_contents('http://maps.googleapis.com/maps/api/geocode/json?address=' . $formattedAddr . '&sensor=true_or_false');
$output1 = json_decode($geocodeFromAddr);
//Get latitude and longitute from json data
$latitude = $output1->results[0]->geometry->location->lat;
$longitude = $output1->results[0]->geometry->location->lng;
return "$latitude,$longitude";
}
else {
return false;
}
}
function GetDrivingDistance($lat1, $lat2, $long1, $long2) {
$url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" . $lat1 . "," . $long1 . "&destinations=" . $lat2 . "," . $long2 . "&mode=driving&units=imperial";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
curl_close($ch);
$response_a = json_decode($response, true);
$dist = $response_a['rows'][0]['elements'][0]['distance']['text'];
$time = $response_a['rows'][0]['elements'][0]['duration']['text'];
return $dist;
//return array('distance' => $dist, 'time' => $time);
}
$sql = "SELECT * FROM mytable WHERE `date` >= '$selected_date'";
if ($length && !empty($length)) {
$sql.= " AND `length`<='$length'";
}
$sql.= " ORDER BY date_created DESC";
$CITY = "DALLAS, TX";
// FOR TESTING
$SLAT = getLocation($CITY);
$oparr = split("\,", $SLAT);
$FLAT = $oparr[0];
$FLONG = $oparr[1];
while ($row = $result->fetch_assoc()) {
$id = $row['id'];
$city = $row['city'];
$state = $row['state'];
$lat = $row['lats'];
$long = $row['longs'];
$distance = GetDrivingDistance($FLAT, $lat, $FLONG, $long);
if ($distance <= 200) {
// SHOW TABLE RESULTS
}
else {
echo "No results";
}
}
函数getLocation($address){
如果(!空($address)){
//格式化地址
$formattedAddr=str_replace(“,+”,$address);
//按地址发送请求和接收json数据
$geocodeFromAddr=文件\u获取\u内容('http://maps.googleapis.com/maps/api/geocode/json?address=“.$formattedAddr.&sensor=true或false”);
$output1=json\u decode($geocodeFromAddr);
//从json数据中获取纬度和经度
$latitude=$output1->results[0]->geometry->location->lat;
$longitude=$output1->results[0]->geometry->location->lng;
返回“$纬度,$经度”;
}
否则{
返回false;
}
}
函数GetDrivingDistance($lat1、$lat2、$long1、$long2){
$url=”https://maps.googleapis.com/maps/api/distancematrix/json?origins=“$lat1.”、“$long1.”和destinations=“.$lat2.”、“$long2.”模式=驾驶&单位=英制”;
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$URL);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_PROXYPORT,3128);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
$response=curl\u exec($ch);
卷曲关闭($ch);
$response\u a=json\u decode($response,true);
$dist=$response_a['rows'][0]['elements'][0]['distance']['text'];
$time=$response_a['rows'][0]['elements'][0]['duration']['text'];
返回$dist;
//返回数组('distance'=>$dist,'time'=>$time);
}
$sql=“从mytable中选择*,其中`date`>='$selected\u date';
如果($length&&!empty($length)){
$sql.=”和`length`基于来自的查询,我发现您可以在MySQL中计算距离,从而减少在调用Google Maps API之前从数据库读取记录的需要。请参阅下面的代码示例
看看表中有3条记录的地方,其中两条在德克萨斯州达拉斯200英里以内(另一条在休斯顿附近)
//获取达拉斯的位置
//getLocation(“德克萨斯州达拉斯”)//
$lat=32.7856717;
$lng=-96.77326000001;
$query='选择城市,(3959*acos(弧度('.$lat.))*cos(弧度(mytable.lats))
*cos(弧度(mytable.longs)-弧度('.$lng')+sin(弧度('.$lat'))
*sin(弧度(mytable.lats)))表示距离mytable的距离<200';
//$connection先前通过mysqli_connect()初始化
$results=$connection->query($query);
而($row=$results->fetch_object()){
//显示表格结果
回显“记录:”。$row->city。“-距离:”。$row->距离。“
”;
}
你也可以考虑添加到你的构建中,这样你就可以使用用户定义函数(UDF)HaveVixOxDiston()了,然后你的查询可以简化为:
$query = 'SELECT city, haversine_distance('.$lat.','.$lng.',mytable.lats,mytable.longs) AS distance FROM mytable having distance < 200';
$query='SELECT city,haversine_distance('.$lat.','.$lng.',mytable.lats,mytable.longs)作为距离小于200'的mytable的距离;
$sql=“选择caid
,月
,签证
,机票
,套餐
,收入
,费用
按日期分组(现金.月)”;
$result=$conn->query($sql)
$result=mysqli\u查询($conn,$sql);
$rows=mysqli\u fetch\u数组($result);
//$d=$data[“费用”];
$res=mysqli_查询($conn,$sql);
$data=mysqli\u fetch\u数组($res);
如果($result->num_rows>0){
而($row=$result->fetch_assoc()){
//$费用=$行[“费用”];
//echo$费用;
echo$行[“visa”]。“”;
}
}
您使用的是SQL Server、MySQL还是其他数据库引擎?如果您使用的是SQL Server,请查看关于我使用MySQL的公认答案。好的-您可以按照以下思路设计一些东西吗?我看到的唯一问题是它不允许多变量搜索,或者至少我无法正确实现。因为有时在我的搜索中,他们可能会搜索其他变量,因此我使用“WHERE username=“$username”和id=“$id”作为距离。您仍然可以在HAVING子句之前添加WHERE子句-例如,SELECT city,(3959*acos(弧度(32.7856717))*cos(弧度(mytable.lats))*cos(弧度)(弧度(mytable.lats))*cos(弧度)(mytable.longs)-radians(-96.77326000001))+sin(radians(32.7856717))*sin(radians(mytable.lats)))作为与mytable的距离,其中zip-in(7511975149)的距离<200
我使用了您的公式并进行了回显,它似乎没有拾取mytables存储的信息,因为您可以看到它只显示“mytable.olat”而不是实际值:选择*,(3959*acos(弧度(35.0077519))*cos(弧度(mytable.olat))*cos(弧度(mytable.olong)-radians())+sin(弧度(35.0077519))*sin(弧度(mytable.olat)))作为距离mytable的距离,其中length
长度的字段类型是什么?如果是整数/数字类型,则不应使用引号…但可能是字符串类型?可能是与城市相关的长度?长度是字符串,但我不认为这是问题,因为我也尝试过不使用引号。我想我问题可能是它没有读到
$query = 'SELECT city, haversine_distance('.$lat.','.$lng.',mytable.lats,mytable.longs) AS distance FROM mytable having distance < 200';
$result=mysqli_query($conn, $sql);
$rows=mysqli_fetch_array($result);
// $d = $data["expenses"];
$res=mysqli_query($conn, $sql);
$data=mysqli_fetch_array($res);
if ($result-> num_rows >0){
while($row = $result-> fetch_assoc()){
//$expenses = $row["expenses"];
// echo $expenses;
echo $row["visa"]."</br>" ;
}
}