What I am trying to do is get back the 5 recent announcements in my announcements table. After that, I am trying to separate the announcementText
column data into another array with each row in its own index, and for each index, I would like to echo that out on the HTML page. The code, however, does a weird split of the row data. Sometimes it’s one character per index, and sometimes multiple characters, but it’s never the whole message. The table schema is as follows:
announcement_id int(11) NOT NULL PRIMARY_KEY auto_increment
announcementText text NOT NULL
announcementDate date NOT NULL
The result I get from the final array (varies depending on announcement):
array(3) {
[0]=> NULL
[1]=> string(1) "h"
[2]=> string(1) "2"
}
The result I get from the database:
array(3) {
["announcement_id"]=> int(2)
["announcementText"]=> string(163) "here is some text. kajshdflkjashdflkajshdflkjashdflkjashdflkjahsdfkjahsdfkjhaslkdjfhalkjsdfhakljsdfhlaksjdfhlkasjdfhlkasjdfgkasdfkasdfkasdfaksjdhfkasjdhfkjasdhfhkj"
["announcementDate"]=> string(10) "2020-10-07"
}
What I expected is to have the announcement show correctly in its entirety.
Here is my code so far:
$getRecentAnnouncements = "SELECT * FROM announcements ORDER BY announcementDate DESC LIMIT 5";
$getRecentAnnouncements = $pdo->prepare($getRecentAnnouncements);
if ($getRecentAnnouncements->execute()) {
$announcements = $getRecentAnnouncements->fetch(PDO::FETCH_ASSOC);
//var_dump($announcements);
$announcementsText = array();
foreach ($announcements as $announcement) {
array_push($announcementsText, $announcement[0]);
}
var_dump($announcementsText);
foreach ($announcementsText as $announcement) {
echo '
<div class="jumbotron" style="background-color: #3d94ff; color: white; padding-bottom: 3vh; width: 95vw;">
<h1 class="display-4">REPLACE WITH DATE</h1>
<hr class="my-4">
<div class="lead announcement">
'.$announcement.'
</div>
</div>
';
}
}
Advertisement
Answer
You’re using PDO’s fetch()
(which only returns one single record) instead of fetchAll()
(which returns all matched records).
Try doing something like this:
if ($getRecentAnnouncements->execute()) {
// Here we're using fetchAll() to get all records
$announcements = $getRecentAnnouncements->fetchAll(PDO::FETCH_ASSOC);
$announcementsText = array();
foreach ($announcements as $announcement) {
// Let's put the HTML directly here. No need for an extra array
?>
<div class="jumbotron" style="background-color: #3d94ff; color: white; padding-bottom: 3vh; width: 95vw;">
<h1 class="display-4">REPLACE WITH DATE</h1>
<hr class="my-4">
<div class="lead announcement">
<?php
// We're fetching the records as assoc so use the column name to get the value
echo $announcement['announcementText'];
?>
</div>
</div>
<?php
}
}
As you can see in the above code, I removed the $announcementText
-array and one of the foreach, since they basically just iterate through the same data.
Note: I also changed how the HTML is outputted. I tend to recommend against echoing a bunch of HTML through PHP since it makes it much harder to debug (no syntax highlighting in PHP strings, for example.)