用户评论:

[#1]

Brian [2015-05-14 18:09:52]

Same as everyone else, I was looking for a way NOT to have to duplicate the amount of code it takes to fetch the results of a prepared statement as an associative array.

Some of the other methods didn't work as written, and this one is packaged into a simple function to reduce code repetition.

Adapted from code others have posted.

if (!$stmt->bind_param('i',$id) || !$stmt->execute()) {

throw new \Exception("Database error:$stmt->errno-$stmt->error");

}$results=fetch_assoc_stmt($stmt);$stmt->close();functionfetch_assoc_stmt(\mysqli_stmt $stmt,$buffer=true) {

if ($buffer) {$stmt->store_result();

}$fields=$stmt->result_metadata()->fetch_fields();$args= array();

foreach($fieldsAS$field) {$key=str_replace(' ','_',$field->name);// space may be valid SQL, but not PHP$args[$key] = &$field->name;// this way the array key is also preserved}call_user_func_array(array($stmt,"bind_result"),$args);$results= array();

while($stmt->fetch()) {$results[] =array_map("copy_value",$args);

}

if ($buffer) {$stmt->free_result();

}

return$results;

}functioncopy_value($v) {

return$v;

}?>

[#2]

Bruce Martin [2011-12-30 09:51:38]

I was trying to use a generic select * from table statment and have the results returned in an array. I finally came up with this solution, others have similar solutions, but they where not working for me.

if(empty($statementParams)){$statementParams.="\$column['".$field->name."']";

}else{$statementParams.=", \$column['".$field->name."']";

}

}$statment="\$stmt->bind_result($statementParams);";

eval($statment);

while($stmt->fetch()){//Now the data is contained in the assoc array $column. Useful if you need to do a foreach, or

//if your lazy and didn't want to write out each param to bind.}// Continue on as usual.?>

[#3]

denath2 at yahoo dot com [2008-05-19 00:27:21]

As php at johnbaldock dot co dot uk mentioned the problem is that the $row returned is reference and not data. So, when you write  $array[] = $row, the $array will be filled up with the last element of the dataset. To come up with this you can write the following hack:

// loop through all result rows

while ($stmt->fetch()) {

foreach( $row as $key=>$value )

{

$row_tmb[ $key ] = $value;

}

$array[] = $row_tmb;

}

[#4]

piedone at pyrocenter dot hu [2008-05-08 12:57:59]

I tried the mentioned stmt_bind_assoc() function, but somehow, very strangely it doesn't allow the values to be written in an array! In the while loop, the row is fetched correctly, but if I write $array[] = $row;, the array will be filled up with the last element of the dataset... Unfortunately I couldn't find a solution.

[#5]

Lyndon [2008-04-23 17:38:21]

This function uses the same idea as the last, but instead binds the fields to a given array.

while($field=mysqli_fetch_field($data)) {$fields[$count] = &$out[$field->name];$count++;

}call_user_func_array(mysqli_stmt_bind_result,$fields);

}// example$stmt=$mysqli->prepare("SELECT name, userid FROM somewhere");$stmt->execute();$row= array();stmt_bind_assoc($stmt,$row);// loop through all result rowswhile ($stmt->fetch()) {print_r($row);

}?>

[#6]

dan dot latter at gmail dot com [2007-08-16 12:14:55]

The following function taken from PHP Cookbook 2, returns an associative array of a row in the resultset, place in while loop to iterate through whole result set.

while($field=mysqli_fetch_field($data)) {$fields[$count] = &$out[$field->name];$count++;

}call_user_func_array(mysqli_stmt_bind_result,$fields);mysqli_stmt_fetch($this->stmt);

return (count($out) ==0) ?false:$out;

}?>

[#7]

Typer85 at gmail dot com [2006-12-27 17:55:31]

Just a side note,

I see many people are contributing in ways to help return result sets for prepared statements in ASSOSITAVE arrays the same as the mysqli_fetch_assos function might return from a normal query issued via mysqli_query.

This is done, in all the examples I have seen, by dynamically getting the field names in the prepared statement and binding them using 'variable' variables, which are variables that are created dynamically with the name of the field names.

Some thing though you should take into consideration is illegal variable names in PHP. Assume that you have a field name in your database table named 'My Field' , notice the space between 'My' and 'Field'.

To dynamically create this variable is illegal in PHP as variables can not have spaces in them. Furthermore, you won't be able to access the binded data as you can not reference a variable like so:

The only suitable solution I find now is to replace all spaces in a field name with an underscore so that you can use the binded variable like so:

All you simply have to do is before you dynamically bind the data, so a string search for any spaces in the table name, replace them with an underscore, THEN bind the variable.

That way you should not run into problems.

[#8]

php at johnbaldock dot co dot uk [2006-11-09 13:33:52]

Having just learned about call_user_func_array I reworked my fetch_assoc example. Swapping the following code makes for a more elegant (and faster) solution.

Using:

}call_user_func_array(array($stmt,'bind_result'),$columns);?>

Instead of this code from my example below:

$bindResult='$stmt->bind_result(';

while ($columnName=$meta->fetch_field()) {$bindResult.='$results["'.$columnName->name.'"],';

}$bindResult=rtrim($bindResult,',') .');';

eval($bindResult);?>

The full reworked fetch_assoc code for reference:

$mysqli= newmysqli($dbHost,$dbUsername,$dbPassword,$dbDatabase);$stmt=$mysqli->prepare('select * from foobar');$stmt->execute();$stmt->store_result();$meta=$stmt->result_metadata();

while ($column=$meta->fetch_field()) {$bindVarsArray[] = &$results[$column->name];

}call_user_func_array(array($stmt,'bind_result'),$bindVarsArray);$stmt->fetch();

echovar_dump($results);// outputs:

//

// array(3) {

//  ["id"]=>

//  &int(1)

//  ["foo"]=>

//  &string(11) "This is Foo"

//  ["bar"]=>

//  &string(11) "This is Bar"

// }?>

[#9]

php at johnbaldock dot co dot uk [2006-10-23 13:07:08]

I wanted a simple way to get the equivalent of fetch_assoc when using a prepared statement. I came up with the following:

$mysqli= newmysqli($dbHost,$dbUsername,$dbPassword,$dbDatabase);$stmt=$mysqli->prepare('select * from foobar');$stmt->execute();$stmt->store_result();$meta=$stmt->result_metadata();// the following creates a bind_result string with an argument for each column in the query

// e.g. $stmt->bind_result($results["id"], $results["foo"], $results["bar"]);$bindResult='$stmt->bind_result(';

while ($columnName=$meta->fetch_field()) {$bindResult.='$results["'.$columnName->name.'"],';

}$bindResult=rtrim($bindResult,',') .');';// executes the bind_result stringeval($bindResult);$stmt->fetch();

echovar_dump($results);// outputs:

//

// array(3) {

//   ["id"]=>

//   &int(1)

//   ["foo"]=>

//   &string(11) "This is Foo"

//   ["bar"]=>

//   &string(11) "This is Bar"

// }?>

[#10]

andrey at php dot net [2005-04-27 11:37:30]

IMPORTANT note: Be careful when you use this function with big result sets or with BLOB/TEXT columns. When one or more columns are of type (MEDIUM|LONG)(BLOB|TEXT) and ::store_result() was not called mysqli_stmt_fetch() will try to allocate at least 16MB for every such column. It _doesn't_ matter that the longest value in the result set is for example 30 bytes, 16MB will be allocated. Therefore it is not the best idea ot use binding of parameters whenever fetching big data. Why? Because once the data is in the mysql result set stored in memory and then second time in the PHP variable.

mysql stmt语法_mysqli_stmt_fetch相关推荐

  1. mysql grant 语法格式_MySQL grant 语法的详细解析

    我们今天主要向大家介绍的是MySQL grant 语法的详细解析,同时本文还介绍了其实际应用代码的介绍,希望在你今后的学习中会有所帮助. 以下的文章是MySQL grant 语法的详细解析,如果你对M ...

  2. mysql all语法怎么用_MySQL UNION 与 UNION ALL 语法与用法

    MySQL UNION 语法 MySQL UNION 用于把来自多个 SELECT 语句的结果组合到一个结果集合中.语法为:SELECT column,... FROM table1 UNION [A ...

  3. mysql的存储过程正负数的变化_《转》mysql存储过程语法及范例

    <转>mysql存储过程语法及实例 存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法------- ...

  4. Mysql常用语法总结

    Mysql常用语法总结如下: #连接mysql数据库(Dos下面) mysql -u root -p 123 #创建数据库 create database myschool; #创建表 drop ta ...

  5. mysql数据库语法_MySQL数据库语法(一)

    MySQL数据库语法 数据库管理系统(DBMS)的概述 什么是DBMS:数据的仓库 方便查询 可存储的数据量大 保证数据的完整.一致 安全可靠 DBMS的发展:今天主流数据库为关系型数据库管理系统(R ...

  6. mysql php教程,MySQL PHP语法

    MySQL PHP语法 MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP. 在这些语言中,Mysql在PHP的web开发中是应用最广泛. 在本教程中我们大部分实例都 ...

  7. mysql sqlite 语法_[Sqlite] Sqlite的基本日常SQL操作语句汇总

    序言: 嵌入式数据库Sqlite的基本sql使用汇总,使用测试起来,与关系型数据库mysql在语法上有很多的相似之处,先准备测试数据: CREATE TABLE COMPANY(ID INT NOT ...

  8. 【Mysql高级语法:视图操作】

    Mysql高级语法- view视图操作-yuweixian4230-ChinaUnix博客

  9. MySQL之语法入门与基础命令

    一.MySQL SELECT语句 SELECT语句是控制查看哪些列和行数据,具体如下: SELECT column_1, column_2, ... FROMtable_1 [INNER | LEFT ...

  10. MySQL基础语法大全(尚硅谷)

    文章目录 一.为什么要学数据库 二.数据库的相关概念 DBMS DB SQL 数据库的好处 数据库相关概念 三.数据库存储数据的特点 四.初识MySQL 1.MySQL产品的介绍和安装 2.MySQL ...

最新文章

  1. Python中range和xrange的区别
  2. windows家庭版 启用组策略
  3. LaTex 使用特殊章节符号 (§)
  4. 随机数范围扩展方法总结
  5. mac 配置java adb环境_MAC 配置android adb命令的环境变量
  6. HiveQL与SQL区别
  7. USB 设备驱动(写给自己看的)
  8. Keepalived 无法自动转换主备角色,请关注 iptables 防火墙配置
  9. Java中反射的理解
  10. win7+VS2008安装boost
  11. 学信网忘记原手机号码的解决办法
  12. 多头平仓,白糖再度下跌
  13. 实操:将C盘用户配置文件移动到非系统盘(windows10系统)
  14. Openbravo中文使用手册
  15. python爬虫之获取谷歌浏览器所有cookie
  16. 【笔记】C++ 命令行小游戏 节奏大师(别踩白块) 的制作
  17. MySQL数据库文件转化为Word表格做论文/报告
  18. 国际炒黄金策略,炒黄金要怎么炒?
  19. 让你的Android应用支持转移到SD卡
  20. PUSHmall 推贴订货商城系统 — — B2B/B2C批发零售采销模式,商贸流通企业最佳电商解决方案

热门文章

  1. 编程中怎么理解抽象的概念
  2. 通过MVC与MVP的对比,简述单一职责原则
  3. 调用阿里云的通用文字识别-高精版识别接口,识别图片中的文字详解
  4. 计算机键盘字母排列依据,键盘上的26个字母排序有什么规律吗?是怎么定的?...
  5. 【考研英语语法】一般将来时练习题
  6. 新的Steam控制器,ScummVM上的Sherlock Holmes以及更多开放游戏新闻
  7. 浅谈用户营销模型AIPL
  8. 【office】无法卸载office?
  9. JAVA 实现汉字五行笔画查询
  10. Python学习笔记2:indent expected、unindent does not match any outer indentation level