Php PDO的fetchAll()方法返回查询请求的列的一半。没有引发异常

Php PDO的fetchAll()方法返回查询请求的列的一半。没有引发异常,php,mysql,pdo,Php,Mysql,Pdo,这是Apache2.2.23、PHP7和MySQL 5.6.32提供的。托管环境是一个Bluehost共享托管Web服务器 以下是数据库连接功能: function connectBlogDatabase() { $server = 'localhost'; $dbname = 'database_name'; $username = 'database_user'; $password = '1234'; $dsn = 'mysql:host=' . $server . ';dbname='

这是Apache2.2.23、PHP7和MySQL 5.6.32提供的。托管环境是一个Bluehost共享托管Web服务器

以下是数据库连接功能:

function connectBlogDatabase() {
$server = 'localhost';
$dbname = 'database_name';
$username = 'database_user';
$password = '1234';
$dsn = 'mysql:host=' . $server . ';dbname=' . $dbname;
$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
try {
    $link = new PDO($dsn, $username, $password, $options);
} catch (Exception $ex) {
    $_SESSION['error'] .= $ex;
}
return $link;
}
function getMostRecentArticles(int $quantity){
$connection = connectBlogDatabase();
try{
    $sql = "SELECT blog_title, blog_body, blog_description, blog_date FROM blog WHERE published = 1 ORDER BY blog_id DESC LIMIT :quantity;";
    $stmt = $connection->prepare($sql);
    $stmt->bindParam(':quantity', $quantity, PDO::PARAM_INT);
    $stmt->execute();
    $blogs = $stmt->fetchAll();
    $stmt->closeCursor();
    return $blogs;
} catch (Exception $ex) {
    echo $ex;
    $_SESSION['error'] .= "ERROR: Caught Exception \$ex";
    return FALSE;
}
}
以下是查询功能:

function connectBlogDatabase() {
$server = 'localhost';
$dbname = 'database_name';
$username = 'database_user';
$password = '1234';
$dsn = 'mysql:host=' . $server . ';dbname=' . $dbname;
$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
try {
    $link = new PDO($dsn, $username, $password, $options);
} catch (Exception $ex) {
    $_SESSION['error'] .= $ex;
}
return $link;
}
function getMostRecentArticles(int $quantity){
$connection = connectBlogDatabase();
try{
    $sql = "SELECT blog_title, blog_body, blog_description, blog_date FROM blog WHERE published = 1 ORDER BY blog_id DESC LIMIT :quantity;";
    $stmt = $connection->prepare($sql);
    $stmt->bindParam(':quantity', $quantity, PDO::PARAM_INT);
    $stmt->execute();
    $blogs = $stmt->fetchAll();
    $stmt->closeCursor();
    return $blogs;
} catch (Exception $ex) {
    echo $ex;
    $_SESSION['error'] .= "ERROR: Caught Exception \$ex";
    return FALSE;
}
}
查询功能用于以下显示功能。这只是为了在交替使用css背景色属性的同时显示n个最近发布的博客文章链接:

function blog_article_links($quantity){
//get a list of the $quantity most recently written blog articles
$articles = getMostRecentArticles($quantity);
$i = 1;
do{
    if($i % 2 === 0){
        //even numbered blog post
        echo "<li class='blog-nav-li flex-box-blog-link background-
1'>";
    } else{
        echo "<li class='blog-nav-li flex-box-blog-link background-
2'>";
    }
    echo "<a class='nav-article-link' 
href='view/blog_template.php'>";
    echo "<h4 class='nav-article-header'>" . $articles['blog_title'] 
. "</h4>";
    echo "<p class='nav-article-description'>" . 
$articles['blog_description'] . "</p>";
    echo "<footer class='article-footer'>";
    echo "<div class='article-footer-social'>";
    echo "<a class='twitter-share-button tweet' 
href='https://twitter.com/intent/tweet'>Tweet</a>";
    echo "</div><!-- facebook share button-->";
    echo "<div class='fb-share-button fb-share' data-
href='https://developers.facebook.com/docs/plugins/' data-
layout='button' data-size='small' data-mobile-iframe='true'><a 
class='fb-xfbml-parse-ignore' target='_blank' 
href='https://www.facebook.com/sharer/sharer.php
u=https%3A%2F%2Fdevelopers.facebook
.com%2Fdocs%2Fplugins%2F&amp;src=sdkpr
eparse'>Share</a></div>";
    echo "<time datetime='".$articles["blog_date"] . "' 
class='article-footer-date'>" . $articles['blog_date'] . "</time>";
    echo "</footer></a></li>";
    $i += 1;
}while($i <= $quantity);
}
我在fetchAll方法中使用了各种不同的参数,包括PDO::FETCH_NUM,显式地使用默认的PDO::FETCH_两者,甚至有一次使用PDO::FETCH_ASSOC只是为了见鬼,看看会发生什么变化

这些都没有产生我需要的结果。我想这和我的工作有关

FROM blog WHERE published = 1 ORDER BY blog_id DESC LIMIT :quantity;
查询的一部分。我认为PDO搞砸了,因为PDO不知道如何处理ORDERBY和DESC LIMIT关键字

现在我知道了一个事实,connectBlogDatabase函数可以工作。还有另一个查询函数对其PDO对象使用相同的connectBlogDatabase函数,该函数返回预期结果

此外,connectBlogDatabase使用的数据库用户只有选择、插入、更新和删除权限。

当您调用$articles=getMostRecentArticles$quantity;在blog\u article\u links函数中,$articles获取$stmt->fetchAll的值;该函数中的表达式

$articles将是一个多维数组,其中每个内部数组都是查询结果中的一行。因此,当您执行$articles['blog_title']、$articles['blog_description']等操作时,这些都是未定义的索引

有不同的方法来解决这个问题。一种方法是将blog_article_links函数分为两个函数,一个用于打印单个文章,另一个用于迭代从数据库返回的列表,并为每个函数调用单个输出函数

获取列表并用一个函数输出它

function blog_article_links($quantity) {
    //get a list of the $quantity most recently written blog articles
    $articles = getMostRecentArticles($quantity);
    $i = 1;
    foreach ($articles as $article) {
        if ($i % 2 === 0){
            //even numbered blog post
            echo "<li class='blog-nav-li flex-box-blog-link background-1'>";
        } else {
            echo "<li class='blog-nav-li flex-box-blog-link background-2'>";
        }
        blog_article_link($article);
        echo "</li>";
        $i += 1;
    }
}
helper函数格式化并输出单个项目

function blog_article_link($article) {
    echo "<a class='nav-article-link' href='view/blog_template.php'>
          <h4 class='nav-article-header'>$article[blog_title]</h4>
          <p class='nav-article-description'>$article[blog_description]</p>
          <footer class='article-footer'>
              <div class='article-footer-social'>
                  <a class='twitter-share-button tweet' href='https://twitter.com/intent/tweet'>Tweet</a>
               </div>
               <!-- facebook share button-->
               <div class='fb-share-button fb-share' data-href='https://developers.facebook.com/docs/plugins/' data-layout='button' data-size='small' data-mobile-iframe='true'>
                   <a class='fb-xfbml-parse-ignore' target='_blank' href='https://www.facebook.com/sharer/sharer.php u=https%3A%2F%2Fdevelopers.facebook.com%2Fdocs%2Fplugins%2F&amp;src=sdkpreparse'>
                       Share
                   </a>
               </div>
               <time datetime='$article[blog_date]' class='article-footer-date'>
                   $article[blog_date]
               </time>
           </footer>
       </a>";
}

我找到了正确的方法,但我还是不知道为什么一开始就出了问题

数据库中只存储了2篇博客文章。我插入了第三篇博客文章并刷新了网页。成功了


这就是我所要做的,但这仍然不能解释它以前没有出现在浏览器的开发者视图中的事实。

So echo;是否缺少内容?仅供参考,$ex将是一个对象,而不是字符串。要从异常对象获取错误消息,请执行$ex->getMessage@PatrickQ仅回显对象仍将回显避免放置;在PDO查询中。这仅在MySQL命令行上是必需的,它需要知道查询的结束位置。$articles['blog_title']等。blog_article_links函数中的$articles似乎不应该工作$冠词是一个行数组,而不是一行,对吗?