2015-07-14 5 views
0

Я могу успешно выбрать объект, но я не могу извлечь все строки из базы данных, используя следующий код, может ли кто-нибудь увидеть какие-либо очевидные ошибки?PHP PDO Fetch не работает?

$sql2 = "SELECT ID, Latitude, Longitude, Name FROM Countries"; 
    $stmt2 = $pdo->prepare($sql2); 
    $stmt2->execute(); 

    while ($row = $stmt2->fetch(PDO::FETCH_ASSOC)) { 
     echo $countryID = $row->ID; 
     echo $countryName= $row->Name; 
     echo $longitude2 = $row->Longitude; 
     echo $latitude2 = $row->Latitude; 
    } 
+0

Вы должны использовать эти массивы как: '$ row ['key']', а не '$ row-> key'. –

+0

'PDO :: FETCH_ASSOC' выбирает массив-член, который вы используете как объект, используйте' PDO :: FETCH_OBJ' или меняете '$ row-> ID' на' $ row ['ID'] '. Там также нет параметров в вашем запросе, вам не нужно «готовить» его, если это действительно жестко запрограммированная строка запроса –

ответ

1

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

while ($row = $stmt2->fetch(PDO::FETCH_ASSOC)) { 
     echo $countryID = $row['ID']; 
     echo $countryName= $row['Name']; 
     //Rest of the code 

    } 
+0

Ahhh arrays - спасибо, ответит, когда смогу – Frog82

+0

Добро пожаловать @ Frog82 !! наслаждаться . Кто дал нисходящий голос, по крайней мере, посмел бы дать разум. – Saty

+0

@Saty: Я подозреваю, что -1 - это потому, что, если принять его буквально, ваш ответ можно считать неправильным (_ «Так что вы можете получить массив, а не объект» _ можно было бы считать «PDO :: FETCH_OBJ» не существует). Еще одна причина, по которой вы можете проголосовать за то, что вам не удалось решить другие (менее очевидные) проблемы, такие как бессмысленный вызов «PDO :: подготовить» и избыточные назначения ('echo $ countryID = $ row ['ID'];' vs ' echo $ row ['ID']; '). Я просто догадываюсь здесь, хотя, видя, что я не проголосовал, но я тоже нелюбовь к голосованию без комментариев, объясняющих почему. –

1

Вы должны понимать, что PDO::FETCH константы на цели. И если вы хотите использовать объектную нотацию, вы должны указать PDO::FETCH_OBJ вместо ...ASSOC.

Во всяком случае, PDO::FETCH_LAZY должен быть наиболее предпочтительным способом, так как это позволит использовать ЛЮБОЕ обозначение:

while ($row = $stmt2->fetch(PDO::FETCH_LAZY)) { 
    echo $row->ID; // all 
    echo $row['ID']; // three 
    echo $row[0];  // works 
} 

с еще меньшими затратами памяти, чем любой другой метод. На самом деле, без лишних затрат памяти.

+0

Не уверен в том, что «меньше памяти накладные расходы» _ часть вашего ответа. Вы проверили реализацию и сравнили накладные расходы? Если да, то как? Экземпляр «PDORow» он возвращает [имеет довольно много обработчиков] (https://github.com/php/php-src/blob/4a2e40bb861bc3cf5fb6863e57486ed60316e97c/ext/pdo/pdo_stmt.c#L2664) ... Или вы ссылаетесь накладные расходы памяти, вызванные использованием всех возможных обозначений, и в этом случае я согласен, но у обработчиков есть некоторые (незначительные/микрооптимируемые) накладные расходы –

Смежные вопросы