Морфинг от mysql до mysqli

Я немного озадачен интерфейсом 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, мне лучше разместить здесь, чтобы узнать, существует ли «официальный» способ получения конгруэнтных ассоциативных массивов результатов.

Благодарю.

Solutions Collecting From Web of "Морфинг от mysql до 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()