我对 PHP 中的 mysqli 接口有点困惑。当我昨天开始将旧的 mysql 代码更改为 mysqli 时,文档引导我走上了::prepare
,::bind_params
和::execute
.
在我努力处理结果的过程中,我最终编写了自己的 fetch_assoc - 并且遇到了我在 SO 上讨论的问题。一位评论员质疑我没有使用::fetch_assoc
. 我什至没有注意到 mysqli_result 类。当我将我的 mysqli 代码从 变形::preapre
为 时::query
,结果处理变得容易得多——只有一个例外:当我以前用来::bind_results
提取列时,结果的 PHP 关联数组将携带正确的数据类型;当我现在使用::fetch_assoc
etc 时,我得到的只是一个字符串数组。
我现在正在编写一个转换器。我只是想,因为我在理解 mysqli 库时已经犯了一个主要错误,我最好在这里发帖看看是否有一种“官方”方式来获取类型一致的关联结果数组。
谢谢。
http://docs.php.net/mysqli-result.fetch-assoc说:
返回表示结果集中获取的行的字符串关联数组
更新:“回到 ::prepare 和 ::execute。我只是不相信......;-)” - 你是对的!
如果您使用mysqlnd作为传输客户端并在 mysqli 对象上设置选项 MYSQLI_OPT_INT_AND_FLOAT_NATIVE,您实际上将获得本机类型。
echo 'phpversion: ', phpversion(), "\n";
$m = new mysqli('localhost', 'localonly', 'localonly', 'test');
$m->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, true);
$m->query('CREATE TABLE soTest (x int)');
$m->query('INSERT INTO soTest (x) VALUES (1),(2)');
$r = $m->query('SELECT x from soTest');
var_dump($r->fetch_assoc());
Run Code Online (Sandbox Code Playgroud)
印刷
php版本:5.3.3 数组(1){ ["x"]=> 整数(1) }
手册中没有找到,所以你可能想检查一下这个选项是什么时候添加到ext/mysqli/mysqli.c
编辑:它第一次出现在这里:http : //svn.php.net/viewvc/ php/php-src/trunk/ext/mysqli/mysqli.c?r1=263494&r2=266352
要让您开始使用PDO(您是否应该选择使用它):
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// the pdo_mysql driver uses emulated prepared statements by default
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// afaik only the mysqlnd client supports native types, with libmysql you'll get only strings/null
echo 'client: ', $pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), "\n";
// set up test environment
$pdo->exec('CREATE TEMPORARY TABLE soTest (x int, y varchar(16))');
$pdo->exec("INSERT INTO soTest (x,y) VALUES (1,'a'),(2,null)");
// statement with positional parameter
$stmt = $pdo->prepare('SELECT x,y FROM soTest WHERE x>?');
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute( array(0) );
foreach( $stmt as $row ) {
foreach( $row as $col ) {
echo gettype($col), '(', $col, ') ';
}
echo "\n";
}
Run Code Online (Sandbox Code Playgroud)
印刷
client: mysqlnd 5.0.7-dev - 091210 - $Revision: 300533 $
integer(1) string(a)
integer(2) NULL()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
868 次 |
最近记录: |