PHP-将_结果绑定到数组

PHP-将_结果绑定到数组,php,mysql,prepared-statement,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

我正在使用一个准备好的语句来执行一个返回多个结果的查询,我希望在一个数组中包含这些结果。但是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,就像“中间产品”——并且一直感觉一定有更好的方法


谢谢。

我不认为这是我的功劳,但它有一个很好的解决方案(逐字粘贴):


我真的看不出将项目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);
}           
函数connectmysqldb($database、$host、$port、$user、$password){
全球$conn;
$conn=mysqli_connect($host、$user、$password、$database、$port);
如果(!$conn){
die('错误:无法连接:'.mysqli_connect_Error());
} 
返回$conn;
}
函数connectpgdb($database、$host、$port、$user、$password){
$connectString='host='.$host.'port='.$port.'dbname='.$database.'user='.$user.'password='.$password;
$conn=pg_connect($connectString);
如果(!$conn)
{ 
die('错误:无法连接:'.pg_last_Error());
} 
返回$conn;
}
函数connectmssqldb($dbname、$host、$port、$uid、$pw){
$connectionOptions=array(“UID”=>$UID,“PWD”=>$pw);
$conn=sqlsrv_connect($host,$connectionOptions);
如果(!$conn)
{ 
die('错误:无法连接:'。打印(sqlsrv_errors(),true));
} 
返回$conn;
}
函数sqlec($query、$dbtype、$dbname、$host、$port、$uid、$pw){
交换机($dbtype){
违约:
$res=“无法识别数据库类型:$dbtype”;
打破
案例“mysql”:
全球$conn;
如果(!isset($conn)){
$conn=connectmysqldb($dbname、$host、$port、$uid、$pw);
}
$clone=mysqli\u multi\u query($conn,$query);
如果(!$clone){
die('Error:'.mysqli_Error($conn));
}否则{
$clonearray=array();
$i=0;
如果($clone=mysqli\u store\u result($conn)){
while($row=mysqli\u fetch\u assoc($clone)){
$clonearray[$i]=$row;
$i++;
}
mysqli_免费_结果($clone);
}
$res=$clonearray;
}
打破
“博士后”案例:
$conn=connectpgdb($dbname,$host,$port,$uid,$pw);
$clone=pg_query($conn$query);
如果(!$clone)
{ 
死('Error:'.pg_last_Error());
}否则{
$clonearray=array();
$i=0;
而($row=pg_fetch_row($clone))
{
$count=计数($row);
$y=0;
而($y<$count)
{
$c_row=当前($row);
$clonearray[$i][pg_field_name($clone,$y)]=$c_row;
下一个($行);
$y=$y+1;
}
$i=$i+1;
}
pg_免费_结果($clone);
pg_关闭(康涅狄格州);
$res=$clonearray;
}
打破
案例“mssql”:
$conn=connectmssqldb($dbname、$host、$port、$uid、$pw);
$res=sqlsrv_查询($conn,$query);
如果(!$res)
{
die(“语句执行中出错。\n”。print_r(sqlsrv_errors(),true));
}否则{
$i=0;
$sqlsarray=array();
而($row=sqlsrv\u fetch\u数组($res,sqlsrv\u fetch\u ASSOC))
{
如果($i==0){
$arrk=数组_键($row);
}
$j=0;
而($j可以使用(…)运算符

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

安迪,谢谢。我也看过文档和评论,试过上面的代码,但对我来说不起作用。你能说明一下上面的内容如何应用到我的具体例子中吗?我很难理解这个问题。谢谢。你使用的是什么版本的PHP?PHP5.3,完全控制服务器,这样我就可以安装wh任何必要的。
$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++;
}
$results = array(null, null);
$read_items->bind_result(...$results);
while ($read_items->fetch()) {
  $item_id[] = $result[0]; 
  $item_name[] = $result[1];
}