2

PHPのmysqliインターフェースに少し戸惑っています。昨日、古いmysqlコードをmysqliに変更するために着手したとき、ドキュメントは私を、、およびの道に導いてくれ::prepareまし::bind_params::execute

結果に対処するための努力の中で、私は自分自身のfetch_assocを書くことになり、SOで議論した問題が発生しました。あるコメンテーターは、私が使っていないことを質問し::fetch_assocました。mysqli_resultクラスにも気づいていませんでした。mysqliコードをからにモーフィング::preapreする::queryと、結果の処理がはるかに簡単になりました。ただし、以前::bind_resultsは列を抽出していた場合、結果として得られたPHP連想配列は正しいデータ型を保持していました。代わりに::fetch_assocetcを使用すると、取得するのは文字列の配列だけです。

現在、コンバーターをコーディングしています。mysqliライブラリの理解において、すでに1つの重大なエラーを犯しているので、ここに投稿して、型が一致する連想結果配列を取得する「公式」な方法があるかどうかを確認したほうがよいと思いました。

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

プリント

phpversion:5.3.3
array(1){
  ["x"] =>
  int(1) 
}

この機能はPHP5.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 に答える