PHP - bind_result到数组

时间:2011-07-04 21:35:51

标签: php mysql prepared-statement

我正在为一个返回多个结果的查询使用一个预准备语句,我想在一个数组中使用它。但是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 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

您可以使用Generating random numbers given required distribution and empirical sampling(...)运算符。

$results = array(null, null);
$read_items->bind_result(...$results);
while ($read_items->fetch()) {
  $item_id[] = $result[0]; 
  $item_name[] = $result[1];
}

答案 2 :(得分:-2)

我真的没有看到将你的项目ID和项目名称放在不同的数组中的意义,你要分解两个集合中的单个对象???没理由 。是

所以,回到这个,你应该做的是:

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

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

但这当然还不是很好。

正确的解决方案是有一个函数将你的mysqli结果映射到一个数组,这样你就可以直接开始处理它了,不管是什么查询,这是我的 - 在几个db中工作但是并非所有都是最新的:

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++;
}