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



这是Apache 2.2.23,PHP 7和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;
}
}

查询函数用于以下显示函数。这仅仅是为了显示n个最近发布的博客文章链接,同时交替css背景颜色属性:

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

当我运行 blog_article_links(( 函数时,不会抛出任何错误,也不会显示$ex。当我在 blog_article_links(( 中使用 var_dump(( 时,我得到以下结果:

" ["blog_description"]=> string(46) "Lorem Ipsum Delta Theda Alpha Omega Pizza Pie." [2]=> string(46) "Lorem Ipsum Delta Theda Alpha Omega Pizza Pie." ["blog_date"]=> string(10) "2017-08-10" [3]=> string(10) "2017-08-10" } }

我在 fetchAll(( 方法中使用了各种不同的参数,包括 PDO::FETCH_NUM,明确使用默认的 PDO::FETCH_BOTH,甚至曾经使用 PDO::FETCH_ASSOC 只是为了它,看看会有什么变化。

这些都没有创造我需要的结果。我认为这与

FROM blog WHERE published = 1 ORDER BY blog_id DESC LIMIT :quantity;

查询的一部分。我认为PDO搞砸了,因为PDO不知道如何处理ORDER BY和DESC LIMIT关键字。

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

此外,connectBlogDatabase(( 使用的数据库用户只有 SELECT、INSERT、UPDATE 和 DELETE 权限。

blog_article_links函数中调用$articles = getMostRecentArticles($quantity);时,$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;
}
}

帮助程序函数格式化并输出单个文章

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 篇博客文章存储在数据库中。我插入了第三篇博客文章并刷新了网页。成功了。

这就是我所要做的全部工作,但这仍然不能解释它以前没有显示在浏览器的开发人员视图中的事实。

最新更新