Imho trochę przekombinowana ta tabelka... tak już stron się nie robi. Ale pytanie nie o tym.
Dobra, najpierw połącznie z bazą:
function connect(): PDO
{
static $pdo;
if (!$pdo) {
$pdo = new PDO('mysql:host=localhost;dbname=nazwa_mojej_bazy;charset=utf8;', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
return $pdo;
}
Jak chcemy uzyskać tylko jeden rekord:
function getProduct(string $id): array
{
$stmt = connect()->prepare('SELECT * FROM products WHERE id = :id');
$stmt->execute(['id' => $id]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
Jak chcemy uzyskać wszystkie rekordy:
function getProducts(): Iterator
{
$stmt = connect()->query('SELECT * FROM products', PDO::FETCH_ASSOC);
foreach ($stmt as $product) {
yield $product;
}
}
W htmlu/templatce powinno wyglądać tak: (użyłem własnej, bo twoja jest nieczytelna)
<?php foreach(getProducts() as $product): ?>
<article>
<header>
<h2><?= $product['title'] ?></h2>
<p><small><?= $product['exerpt'] ?></small></p>
<p><?= $product['description'] ?></p>
</header>
<section>
<table>
<thead>
<tr><td>( Minimum zamówienie )</td><td>Cena za sztuke</td></tr>
</thead>
<tbody>
<tr><td>36</td><td><?= $product['price_1'] ?></td></tr>
<tr><td>324</td><td><?= $product['price_2'] ?></td></tr>
<tr><td>648</td><td><?= $product['price_3'] ?></td></tr>
<tr><td>1296</td><td><?= $product['price_4'] ?></td></tr>
</tbody>
</table>
</section>
<footer><span>ID: <?= $product['id'] ?></span></footer>
</article>
<?php endforeach; ?>
Wersja z mysqli:
function connect(): mysqli
{
static $mysqli;
if (!$mysqli) {
$mysqli = new mysqli('localhost', 'root', '', 'nazwa_bazy_danych');
mysqli_report(MYSQLI_REPORT_STRICT);
}
return $mysqli;
}
function getProducts(): Iterator
{
$result = connect()->query('SELECT * FROM products');
foreach ($result as $image) {
yield $image;
}
}
function getProduct(string $id): array
{
$stmt = connect()->prepare('SELECT * FROM products WHERE id = :id');
$stmt->bind_param('s', $id);
$stmt->execute();
return $stmt->get_result()->fetch_assoc();
}
Tak wyjaśniając dlaczego rzucam foreach na mysqli::query/pdo::query.
W mysqli zwraca to obiekt mysqli_result,, a w PDO PDOStatement.
Od php 5.4 mysqli_result dostał interfejst Traversable. Ten sam interfejs posiada PDOStatement.
Czyli jest iterowalny za pomocą foreach. More Info: http://php.net/manual/en/class.traversable.php