У меня есть этот «старый стиль» запроса 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
столбцы в запросе, а не использовать *
.