PDO MySQL无法将查询结果插入临时表

时间:2016-07-28 17:59:21

标签: php mysql pdo

为什么我不能将查询结果插入到临时表中,但如果我从CREATE TEMPORARY TABLE语句中删除TEMPORARY并创建一个实际的表,我的查询就会完美运行。

逻辑会让我相信db会话正在丢失并且临时表正在被删除,但是当我在脚本中测试各种位置时,临时表似乎存在,无论出于何种原因,数据都没有被插入临时表,但它会插入普通表。

创建表格查询:

 $ttbldrop = $db->prepare("DROP TABLE IF EXISTS z123");
    $ttbldrop->execute();


     $stmt = $db->prepare("CREATE TEMPORARY TABLE z123 (zcity varchar(32), zstate varchar(32), zip_code varchar(5), latitude DECIMAL(9,6), longitude DECIMAL(9,6), miles DECIMAL(4,1))");
     $temptbl = $stmt->execute();

    if(!$temptbl) {
        echo "Temp Table Not Created";
        die;
    }else{
        //echo "Temp Table Created Successfully";

创建功能:

  function radiusContent() {
        include 'conn.php';

            global $latN;
            global $latS;
            global $lonE;
            global $lonW;
            global $lat1;
            global $lon1;

            $sql = $db->prepare("SELECT * FROM tbl_zipcode WHERE (latitude <= $latN AND latitude >= $latS AND longitude <= $lonE AND longitude >= $lonW) AND (latitude != $lat1 AND longitude != $lon1) AND city != '' ORDER BY state, city, latitude, longitude");
            $results = $sql->execute();
                if(!$results) {
                    echo "Database Query 2 Error \n"; 
                    die; 
                }
            $rs = $sql->fetchAll();
            return $rs; 

        }

运行功能&amp; Foreach循环:

$data = radiusContent();
            if(!$data){
                echo "No Additional Zip Codes Found Within Search Radius - Increase Radius Search Distance \n";
                die;
            }else {   


                foreach($data as $row) {

                $truedistance = acos(sin(deg2rad($lat1)) * sin(deg2rad($row['latitude'])) + cos(deg2rad($lat1)) * cos(deg2rad($row['latitude'])) * cos(deg2rad($row['longitude']) - deg2rad($lon1))) * $r;

                $zcity = $row['city'];  
                $zstate = $row['state_abbrv'];
                $zip_code = $row['zip_code'];
                $latitude = $row['latitude'];
                $longitude = $row['longitude'];
                $miles = $truedistance;

插入临时表:

  if($miles <= $distance) {
      $insert = $db->prepare("INSERT INTO z123 (zcity, zstate, zip_code, latitude, longitude, miles) 
                             VALUES ('$zcity', '$zstate', '$zip_code', '$latitude', '$longitude', '$miles')"); 
       $result = $insert->execute();

       if(!$result){
       echo "Data Insert Failed";
        }

     }
 }

(在PHP代码上方的FYI在脚本中按行顺序排列)

由于



注意:澄清任何混淆:

$result = $insert->execute(); 

if(!$result) { 
   echo "Data Insert Failed"; 
} 

如果我的sql语句中有任何错误,是否表名不存在,列名不存在,错误的mysql语法等等,我会得到&#34;数据插入失败&#34;信息。

所以要测试,

如果我使用CREATE TEMPORARY TABLE运行上面的代码我没有错误(只是没有数据插入到表中)。

测试1:如果我故意将临时表名更改为不存在的表名,我会得到上面的错误消息&#34;数据插入失败&#34;,这应该证明表存在于原始代码中。

测试2:如果我在INSERT INTO语句中使用正确的临时表名并完整地删除了CREATE TEMPARARY TABLE语句(包括相关代码),我现在得到上面的错误消息&#34;数据插入失败&#34 ;,再次证明表格存在于原始代码中。



更新:解决方案-FIX

我正在使用&#34;包括&#39; conn.php&#39;;&#34;在每个函数中而不是使用&#34; global $ db&#34;为我的连接($ db在我的conn.php文件中定义)。虽然这不是关闭任何现有的会话,但它为我的脚本中的每个函数打开了额外的(多个)会话。

在每个功能中导致多个连接的原始代码示例:

<?php
   include 'conn.php';

   function myFunctionName(){
     include 'conn.php';
      (my funciton code here)
    }

解决方案 - 在功能中正确连接数据库的方法:

<?php
   include 'conn.php';

   function myFunctionName(){
     global $db;
      (my funciton code here)
    }

注意:&#34;全球$ db;&#34;在&#34; conn.php&#34;中定义文件。

0 个答案:

没有答案