【问题标题】:Morphing from mysql to mysqli从 mysql 变形为 mysqli
【发布时间】:2011-04-04 07:22:07
【问题描述】:

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

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

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

【问题讨论】:

  • 你试过 fetch_object() 或 fetch_row() 吗?
  • 我没试过。该手册对 fetch_object 说:“返回一个具有与获取的行相对应的字符串属性的对象。”没有希望...
  • 你已经实现了我对MySQLi 的一个大愿望......能够执行准备好的语句并返回一个MySQLi_Result 对象......但就目前而言,如果如果你想使用准备好的语句,你需要完全重新设计 MySQLi_Result 类来处理语句...
  • ...或者你采取下一步并使用pdo而不是mysqli,docs.php.net/pdo
  • 哈哈!我只是爱你沃尔克。我将看看 PDO 的东西。此刻我有点筋疲力尽。 24 小时内 3 次重写让我大吃一惊。无论如何,你们似乎都确认 mysqli_result 中不存在 type-congruent fetch。同时,我找到了 fetch_fields 的类型映射,并且刚刚完成了一小部分 fetch_correct 函数。这已经成功了。谢谢大家。

标签: php mysqli mysqlnd


【解决方案1】:

如果您使用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());

打印

php版本:5.3.3
数组(1){
  [“x”]=>
  int(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() 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-05
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多