【问题标题】:PDO - Fetch Assoc in a 'while' loopPDO - 在“while”循环中获取 Assoc
【发布时间】:2016-08-23 19:13:48
【问题描述】:

我正在尝试在 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,但它什么也没给我。

【问题讨论】:

  • 可能是代码在循环的第一次迭代后由于最后的语法错误而失败。检查您的错误日志。
  • 这个$text = 'ID: ' . $book_id . '; 应该是$text = 'ID: ' . $book_id;。不确定这是不是问题,但似乎是一个不错的猜测
  • 不抱歉,这只是打字错误。我的代码中没有。
  • 这仍然不正确 $text = "ID: ' . $book_id . '"; 应该是 $text = "ID: '" . $book_id ."'";$text = "ID: '{$book_id}'";
  • 这是我实际代码中的内容:pastebin.com/02JwDwKu

标签: php mysql pdo


【解决方案1】:

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

$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;}
}

【讨论】:

  • 我想是这样,但使用它时您会遇到一些布局问题。字符串比数组更难解析。虽然我会延迟查看详细信息,直到您返回启动此功能的功能。
  • 现在我没有任何布局问题。我会接受这个,然后看看如果我有更多条目会发生什么。谢谢
【解决方案2】:

问题是您在 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;

【讨论】:

  • 感谢您的回答。真的很感激。但它只给了我“数组”。我删除了 { } 因为它给了我一个错误(意外的 {)
  • 如果你试图回显一个数组,那是行不通的。您将需要使用array functions 之一。
  • 另外,这似乎不是 PHP 语法错误(请参阅 3v4l.org/USuCX)。我不确定你以后用这个字符串做什么,但也许这就是导致错误的原因。
【解决方案3】:

使用foreach

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

【讨论】:

  • 也试过了,也只给了我一排。是的,我有 2 个条目。不过谢谢
  • 这是一个无法解决问题的结构性变化:反复踩踏相同的变量而不使用它们。
  • 道歉。我的意图是提供一个解决方案。虽然这是一个不同的控制结构,但我的目标是提供一些帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多