Я немного озадачен интерфейсом mysqli в PHP. Когда вчера я отправил вчера свой старый код mysql в mysqli, документы меня направили по пути ::prepare
, ::bind_params
и ::execute
.
В моих попытках справиться с результатами я закончил писать свой собственный fetch_assoc – и у меня были проблемы, о которых я говорил в SO. Один комментатор спросил, что я не использовал ::fetch_assoc
. Я даже не заметил класс mysqli_result. Когда я изменил свой код mysqli из ::preapre
to ::query
, обработка результатов стала намного проще – за одним исключением: когда ранее я использовал ::bind_results
для извлечения столбцов, полученный ассоциативный массив PHP привел бы к правильным типам данных ; когда вместо этого я теперь использую ::fetch_assoc
т. д., все, что я получаю, это массив строк.
Теперь я кодирую конвертер. Я просто подумал, что, поскольку я уже совершил одну кардинальную ошибку в моем понимании библиотеки mysqli, мне лучше разместить здесь, чтобы узнать, существует ли «официальный» способ получения конгруэнтных ассоциативных массивов результатов.
Благодарю.
http://docs.php.net/mysqli-result.fetch-assoc говорит:
Возвращает ассоциативный массив строк, представляющих выбранную строку в наборе результатов
update: «Назад к :: prepare и :: execute. Я просто не верю в это … ;-)» – И вы правы!
Если вы используете 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) { [ "Х"] => INT (1) }
Не нашли его в руководстве, поэтому вы можете проверить, когда этот параметр был добавлен в ext / mysqli / mysqli.c
edit: он появился здесь впервые: 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"; }
печать
client: mysqlnd 5.0.7-dev - 091210 - $Revision: 300533 $ integer(1) string(a) integer(2) NULL()