Как я могу использовать функцию в моем запросе mysql?

#php #mysql

#php #mysql

Вопрос:

Я работаю на php.

я хочу узнать места, которые находятся на заданном расстоянии от географической широты и долготы.

у меня есть одна таблица в базе данных mysql под названием places, в которой есть три столбца placeId , latitude и longitude .

пользователь предоставляет latitude longitude место и а distance , затем, используя следующую формулу:

d = 2 *asin(sqrt((sin((lat1-lat2) / 2))^ 2 cos(lat1)cos(lat2)(sin((lon1-lon2) / 2))^ 2));

я могу проверить, находятся ли эти места на расстоянии, указанном пользователем, или нет.

Я хочу знать, как я могу написать запрос и функцию для реализации этой функциональности.

Комментарии:

1. dev.mysql.com/doc/refman/5.1/en/adding-functions.html чтобы создать свою собственную функцию или dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html чтобы создать запрос

Ответ №1:

Я создал нижеприведенную функцию в 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;
 

Ответ №2:

Я создал простую php-функцию для использования запросов MySQL.

Любой запрос может быть выполнен в 1 простой функции.

В случае запроса select мы можем получить выбранные аргументы, так как имя переменной содержит выбранное значение аргумента.

Для бывших :

 <?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;
?>
 

результат будет :

   someuser
  someemail
 

Если было выбрано большее количество строк, имя переменной будет создано в виде массива
например :

 <?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 ) затем вы можете использовать код для других файлов, включив

 <?php

include 'q.php';

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