PDO - Fetch Assoc in a 'while' loop


PDO - Fetch Assoc in a 'while' loop

我试图在while循环内回显一点html。我正在用PDO和PDO_ASSOC获取我的东西。

这是我的:

$stmt = $this->conn->prepare('SELECT * FROM books');
$stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
    $book_id = $row['id'];
    $book_title = $row['title'];
    $book_image = $row['image'];
    $book_amz = $row['amazon'];
    $book_desc = $row['description'];
    $book_rating = $row['rating'];
    $book_date = $row['date'];
    $book_author = $row['author'];
    $book_categorie = $row['categorie'];
    $text = "ID: ' . $book_id . '";
 }
 return $text;

但是它只给我表的一行。我甚至试过fetchAll,但它什么也没给我。

所以假设唯一看到的元素是最后一个元素,这是因为您返回的内容在每个循环中都被覆盖。有几个选项可以解决这个问题。最简单的是:

$stmt = $this->conn->prepare('SELECT * FROM books');
$stmt->execute();
$text = "";
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
    $book_id = $row['id'];
    $book_title = $row['title'];
    $book_image = $row['image'];
    $book_amz = $row['amazon'];
    $book_desc = $row['description'];
    $book_rating = $row['rating'];
    $book_date = $row['date'];
    $book_author = $row['author'];
    $book_categorie = $row['categorie'];
    //String concatenation of text will 
    //give you one big string at the end to return.   
    $text .= "ID: '{$book_id}'";
}
return $text;

然而,这将不能很好地与你真正的引导html。你需要确保列相加正确。

你需要一些更直观的东西

使用实际代码,它看起来像

$stmt = $this->conn->prepare('SELECT * FROM books');
$stmt->execute();
$bookEcho = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    $bookEcho[] = '<div class="col-md-3">
                   <div class="thumbnail">
                   <span>' . $book_title . '</span>
                   <img src="' . $book_image . '">
                   <div class="book-options">
                   <span>Bewertung</span><br/>
                   ' . $stars . '
                   <a href="books.php?id=' . $book_id . '" class="btn btn-read btn-block">Jetzt lesen</a>
                   </div>
                   </div>
                   </div>';
}
return $bookEcho;

现在在你的函数中,不管它是什么,你可以这样做(这不是我写过的最优雅的东西,但应该能完成工作):

$cols = 4;
$colCount = 1;
foreach ($bookEcho as $book){
    if($colCount == 0){//create a row}
    echo $book;
    $coolCount++;
    if($colCount == 0){end a row}
    if($colCount == 4){ $colCount = 0;}
}

问题是你在while循环中重写了你的值。对数据库中的每个条目执行一次循环,但只返回最后一个条目。相反,您可以使用数组:

$stmt = $this->conn->prepare('SELECT * FROM books');
$stmt->execute();
$books = [];
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
    $book['id'] = $row['id'];
    $book['title'] = $row['title'];
    $book['image'] = $row['image'];
    $book['amz'] = $row['amazon'];
    $book['desc'] = $row['description'];
    $book['rating'] = $row['rating'];
    $book['date'] = $row['date'];
    $book['author'] = $row['author'];
    $book['categorie'] = $row['categorie'];
    $book['text'] = "ID: ' . {$book['id']} . '"; // << Not sure if this is what you actually want. If not, adjust accordingly.
    // Append the above values to the $books array
    $books[] = $book;
}
return $books;

使用foreach:

$books = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($books as $book){
    $book_id = $book['id'];
    $book_title = $book['title'];
    // ...
}