За последние 24 часа нас посетили 17996 программистов и 1648 роботов. Сейчас ищут 1844 программиста ...

вывести текст из базы в тело документа

Тема в разделе "PHP и базы данных", создана пользователем dmitrij.buck, 9 мар 2018.

  1. dmitrij.buck

    dmitrij.buck Новичок

    С нами с:
    9 мар 2018
    Сообщения:
    15
    Симпатии:
    0
    Добрый день, начал вникать в тему практически с нуля. подскажите правильно ли организованно соединение с БД, корректно ли сформирован запрос?и как вывести результат запроса в выделенную конструкцию php(<div class="content">php</div> ) в теле документа в виде текста.
    apache 2.4 mysql 5.7 php7 phpmyadmin 4.7.8

    //blocks/bd.php
    <?php
    $host = 'localhost'; // адрес сервера
    $database = 'nails'; // имя базы данных
    $user = 'Admin'; // имя пользователя
    $password = '123456'; // пароль
    ?>
    // подключаем скрипт
    require_once 'blocks/bd.php';

    // подключаемся к серверу
    $link = mysqli_connect($host, $user, $password, $database)
    or die("Ошибка " . mysqli_error($link));

    $query ="SELECT title,meta_d,meta_k,text FROM settings WHERE 'page'='index'";
    $result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));

    // закрываем подключение
    mysqli_close($link);



    <td><table width="1500" border="0" border-bottom="1" class="content"> <!--Таблица контента и ссылка на статьи -->
    <tr>
    <td width="1197" height="400" valign="top">
    <div class=”contents”>

    <?php
    while ($result = mysql_fetch_array($query)) {
    echo $result['text'];
    }
    ?>


    </div>
    </td>
    <td width="292" valign="top">SideBar</td> <!--Сайдбар справа от контиента-->
    </tr>
    </table></td>
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.842
    Симпатии:
    652
    Да, только не размещайте шапку страницы, если она будет, перед кодом взаимодействия с БД. Все после!

    И в шаблонах принято использовать альт. синтаксис. Сборку мусора после фин. цикла можно сделать вручную, но чтобы она не отражалась в шаблоне, можно ее обернуть вместе с fetch_array (тут достаточно fetch_assoc) в одну ф-цию (за одно и абстрактный уровень появится). Пример тут (см. шаблон списка статей). И уже давно пора отказаться от ф-ций mysql_* (например, в пользу mysqli_*).
    --- Добавлено ---
    P.S. Данные для подключения лучше обернуть в ф-цию подключения, чтобы не продуцировать лишние глоб. переменные, при этом для универсальности их (и только их) можно вынести в отдельный файл.
    --- Добавлено ---
    Вот пример из той же серии, что и выше:
    PHP:
    1. function mysqli_open()
    2. {
    3.   require(PATH.'include/dbconfig.php');
    4.   if (($link=mysqli_connect($host,$user,$pw,$db))&&!mysqli_set_charset($link,'utf8'))
    5.   {
    6.     mysqli_close($link);
    7.     return false;
    8.   }
    9.   return $link;
    10. }
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.842
    Симпатии:
    652
    Что касается последнего вопроса. Опять-таки буду опираться на каркас из примера выше, как простейший для реализации. Идея состоит в том, чтобы вставлять результат выполнения вложенного шаблона (при наличии такого шаблона), как значение обычного поля:
    PHP:
    1. <div class="content">
    2. <?= $page['content'] ?>
    3.  
    4. </div>
    Для этого предварительно выполняете вложенный шаблон «в контексте открытого в памяти буфера вывода»:
    PHP:
    1. if ($r0['bits']&16)
    2. {
    3.   ob_start();
    4.   require(PATH.'theme/'.$r0['module'].'.php');
    5.   $page['content']=ob_get_clean();
    6. }
    --- Добавлено ---
    P.S. И на продакшене «or die» – это не дело. Выводите полноценную страницу ошибки. Для ошибок, связанных с взаимодействием с БД, хорошо подходит HTTP-статус 503.
     
  4. dmitrij.buck

    dmitrij.buck Новичок

    С нами с:
    9 мар 2018
    Сообщения:
    15
    Симпатии:
    0
    @miketomlin помогите разобраться. Скрипт подключения к базе оставил старый. Сам новый не напишу...пока не хватает знаний.но проверил подключение с помощью
    if (!$link) {
    die ("Connection failed:" .mysql_connect_error());

    }
    echo "yes";


    все работает.Идем дальше. результат вложенного шаблона это тот что мы записали в $result?или нет?если вопрос идиотский, прошу простить, ибо на данном этапе знания близки к нулю
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.842
    Симпатии:
    652
    Я не знаю, как вы делаете разделение кода между разными страницами. Допустим, у вас для каждой страницы/группы однотипных страниц имеется отдельная точка входа (запускаемый Web-сервером файл). Тогда вы можете в каждой точке входа готовить данные для вывода, включая имя вложенного шаблона (в $module), и в ее конце подключать общий шаблон такого формата:
    PHP:
    1. ...
    2. <div class="content">
    3. <?php require(PATH.'theme/'.$module.'.php'); ?>
    4.  
    5. </div>
    6. ...
    Это немного не то, про что я писал выше, но пока вам так проще будет понять.

    Что касается вашего кода из старт. поста, я немного не понял расхождение в коде работы с БД и в шаблоне, который идет ниже. Из БД вы вроде бы читаете одну запись – данные страницы index (главная?), а в шаблоне при помощи цикла пытаетесь выводить множество записей. Вам нужно либо добавить второй запрос для выбора нескольких записей, соответствующих списку выводимых статей на главной, либо цикл тут без надобности и вам нужно выводить в шаблоне отдельные поля одной единственной записи, например:
    PHP:
    1. <h1><?= $page['title'] ?></h1>
    2. <?= $page['text'] ?>
    С $result у вас путаница вышла. Вы правильно указали $query как параметр для mysqli_query. А вот для mysqli_fetch_assoc параметром уже будет $result. Положительным результатом последней ф-ции пусть будет массив $page (а если в добавок все же будете выбирать из БД данные статей, можно будет при выводе в цикле использовать переменную $row, $article и т.п.). Запрошенная запись может отсутствовать в таблице, поэтому делаете примерно такую же проверку, как и в цикле:
    PHP:
    1. if (!($page=mysqli_fetch_assoc($result))) {
    2.   die('Error 404');
    3. }
    --- Добавлено ---
    P.S. Пока получается по два файла на каждый тип страницы (точка входа и вложенный шаблон) плюс один файл с общим шаблоном. К примеру можно разместить их так:
    /index.php – точка входа;
    /theme/index.php – вложенный шаблон;
    /theme/template.php – общий шаблон.
    --- Добавлено ---
    P.P.S. В дальнейшем не откладывайте переход на концепт единой точки входа. Вам все равно будут нужны минимум по два файла на каждый тип страницы (подготовка данных, вложенный шаблон), но зато большое количество однотипных действий вы сможете выполнять централизованно.
     
  6. dmitrij.buck

    dmitrij.buck Новичок

    С нами с:
    9 мар 2018
    Сообщения:
    15
    Симпатии:
    0
    @miketomlin
    гдн-то что-то я не сделал, выдает ошибку 404(рез-т die)вот что получилось:


    <?php

    // подключаем скрипт
    require_once 'blocks/bd.php';

    // подключаемся к серверу
    $link = mysqli_connect($host, $user, $password, $database)
    or die("Ошибка " . mysqli_error($link));

    $query ="SELECT title,meta_d,meta_k,text FROM settings WHERE 'page'='index'";
    $result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));

    // закрываем подключение
    mysqli_close($link);

    ?>


    <div class=”contents”>
    <?php
    if (!($page=mysqli_fetch_assoc($result))) {
    die('Error 404');
    }
    ?>
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.842
    Симпатии:
    652
    Перечитайте то, что я написал. В частности «if (!($page=mysqli_fetch_assoc($result))) die('Error 404');» можно отнести еще к стадии подготовки данных. Вот если бы был цикл, тогда да. В моем пред. посте шаблоны – это первые два фрагмента кода.
    --- Добавлено ---
    Кавычки исправьте:
    Код (Text):
    1. WHERE 'page'
     
  8. dmitrij.buck

    dmitrij.buck Новичок

    С нами с:
    9 мар 2018
    Сообщения:
    15
    Симпатии:
    0
    Спасибо за помощь!Решил кароч так

    <?php

    // подключаем скрипт
    require_once 'blocks/bd.php';

    // подключаемся к серверу
    $link = mysqli_connect($host, $user, $password, $database)
    or die("Ошибка " . mysqli_error($link));

    // Подключаем кодировку utf-8 к базе
    if (!mysqli_set_charset($link, "utf8")) {
    printf("Ошибка при загрузке набора символов utf8: %s\n", mysqli_error($link));
    }
    // формируем запрос и кладем его в переменную результат
    $query ="SELECT title,text FROM settings WHERE page='index'";
    $result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));
    //вывод массива в переменную пэйдж
    if (!($page=mysqli_fetch_array($result))) {
    die('Error 404');
    }

    // закрываем подключение
    mysqli_close($link);

    ?>



    <html>
    <body>
    <div class=”contents”>

    <?php

    echo $page['text'];
    ?>

    </div>

    </body>
    </html>
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.842
    Симпатии:
    652
    Ну правильно, только порежьте разметку на общий и вложенный шаблоны, как я выше писал, чтобы не дублировать
    HTML:
    1. <div class=”contents”>
    2.  
    3. </div>
    4. </body>
    5. </html>