2011-10-19 109 views
0

我忘記了從哪裏複製它(我認爲用戶在php.net上發佈它),但是用於獲取已準備和正常MySQLi語句結果的此函數未返回任何結果PHP MySQLi準備語句:獲取不返回連接的結果

function fetch($result){ 
    $array = array();   
    if($result instanceof mysqli_stmt){ 
     $result->store_result(); 
     $variables = array(); 
     $data = array(); 
     $meta = $result->result_metadata();     
     while($field = $meta->fetch_field()){     
      $variables[] = &$data[$field->name]; 
     }    
     call_user_func_array(array($result, 'bind_result'), $variables); 
     $i=0;        
     while($result->fetch()){          
      $array[$i] = array(); 
      foreach($data as $k=>$v) 
      $array[$i][$k] = $v; 
      $i++;     
     }    
    }elseif($result instanceof mysqli_result){ 
     while($row = $result->fetch_assoc()) 
     $array[] = $row; 
    }   
    return $array; 
} 

我一直在嘗試使用它,像這樣(所有這些功能都是類$數據庫的方法):

與包含一個簡單的INNER JOIN,至少在一個我試圖語句中使用時
function query($str, $values){        
    if($stmt=$this->sql->prepare($str)){      
     $types=$this->castArrayAsString($values); //returns a string of $values's types for bind_params    
     array_unshift($values, $types);   
     call_user_func_array(array(&$stmt, 'bind_param'), $this->makeValuesReferenced($values));       
     $stmt->execute(); 
     $result=$this->fetch($stmt); //the function I'm having problems with                    
     if(empty($result)){          
      $return=true;     
     }else{ 
      $return=$result; 
     }  
     $stmt->close();   
    }else{ 
     echo $this->sql->error; 
     $return=false; 
    }      
    return $return;    
} 

這不會返回任何內容:

$list=$database->query("SELECT a.field1, b.field2 FROM table1 AS a INNER JOIN table2 AS b ON a.id_table2=b.id WHERE a.someid=?", array($someid)); 

這工作得很好:

$list=$database->query("SELECT field1, field2 FROM table1 WHERE someid=?", array($someid)); 

如果我打印出來,從取結果的元數據,它表明選擇的字段等,但仍然給出了取()FUNC沒有最終結果。

任何幫助表示讚賞,

感謝

編輯這裏是全班

<?php 

class database{ 

    var $HOST="xx.xx.xx.xxx"; 
    var $USER="xxxxxxxxxxx";  
    var $PASS='xxxxxxxxxx'; 

    var $DATABASE="my_database"; 

    var $sql; 

    function database(){    
     $this->sql=new mysqli($this->HOST, $this->USER, $this->PASS, $this->DATABASE);    
     if($this->sql->connect_errno){ 
      echo "ERROR - No MySQL connection: ".$mysqli->connect_error; 
      exit; 
     }     
    } 

    function query($str, $values){           
     if($stmt=$this->sql->prepare($str)){        
      $types=$this->castArrayAsString($values);    
      array_unshift($values, $types);   
      call_user_func_array(array(&$stmt, 'bind_param'), $this->makeValuesReferenced($values));         
      $stmt->execute();        
      $result=$this->fetch($stmt);                       
      if(empty($result)){          
       $return=true;     
      }else{ 
       $return=$result; 
      }      
      $stmt->close();   
     }else{ 
      echo $this->sql->error; 
      $return=false; 
     }      
     return $return;    
    } 

    function fetch($result){ 
     $array = array();   
     if($result instanceof mysqli_stmt){ 
      $result->store_result(); 
      $variables = array(); 
      $data = array(); 
      $meta = $result->result_metadata();     
      while($field = $meta->fetch_field()){     
       $variables[] = &$data[$field->name]; 
      }    
      call_user_func_array(array($result, 'bind_result'), $variables); 
      $i=0;        
      while($result->fetch()){          
       $array[$i] = array(); 
       foreach($data as $k=>$v) 
       $array[$i][$k] = $v; 
       $i++;     
      }    
     }elseif($result instanceof mysqli_result){ 
      while($row = $result->fetch_assoc()) 
      $array[] = $row; 
     }   
     return $array; 
    } 

    function close(){ 
     $this->sql->close();  
    } 

    function castArrayAsString($array){   
     $types=""; 
     foreach($array as $key => $value) {    
      if(is_numeric($value)){ 
       if(is_float($value)){ 
        $types.="d"; 
       }else{ 
        $types.="i"; 
       }     
      }else{ 
       $types.="s"; 
      }       
     }   
     return $types; 
    } 

    function makeValuesReferenced($arr){ 
     $refs=array(); 
     foreach($arr as $key => $value){ 
      $refs[$key] = &$arr[$key]; 
     } 
     return $refs;  
    } 

} 

$database=new database; 

?>

回答

0

返回0結果集做一個「查詢inner-join',這意味着源表和目標表必須共享相同的鏈接列中的值查詢(在本例中爲a.id_table2和b.id)。機會是你沒有任何匹配的值,所以你得到一個0結果集。嘗試左外連接。


請嘗試以下,看看如果返回結果:

"SELECT a.field1, b.field2 FROM table1 AS a INNER JOIN table2 AS b ON a.id_table2=b.id WHERE a.someid = :someId" 

    $dbo = new Database(); 

    $stmt = $dbo->sql->prepare($sql); 

    $stmt->bindValue(':someId', $someId, PDO::PARAM_INT); 

    $stmt->execute(); 

    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     var_dump($row); 
    } 
+0

a.id_table2的價值觀和b.id匹配,我嘗試了相同的結果外連接。爲了確保我的SQL沒有錯,我在phpMyAdmin中檢查了它,它返回了期望的結果沒有問題。 – Paul

+0

它看起來不是代碼,查詢本身存在問題。你能發佈你的模式的片段嗎? –

+0

當然, table1:id(int,autoinc),id_table2(int),field1(varchar),field2(varchar) table2:id(int,autoinc),field1(varchar),field2(varchar) 同樣,I在SQL提示符下嘗試了我遇到的確切查詢,它確實有效,但不在上面的代碼中,這導致我相信它是代碼。也許與使用ON有關。我會發布全班測試。 – Paul