2017-02-14 6 views
-3

Я новичок в PDO и не могу помещать результаты извлечения в массив.MYSQL/PHP: создать массив с использованием FetchAll с PDO

Следующий код преуспевает в запросе базы данных. Тем не менее, я хотел бы поместить результаты в массив, чтобы затем я мог работать с элементами массива индивидуально. Я не уверен, что именно $result ниже. Это уже массив? Или что это? Я думаю, мне нужно использовать fetchAll, чтобы получить массив. Если да, то оценил бы правильный код для этого. Или если $results ниже - это уже массив, то в чем разница между тем и тем, что я получил бы с fetchAll?

//USE PDO TO CONNECT TO DBASE 
$hostdb = "my host"; 
$namedb = "mydb"; 
$passdb = "bypass"; 
$userdb = "myusername"; 

try { 
    // Connect and create the PDO object 
    $conn = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb); 
    $conn->exec("SET CHARACTER SET utf8");  // Sets encoding UTF-8 

    // Define and perform the SQL SELECT query 
    $sql = "SELECT * FROM `comments` WHERE `userid` IN(118)"; 
    $result = $conn->query($sql); // THIS WORKS 
// $result = $sql->fetchAll(PDO::FETCH_OBJ); //THIS DOES NOT WORK 
    if($result !== false) { 

    // Parse the result set 
    foreach($result as $row) { 
     echo $row['id']. ' - '. $row['name']. ' - '. $row['category']. ' - '. $row['link']. '<br />'; 
    } 
    } 

    $conn = null;  // Disconnect 
} 
catch(PDOException $e) { 
    echo $e->getMessage(); 
} 
+1

Он возвращает объект, но вы можете перебрать либо объект или array.For fetchall вам нужно подготовить с казнить, RTFM.Didnt downvote вас BTW – Mihai

+1

fetchAll возвратит полный resultset в переменную. Эта переменная представляет собой массив, один случай для каждой строки в наборе результатов. В зависимости от параметра, который вы используете в fetchAll, он будет массивом массивов строк или массивом объектов строки. – RiggsFolly

+0

\ PDO :: FETCH_ASSOC и \ PDO :: FETCH_NUM позволяют вам определять режим выборки. \ PDO :: FETCH_ASSOC вернет только массив field => value, в то время как \ PDO :: FETCH_NUM возвращает массив с числовыми клавишами – bxN5

ответ

1

fetchAll вернет полный набор результатов в переменную. Эта переменная представляет собой массив, один случай для каждой строки в наборе результатов. В зависимости от параметра, который вы используете в fetchAll, это будет массив массивов строк или массив массивов строк.

Но у вас есть несколько маленькой ошибки в вашем синтаксисе

// Define and perform the SQL SELECT query 
$sql = "SELECT * FROM `comments` WHERE `userid` IN(118)"; 

$result = $conn->query($sql); 
if($result !== false) { 

    // use $result here as that you PDO::Statement object 
    $allRows = $result->fetchAll(PDO::FETCH_OBJ); 

    // Parse the result set 
    foreach($allRows as $row) { 
     // also amend here to address the contents of the allRows i.e. $row as objects 
     echo $row->id. ' - '. $row->name. ' - '. $row->category. ' - '. $row->link. '<br />'; 
    } 
+0

Это имеет смысл. И это не вызывает ошибок. Однако $ allRows кажется пустым, как итерационным, так и в вашем коде, или с использованием print_r. В исходном коде он повторил около 10 строк, чтобы он не был пустым. – zztop

+0

У меня было typo '$ row> name' должно быть '$ row-> name', это так просто? – RiggsFolly

+0

Да, заработал. Большое спасибо! – zztop

0

Прежде всего, чтобы быть уверенными, что $result является использование var_dump($result) поскольку PDO::query метод возвращает объект PDOStatement. Кроме того, в вашем случае это не массив, это объект PDOStatement. См. http://php.net/manual/en/pdo.query.php. Впоследствии я предлагаю использовать методы PDO::prepare() и PDO::execute() для запуска SQL-запроса, так как он удобен для работы, особенно если вы собираетесь запускать его несколько раз и безопаснее, не допуская от SQL-инъекций. См. http://php.net/manual/en/pdo.prepare.php. И в конце концов, PDO::fetchAll() вернет массив вашего результирующего набора, который вы уже хотите. Обратитесь к руководству по PHP PDO::fetchAll(). Так что я хотел бы сделать это:

$sql = "SELECT * FROM `comments` WHERE `userid` IN(118)"; 

$statement = $conn->prepare($sql); 
if($statement->execute()) 
{ 
    $results = $statement->fetchAll('Your prefered fetch style'); 

    foreach($results as $result) { 
     ... 
    } 
} 

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

  • Нет связанных вопросов^_^