Метод PDO fetchAll () возвращает половину столбцов, которые запрашивает запрос. Не исключение брошено

Это с Apache 2.2.23, PHP 7 и MySQL 5.6.32. Среда размещения — это веб-сервер хостинга Bluehost.

Вот функция подключения к базе данных:

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 background-color:

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 не отображается. Когда я использую var_dump () внутри blog_article_links (), я получаю следующее:

" ["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 () работает. Есть другая функция запроса, использующая эту же функцию connectBlogDatabase () для своего объекта PDO, и эта функция возвращает ожидаемые результаты.

Кроме того, пользователь базы данных, используемый connectBlogDatabase (), имеет только разрешения SELECT, INSERT, UPDATE и DELETE.

2

Решение

Когда вы звоните $articles = getMostRecentArticles($quantity); в вашем blog_article_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;
}
}

Вспомогательная функция форматирует и выводит одну статью

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>";
}
0

Другие решения

Я понял, как сделать это правильно, но я все еще не знаю, почему это пошло не так, во-первых.

У меня только 2 статьи блога хранятся в базе данных. Я вставил третью статью в блог и обновил веб-страницу. Это сработало.

Это все, что я должен был сделать, но это все еще не объясняет тот факт, что он ранее не отображался в представлении разработчика в браузере.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector