2011-10-31 17 views
0

我正在使用php。如何在我的mysql查詢中使用函數?

我想找出與地理緯度和經度給定距離的地方。

我有在MySQL數據庫中一個表叫地方,其中有三列placeIdlatitudelongitude

用戶提供latitudelongitude的地方和distance,然後通過使用下面的公式:

d = 2 * ASIN(SQRT((SIN((LAT1-LAT2)/ 2))^ (lat1)cos(lat2)(sin((lon1-lon2)/ 2))^ 2));

我可以檢查這些地方是否與用戶給出的距離一致。

我想知道如何編寫查詢和函數來實現此功能。

+1

http://dev.mysql.com/doc/refman/5.1/en/adding-functions.html創建自己的功能或HTTP另一個文件E碼。 com/doc/refman/5.0/en/mathematical-functions.html創建查詢 – galchen

回答

5

我在下面的功能創造了MYSQL

DELIMITER $$  
DROP FUNCTION IF EXISTS `great_circle_distance`$$ 
    CREATE DEFINER=`root`@`localhost` FUNCTION `great_circle_distance`(
    lat1 DOUBLE(10,6), 
    lon1 DOUBLE(10,6), 
    lat2 DOUBLE(10,6), 
    lon2 DOUBLE(10,6) 
    ) RETURNS double(10,2) 
     DETERMINISTIC 
    BEGIN 
        DECLARE delta_lat DOUBLE(10,6); 
        DECLARE delta_lon DOUBLE(10,6); 
        DECLARE temp1 DOUBLE(10,6); 
        DECLARE EARTH_RADIUS DOUBLE(10,2); 
        DECLARE distance DOUBLE(10,2); 
        SET lat1 = RADIANS(lat1); 
        SET lon1 = RADIANS(lon1); 
        SET lat2 = RADIANS(lat2); 
        SET lon2 = RADIANS(lon2); 
        SET delta_lat = lat2 - lat1; 
        SET delta_lon = lon2 - lon1; 

        SET temp1 = pow(sin(delta_lat/2.0),2) + cos(lat1) * cos(lat2) * pow(sin(delta_lon/2.0),2); 
        SET EARTH_RADIUS = 3956.0; 
        SET distance = EARTH_RADIUS * 2 * atan2(sqrt(temp1),sqrt(1-temp1)); 
        RETURN distance; 
     END$$ 

    DELIMITER ; 

使用它作爲

Select great_circle_distance(z.lat,z.log, 32.2342,-72.42342) AS Distance from tbl_abc AS z; 
+0

感謝pinaldesai ...您的回答非常有幫助。非常感謝你... –

+0

歡迎哥們:) – pinaldesai

0

我創建了一個簡單的PHP函數使用MySQL查詢。

任何查詢都可以在1個簡單函數中執行。

在選擇查詢的情況下,我們可以獲取選定的參數,因爲變量名包含所選的參數值。

對於前:

someuser 
    someemail 

<?php 

q("select user_name,email_id from users where user_id=48"); 



    echo $user_name; echo "<br>"; 
    echo $email_id; 
?> 

你可以通過把 「爲」

<?php 

q("select user_name as uname, email_id as email from users where user_id=48"); 



    echo $uname; echo "<br>"; 
    echo $email; 
?> 

結果輸出會設置自己的變量名如果行數更多的話當選,變量名稱將作爲數組 爲前創建:

<?php 

     q("select user_name,user_id from users"); 

     for($n=0;$n<count($user_name);$n++) 
     { 

      if(count($user_name)==1) // if single row is selected 
      { 

       $username_val=$user_name; 
       $user_ids=$user_id; 


      }else{ 
       $username_val=$user_name[$n]; // for multiple rows selected 

       $user_ids=$user_id[$n]; 
      } 

      echo $username; 

     } 

?> 

你可以通過把「爲」

<?php 

     q("select user_name as un,user_id as uid from users"); 

     for($n=0;$n<count($user_name);$n++) 
     { 

      if(count($user_name)==1) // if single row is selected 
      { 

       $username_val=$un; 
       $user_ids=$uid; 


      }else{ 
       $username_val=$un[$n]; // for multiple rows selected 
       $user_ids=$uid[$n]; 
      } 

      echo $username_val; echo " "; 
      echo $user_ids; echo "<br>"; 

     } 

?> 

結果輸出會設置自己的變量名: (如果用戶表具有三排)

User1 4043 
User2 4048 
User3 4056 

創建MySQL連接文件例如:mysql_connect_file。PHP

<?php 

$dbc=new mysqli('localhost', 'my_user', 'my_password', 'my_db'); 

?> 

PHP函數低於

<?php 

    require_once './mysql_connect_file.php'; 
