Intereting Posts
Использование jQuery .serialize () в массиве ajax для передачи PHP $ _POST в качестве переменных? Как добавить DOCTYPE в экспорт xml? Передача ключей массива и значений в строку запроса Mysql альтернатива xajax? Кодировать / сжимать последовательность повторяющихся целых чисел автозаполнение php с помощью vim Как удалить «public / index.php» в larvel, созданный url? Как добавить значения REQUEST к методу HTTP POST с помощью multipart для загрузки файла на PHP-сервер в Android? WooCommerce – пользовательские миниатюры и по умолчанию уменьшают изображение Как отображать только одну страну или конкретную область в картах Google с помощью api? Внедрить одиночный выход в simplesamlphp Каков наиболее эффективный способ подсчета всех вхождений конкретного символа в строку PHP? Эхо HTML с PHP внутри Знак вопроса Regex Невозможно сбросить запрос, чтобы показать сообщение ramdom после первого цикла WordPress

PDO: имя строки в качестве индекса массива результатов

У меня есть этот «старый стиль» запроса non-PDO MySQL (код не затягивается, чтобы точно показать, что я имею в виду):

<?php include('db_conn.php'); //Contains the connection info. $category = 'cars'; $q = "SELECT * FROM `photos` WHERE `category` = '$category'"; $qResult = mysql_query($q); $Numq = mysql_numrows($qResult); $count = 0; while ($count < $Numq) { $ThisID = mysql_result($qResult,$count,"id"); $ThisCaption = mysql_result($qResult,$count,"caption"); echo '<img src="images/'.$ThisID.'.jpg" alt="" />'; echo '<br />'.$ThisCaption.'<br /><br />'; $count++; } ?> 

Я хотел бы повторить запрос в форме PDO (который я только изучаю). Я написал это:

 <?php //I've set out the connection info format in case there's anything wrong with it... $db = new PDO('mysql:host=my_host;dbname=my_db_name;charset=UTF-8', 'db_user', 'user_password'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); //I prefer to throw PHP errors. $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $category = 'cars'; $statement = $db->prepare("SELECT * FROM `photos` WHERE `category`=?"); $statement->execute(array($category)); $statement->setFetchMode(PDO::FETCH_BOTH); while ($result = $statement->fetch()) { //$result[0] = the ID, $result[1] = the caption... echo '<img src="images/'.$result[0].'.jpg" alt="" />'; echo '<br />'.$result[1].'<br /><br />'; } ?> 

… В «старой» форме, отличной от PDO, я могу зафиксировать идентификатор и подпись, указав имя столбца. … но в форме PDO я должен указать $ result [0] и $ result [1]. … Как я могу изменить форму PDO, так что мне не нужно явно указывать («помнить»), членом которой является идентификатор, и который является заголовком и т. Д. (Как позволяет «старый» метод) ?

Вместо использования PDO::FETCH_BOTH в режиме выборки вы, вероятно, захотите использовать PDO::FETCH_ASSOC – для извлечения ваших данных в виде ассоциативного массива.

Затем вы можете получить доступ к элементам массива: $result['id'] , $result['caption'] и т. Д.

PDO поддерживает несколько интересных режимов выборки; в том числе

  • ассоциативный массив: ключи массива будут именами столбцов, возвращаемыми из базы данных; вероятно, вы привыкли к
  • объекты ; включая экземпляры указанного вами класса

Чтобы узнать, что возможно, вы можете взглянуть на разные константы PDO::FETCH_* Список можно найти здесь: Предопределенные константы .

 $statement->setFetchMode(PDO::FETCH_ASSOC); 

Указано здесь

Предполагается, что PDO::FETCH_BOTH позволяет получить доступ к результатам как к ассоциативному массиву, так и к итератору, чтобы он работал. Вы можете попробовать изменить его на PDO::FETCH_ASSOC и посмотреть, работает ли это, но также попытаться явно PDO::FETCH_ASSOC столбцы в запросе, а не использовать * .