2

我对 PHP 中的 mysqli 接口有点困惑。当我昨天着手将我的旧 mysql 代码更改为 mysqli 时,文档引导我走上了::prepare,::bind_params::execute.

在我努力处理结果的过程中,我最终编写了自己的 fetch_assoc - 并且遇到了我在 SO 上讨论的问题。一位评论员询问我没有使用什么::fetch_assoc。我什至没有注意到 mysqli_result 类。当我将我的 mysqli 代码从::preapreto变形时::query,结果处理变得更加容易 - 除了一个例外:当我以前用来::bind_results提取列时,产生的 PHP 关联数组将携带正确的数据类型;当我现在使用::fetch_assocetc 时,我得到的只是一个字符串数组。

我现在正在编写一个转换器。我只是想,既然我在理解 mysqli 库时已经犯了一个主要错误,我最好在这里发帖,看看是否有一种“官方”的方式来获取类型一致的关联结果数组。

4

1 回答 1

5

如果您使用mysqlnd作为传输客户端并MYSQLI_OPT_INT_AND_FLOAT_NATIVE在 mysqli 对象上设置选项,您实际上会得到本机类型。

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());

印刷

php版本:5.3.3
数组(1){
  [“x”]=>
  整数(1) 
}

此功能已在 PHP 5.3 中添加。


为了让您开始使用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";
}

印刷

client: mysqlnd 5.0.7-dev - 091210 - $Revision: 300533 $
integer(1) string(a) 
integer(2) NULL() 
于 2010-08-26T15:13:56.087 回答