function q($q) 
     { 

    $main_q=$q; 
    $q= strtolower($q); 
     global $dbc; 

       $temp=$q; 
       $temp=str_replace(" ", "", $temp); 
       $temp= strtolower($temp); 
     $temp=".$temp"; 
       if(strpos($temp, "update")==1 || strpos($temp, "insert")==1 || strpos($temp, "delete")==1 || strpos($temp, "alter")==1 || strpos($temp, "create")==1) 
       { 
        $rd2= mysqli_query($dbc,$main_q); 
        if($rd2) 
        { 
         return TRUE; 
        } 
        else{ 


     $mysql_err= mysqli_error($dbc); 

       $err= debug_backtrace(); 
       $err_line=$err[0]['line']; 
       $err_file=$err[0]['file']; 
     echo "<font color='black'>Error at <b>$err_file on line $err_line </b>query --></font><font color='maroon'>$main_q</font> (<font color='red'> $mysql_err </font>)"; 

     return FALSE; 

        } 

       }elseif(strpos($temp, "select")==1){ 


    $qn= str_replace("select ", "", $q); 

    $qn=substr($qn,0, strpos($qn, " from")); 
    $qn="$qn,"; 

     $selc= str_replace("`","", $qn); 
     $qn= str_replace("`","", $qn); 
     $my_var=array(); 

     $my_nm=array(); 
     for($m=1;$m<=substr_count($selc, ',');$m++) 
     { 
       $my_nm[$m]=substr($qn,0, strpos($qn, ",")); 

       $qn=substr($qn,strpos($qn, ",")+1, strlen($qn)); 
       if(strpos($my_nm[$m]," as ")>0) 
       { 
     $my_var[$m]= str_replace(" as ", "~", $my_nm[$m]); 
     $my_var[$m]= str_replace(" ", "", $my_var[$m]); 


     $my_var[$m]=substr($my_var[$m],strpos($my_var[$m],"~")+1,strlen($my_var[$m])); 
       }else 
       { 
    $my_var[$m]=substr($my_nm[$m],0, strlen($my_nm[$m])); 
    $my_var[$m]= str_replace(" ","", $my_var[$m]); 
       } 

     } 

     $rn=mysqli_query($dbc, $main_q); 

     if($rn) 
     { 

       if(mysqli_num_rows($rn)>0) 
       {  

       for($t=1;$t<=count($my_var);$t++) 
      { 

      $$my_var[$t]=array(); 


      } 


    while($row=mysqli_fetch_array($rn,MYSQLI_ASSOC)) 
    { 

      if(mysqli_num_rows($rn)>1) 
      { 


       for($t=1;$t<=count($my_var);$t++) 
      { 

      ${$my_var[$t]}[]=$row[$my_var[$t]]; 
    } 

    }else{ 

      for($t=1;$t<=count($my_var);$t++) 
      { 
    $$my_var[$t]=$row[$my_var[$t]]; 

      } 


      } 
    } 

    if(mysqli_num_rows($rn)>1) 
    { 
    for($t=1;$t<=count($my_var);$t++) 
      { 
    $GLOBALS[$my_var[$t]]= sel_mr($my_var,$$my_var[$t]); 


      } 


      for($t=1;$t<=count($my_var);$t++) 
      { 
    return $$my_var[$t]; 


      } 
    } 
    if(mysqli_num_rows($rn)==1) 
    { 

       for($t=1;$t<=count($my_var);$t++) 
      { 
    $GLOBALS[$my_var[$t]]=$$my_var[$t]; 

      } 
      for($t=1;$t<=count($my_var);$t++) 
      { 
    return $$my_var[$t]; 

      } 

    } 



       }else 
       { 

     for($t=1;$t<=count($my_var);$t++) 
      { 
    $GLOBALS[$my_var[$t]]=NULL; 

      } 



      for($t=1;$t<=count($my_var);$t++) 
      { 
    return $my_var[$t]; 


      } 

       } 

     }else 
     { 

      for($t=1;$t<=count($my_var);$t++) 
      { 
    $my= mysqli_error($dbc); 
    if($t==1) 
    { 
      $err= debug_backtrace(); 
      $err_line=$err[0]['line']; 
      $err_file=$err[0]['file']; 
     echo "<font color='#ef0000'>Error at <b>$err_file on line $err_line </b>query --></font><font color='maroon'>$q</font> (<font color='red'> $my </font>)"; 

    } 


      } 



      for($t=1;$t<=count($my_var);$t++) 
      { 
    for($p=0;$p<count($$my_var[$t]);$p++) 
    { 
      $a=$$my_var[$t]; 
      return $a;  
    } 


      } 

     } 
       } 


     } 
    function sel_mr($a,$ab) 
    { 
      for($t=1;$t<=count($a);$t++) 
      { 
     foreach ($ab as $my) 
     { 

      ${$a[$t]}[]=$my; 

     } 
      } 

      for($t=1;$t<=count($a);$t++) 
      { 
     return $$a[$t]; 
      } 


    } 

?> 

注:

您可以將這段代碼保存到一個文件,那麼你可以通過包括文件名

調用這個函數

如果你的文件名是q.php( - >包含q函數) 那麼你可以使用th //dev.mysql:通過包括

<?php 

include 'q.php'; 

    q("select user_name from users where user_id=4048"); 
    echo $user_name 
?>