Добрый день, начал вникать в тему практически с нуля. подскажите правильно ли организованно соединение с БД, корректно ли сформирован запрос?и как вывести результат запроса в выделенную конструкцию 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>
Да, только не размещайте шапку страницы, если она будет, перед кодом взаимодействия с БД. Все после! И в шаблонах принято использовать альт. синтаксис. Сборку мусора после фин. цикла можно сделать вручную, но чтобы она не отражалась в шаблоне, можно ее обернуть вместе с fetch_array (тут достаточно fetch_assoc) в одну ф-цию (за одно и абстрактный уровень появится). Пример тут (см. шаблон списка статей). И уже давно пора отказаться от ф-ций mysql_* (например, в пользу mysqli_*). --- Добавлено --- P.S. Данные для подключения лучше обернуть в ф-цию подключения, чтобы не продуцировать лишние глоб. переменные, при этом для универсальности их (и только их) можно вынести в отдельный файл. --- Добавлено --- Вот пример из той же серии, что и выше: PHP: function mysqli_open() { require(PATH.'include/dbconfig.php'); if (($link=mysqli_connect($host,$user,$pw,$db))&&!mysqli_set_charset($link,'utf8')) { mysqli_close($link); return false; } return $link; }
Что касается последнего вопроса. Опять-таки буду опираться на каркас из примера выше, как простейший для реализации. Идея состоит в том, чтобы вставлять результат выполнения вложенного шаблона (при наличии такого шаблона), как значение обычного поля: PHP: <div class="content"> <?= $page['content'] ?> </div> Для этого предварительно выполняете вложенный шаблон «в контексте открытого в памяти буфера вывода»: PHP: if ($r0['bits']&16) { ob_start(); require(PATH.'theme/'.$r0['module'].'.php'); $page['content']=ob_get_clean(); } --- Добавлено --- P.S. И на продакшене «or die» – это не дело. Выводите полноценную страницу ошибки. Для ошибок, связанных с взаимодействием с БД, хорошо подходит HTTP-статус 503.
@miketomlin помогите разобраться. Скрипт подключения к базе оставил старый. Сам новый не напишу...пока не хватает знаний.но проверил подключение с помощью if (!$link) { die ("Connection failed:" .mysql_connect_error()); } echo "yes"; все работает.Идем дальше. результат вложенного шаблона это тот что мы записали в $result?или нет?если вопрос идиотский, прошу простить, ибо на данном этапе знания близки к нулю
Я не знаю, как вы делаете разделение кода между разными страницами. Допустим, у вас для каждой страницы/группы однотипных страниц имеется отдельная точка входа (запускаемый Web-сервером файл). Тогда вы можете в каждой точке входа готовить данные для вывода, включая имя вложенного шаблона (в $module), и в ее конце подключать общий шаблон такого формата: PHP: ... <div class="content"> <?php require(PATH.'theme/'.$module.'.php'); ?> </div> ... Это немного не то, про что я писал выше, но пока вам так проще будет понять. Что касается вашего кода из старт. поста, я немного не понял расхождение в коде работы с БД и в шаблоне, который идет ниже. Из БД вы вроде бы читаете одну запись – данные страницы index (главная?), а в шаблоне при помощи цикла пытаетесь выводить множество записей. Вам нужно либо добавить второй запрос для выбора нескольких записей, соответствующих списку выводимых статей на главной, либо цикл тут без надобности и вам нужно выводить в шаблоне отдельные поля одной единственной записи, например: PHP: <h1><?= $page['title'] ?></h1> <?= $page['text'] ?> С $result у вас путаница вышла. Вы правильно указали $query как параметр для mysqli_query. А вот для mysqli_fetch_assoc параметром уже будет $result. Положительным результатом последней ф-ции пусть будет массив $page (а если в добавок все же будете выбирать из БД данные статей, можно будет при выводе в цикле использовать переменную $row, $article и т.п.). Запрошенная запись может отсутствовать в таблице, поэтому делаете примерно такую же проверку, как и в цикле: PHP: if (!($page=mysqli_fetch_assoc($result))) { die('Error 404'); } --- Добавлено --- P.S. Пока получается по два файла на каждый тип страницы (точка входа и вложенный шаблон) плюс один файл с общим шаблоном. К примеру можно разместить их так: /index.php – точка входа; /theme/index.php – вложенный шаблон; /theme/template.php – общий шаблон. --- Добавлено --- P.P.S. В дальнейшем не откладывайте переход на концепт единой точки входа. Вам все равно будут нужны минимум по два файла на каждый тип страницы (подготовка данных, вложенный шаблон), но зато большое количество однотипных действий вы сможете выполнять централизованно.
@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'); } ?>
Перечитайте то, что я написал. В частности «if (!($page=mysqli_fetch_assoc($result))) die('Error 404');» можно отнести еще к стадии подготовки данных. Вот если бы был цикл, тогда да. В моем пред. посте шаблоны – это первые два фрагмента кода. --- Добавлено --- Кавычки исправьте: Код (Text): WHERE 'page'
Спасибо за помощь!Решил кароч так <?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>
Ну правильно, только порежьте разметку на общий и вложенный шаблоны, как я выше писал, чтобы не дублировать HTML: <html> <body> <div class=”contents”> </div> </body> </html>