php, phpmyadmin. Проблема с базой данных

105
02 декабря 2020, 17:30

У меня есть index.php, db.php и база данных. Проблема вот такая: при выводе статей из базы данных, на сайт из базы выводится только последнее имя для всех имен в выборке. То есть, у меня есть четыре имени Иван, Петр, Николай, Владимир. Выводит информацию о Владимире для всех статей.

Вот мой код:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="css/style.css">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
</head>
<body>
<?php require "db.php" ?> 
<?php
      $singles = get_singles_all();
      foreach ($singles as $single):
    // $author = get_author_by_id();
    // foreach ($author as $authors):

       ?>

      <?php //$author_name = get_author_by_id($single["author_id"]); ?>
        <div id="wrapper">
          <div class="headline-block">
            <img src="img/test.jpg" alt="">
            <p class="category"><?php echo $authors["author_name"]; ?></p>
            <h3><?php echo $single["title"]; ?></h3>
            <p><?php echo $single["text"]; ?></p>
            <i class="fas fa-user"></i><a class="author" href="#"><?php echo $single["author_id"]; ?></a>
            <i class="far fa-calendar-alt"></i><a class="date" href="#">12.12.2019</a>
            <i class="far fa-eye"></i><a class="views" href="#"><?php echo $single["views"]; ?></a>
            <i class="fas fa-comment"></i><a class="comments" href="#"><?php echo $single["comments"]; ?></a>
       </div>

<?php
    $dbhost = "localhost";
    $dbname = "test_saneto";
    $username = "root";
    $password = "alex123crime";
    $db = new PDO("mysql:host=$dbhost; dbname=$dbname", $username, $password); // Подключение к БД
    // Получение всех статей
    function get_singles_all() {
        global $db;
        $singles = $db -> query("SELECT * FROM single");
        return $singles;
    }
  // Получение названия категории по ее id
    function get_author_by_id() {
        global $db;
        $author = $db->query("SELECT * FROM authors");
        return $author;
    }
    $author = get_author_by_id();
    foreach ($author as $authors):
    // for($i = 0; $i <= count($authors); $i++) {
    //  echo $authors[$i];
    // }
?>
<?php endforeach; ?>

Answer 1

Кратко пересказываю букварь по базам данных и работе с ними из пхп.

  • База данных - это не набор счетных палочек. Кроме запросов SELECT * FROM table бывают еще и другие. Например, с условием WHERE. Которые позволяют выбрать нужную запись сразу, не перебирая все палочки по одной. Это особенно бывает полезно, когда количество палочек перваливает за сотни тысяч.
  • Для запросов, в которых используются переменные, необходимо исользовать prepare/execute в PDO

Поэтому если переписывать get_author_by_id буквально, то это должно быть так

function get_author_by_id($id) {
    global $db;
    $stmt = $db->query("SELECT * FROM authors WHERE id=?");
    $stmt->execute([$id]);
    return $stmt->fetch();
}

Но на самом деле здесь нужен только один запрос, который использует JOIN

Answer 2

У вас endforeach в db.php и по коду он раньше foreach:

READ ALSO
Как уменьшить нагрузку на веб сервер

Как уменьшить нагрузку на веб сервер

Имеется php скрипт который в цикле выполняет поиск записей по БД и запускается кроном каждую минутуОдна итерация цикла проходит примерно...

120
Google recaptcha

Google recaptcha

Как сделать обьязательным поле google recaptcha? Например если пользователь не прошел капчу то кнопка отправить не работает

103