2011-07-04 29 views
4

我正在使用一個準備語句的查詢返回多個結果,我想在數組中。但bind_result不會使用數組,所以這是我要做的事:PHP-bind_result到數組

$read_items = $db->stmt_init(); 
$read_items->prepare("SELECT item_id, item_name FROM items"); 
$read_items->execute(); 
$read_items->bind_result($var1, $var2); 
while ($read_items->fetch()) { 
    $item_id[] = $var1; 
    $item_name[] = $var2; 
} 

是否有更清晰/把成果轉化爲$ ITEM_ID和$ ITEM_NAME陣列更好/更優雅的方式?

從上面可以看出,我使用$ var1和$ var2,就像「中間體」一樣 - 不斷有感覺必須有更好的方法。

謝謝。

回答

3

我不能把它的信用,但PHP manual有一個很好的解決方案(逐字粘貼):

<?php 

// blah blah... 
call_user_func_array(array($mysqli_stmt_object, "bind_result"), $byref_array_for_fields); 

// returns a copy of a value 
$copy = create_function('$a', 'return $a;'); 

$results = array(); 
while ($mysqli_stmt_object->fetch()) { 
    // array_map will preserve keys when done here and this way 
    $results[] = array_map($copy, $byref_array_for_fields); 
} 
+0

安迪,謝謝。我也一直在通過文檔和評論,並嘗試了上述代碼,但它不適合我。你能否說明上述情況如何適用於我的具體例子?我在集會上有點難以理解這一點。謝謝。 – CodeVirtuoso

+0

您使用的是哪個版本的PHP? – Andy

+0

PHP 5.3和完全控制服務器,所以我可以安裝任何必要的。 – CodeVirtuoso

-1

我真的沒有看到把你的項目的ID和項目名稱不同點數組,你打破了兩個集合中的單個對象?沒有理由 。是。

所以,要回本,你應該做的是:

$items[$i]['var1']=$var1; 

$items[$i]['var2']=$var2; 

但這當然還是不太好。

正確的解決方案是有一個函數將你的mysqli結果映射到一個數組,所以你可以直接開始工作,無論查詢,這裏是我的 - 在幾個分貝的工作,但不是所有都是最新的時刻:

function connectmysqldb($database,$host,$port,$user,$password){ 
    global $conn; 
    $conn=mysqli_connect($host, $user, $password, $database,$port); 
    if (!$conn){ 
     die('Error: Could not connect: ' . mysqli_connect_error()); 
    } 
    return $conn; 
} 

function connectpgdb($database,$host,$port,$user,$password){ 
    $connectString = 'host=' . $host . ' port=' . $port . ' dbname=' . $database . ' user=' . $user . ' password=' . $password; 
    $conn = pg_connect ($connectString); 
     if (!$conn) 
     { 
     die('Error: Could not connect: ' . pg_last_error()); 
     } 
    return $conn; 
} 

function connectmssqldb($dbname,$host,$port,$uid,$pw){ 
    $connectionOptions = array("UID"=>$uid,"PWD"=>$pw); 
    $conn = sqlsrv_connect($host, $connectionOptions); 
    if (!$conn) 
     { 
     die('Error: Could not connect: ' . print_r(sqlsrv_errors(), true)); 
     } 
    return $conn; 
} 
function sqlec($query,$dbtype,$dbname,$host,$port,$uid,$pw){ 
    switch($dbtype){ 
      default: 
       $res="Database Type not Recognized : $dbtype"; 
       break; 

      case "mysql": 
       global $conn; 
       if(!isset($conn)){ 
        $conn=connectmysqldb($dbname,$host,$port,$uid,$pw); 
       } 
       $clone=mysqli_multi_query($conn,$query); 
       if(!$clone){ 
        die('Error: ' . mysqli_error($conn)); 
       }else{ 
        $clonearray=array(); 
        $i=0; 
        if ($clone = mysqli_store_result($conn)) { 
         while ($row = mysqli_fetch_assoc($clone)){ 
          $clonearray[$i]=$row; 
          $i++; 
         } 
         mysqli_free_result($clone); 
        } 
        $res=$clonearray; 
       } 
       break; 

      case "postgres": 
       $conn=connectpgdb($dbname,$host,$port,$uid,$pw); 
       $clone=pg_query($conn,$query); 
       if (!$clone) 
       { 
        die('Error: ' . pg_last_error()); 
       }else{ 
        $clonearray=array(); 
        $i=0; 
        while ($row = pg_fetch_row($clone)) 
         { 
         $count = count($row); 
         $y = 0; 
         while ($y < $count) 
          { 
          $c_row = current($row); 
          $clonearray[$i][pg_field_name($clone,$y)] = $c_row; 
          next($row); 
          $y = $y + 1; 
          } 
         $i = $i + 1; 
         } 
        pg_free_result($clone); 
        pg_close($conn); 
        $res=$clonearray; 
       } 
       break; 

      case "mssql": 
       $conn=connectmssqldb($dbname,$host,$port,$uid,$pw); 
       $res=sqlsrv_query($conn,$query); 
       if (!$res) 
       { 
        die("Error in statement execution.\n".print_r(sqlsrv_errors(), true)); 
       }else{ 
        $i=0; 
        $sqlsarray=array(); 
        while($row = sqlsrv_fetch_array($res, SQLSRV_FETCH_ASSOC)) 
        { 
         if($i==0){ 
         $arrk=array_keys($row); 
         } 
         $j=0; 
         while($j<count($arrk)){ 
          $sqlsarray[$i][$arrk[$j]]=$row[$arrk[$j]]; 
          $j++; 
         } 
         $i++; 
        } 
        $res=$sqlsarray; 
       } 
       break; 
    } 
    return $res; 
} 


function local_sqlec($query){ 
    global $db_server; 
    global $db_db; 
    global $db_port; 
    global $db_username; 
    global $db_password; 
    return sqlec($query,"mysql",$db_db,$db_server,$db_port,$db_username,$db_password); 
}   

,我用這樣的:

$r=local_sqlec("SELECT test1,test2 FROM test"); 
$i=0; 
echo "last id =".($r[0]['test1'])."<br>"; 
echo "Row count =".($r[0]['test2'])."<br>"; 

while($i<$r[0]['test2']){ 
    echo "inserted id =".($r[0]['test1']+$i)."<br>"; 
    $i++; 
}