PHP-将_结果绑定到数组
我正在使用一个准备好的语句来执行一个返回多个结果的查询,我希望在一个数组中包含这些结果。但是bind_result不能用于数组,所以我是这样做的: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
$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];
}