Уроки PHP - урок 3.3 - Работа с БД MySQL. Обновление данных UPDATE.
Мы уже познакомились с такими операторами MySQL как SELECT, INSERT INTO, теперь пора узнать как обновлять уже внесенные в БД данные. Для этого мы будем использовать оператор SQL UPDATE. Но для начала давайте изменим наш файл index.php, добавим обработку еще одного пути. Найдите вот этот код:
if( $_GET['admin'] == 1 ){ // если есть в URL переменная admin print $obj->display_admin(); // если есть переменная, то отображаем форму }else{ print $obj->display_public(); // если переменной нет, то отображаем сообщения }
И замените его на следующий код:
switch ($_GET['admin']){ case 'add': print $obj->display_admin(); // если переменная равна add, то отображаем форму добавления break; case 'update': print $obj->display_update(); // если переменная равна update, то отображаем форму изменения break; default: print $obj->display_public(); // если переменной нет, то отображаем сообщения }
Я сменил условный оператор if на другой оператор switch, который позволит использовать сразу несколько выборов значений переменной $_GET['admin'], потом у нас появятся еще delete. А пока я изменил 1 на add и добавил еще один выбор update. Так как я поменял 1 на add нужно изменить вывод ссылок в файле simpleCMS.php:
$content .= '<p><a href="/index.php?admin=1">Добавить сообщение</a></p>';
Поменяйте на:
$content .= '<p><a href="/index.php?admin=add">Добавить сообщение</a></p>';
Также еще нужно добавить новый метод display_update(), который мы будем вызывать когда в get-запросе будет переменная admin со значением update. Добавляем новый метод display_update():
public function display_update(){ }
Итак, мы создали обработку пути, в результате которой вызывается наш новый метод display_update(), осталось добавить ссылки на страницу вызова метода и реализовать метод display_update().
Давайте сначала подумаем как мы будем реализововать обновление записей. Нам будет необходимо вносить в БД определенный запрос с условием WHERE, так чтобы определенно сказать, что эта та запись, которую нужно обновить. Это можно будет сделать точно, если указывать id это записи, то есть у нас это колонка mid. Поэтому нужно будет передавать значение mid при вызове метода display_update(). Как это можно сделать? Можно передавать значение в get-запросе вместе с admin=update, например так:
http://test/index.php?admin=update&mid=3
А можно использовать параметр в методе display_update(), например так:
public function display_update($mid){ }
И вызывать тогда метод следующим образом:
switch ($_GET['admin']){ case 'add': print $obj->display_admin(); // если переменная равна add, то отображаем форму добавления break; case 'update': $mid = 1; //или сюда можно поместить $_GET['mid'] print $obj->display_update($mid); // если переменная равна update, то отображаем форму изменения break; default: print $obj->display_public(); // если переменной нет, то отображаем сообщения }
В любом случае нужно будет передавать значение mid и скорее всего через get-запрос, поэтому давайте используем первый вариант, потому что он проще.
public function display_update(){ $message_id = $_GET['mid']; }
Так мы передаем значение mid, а что если этого значения нет в get-запросе? Это нужно проверить.
public function display_update(){ $message_id = $_GET['mid']; //записываем mid в переменную if(!empty($message_id)){ }else{ $content .= '<p>Нет значения mid!</p>'; $content .= '<p><a href="/index.php">Вернуться на главную</a></p>'; } return $content; }
Теперь если у нас будет в get-запросе admin=update, но значения mid не будет, то мы попадем на страницу с ссылкой на главную.
http://test/index.php?admin=update
Итак, мы подошли к моменту, что нам понадобятся ссылки на страницы редактирования. Нужно будет подправить метод display_public(), чтобы вывести их:
public function display_public() { // метод вывода сообщений $content = ''; $sql = 'SELECT * FROM Messages ORDER BY mid DESC'; //запрос выборки $result = mysql_query($sql) or die(mysql_error()); // результат выполнения запроса выборки мы сохраняем в переменную while($row = mysql_fetch_array($result)){ // переменную запроса выборки необходимо обработать специальной функцией mysql_fetch_array() $content .= '<div class="post">'; // div оборачивающий запись $content .= '<span class="time">#' . $row['mid'] . ' от ' . date('d-m-Y', $row['created']) . '</span><h2>' . $row['title'] . '</h2>'; // выводим время и заголовок $content .= '<p>' . $row['bodytext'] . '</p>'; // выводим текст сообщения $content .= '<p><a href="/index.php?admin=update&mid=' . $row['mid'] . '">Редактировать сообщение</a>'; // добавляем ссылку на редактирование сообщения $content .= '</div>'; // конец оборачивающего div'a } $content .= '<p><a href="/index.php?admin=add">Добавить сообщение</a></p>'; return $content; }
Теперь под каждым сообщением будет ссылка на его редактирование. Форма редактирования сообщения будет выводиться через наш метод display_update(). Так что давайте напишем код для этого метода. Сама форма будет мало чем отличаться от формы добавления, за исключением того что мы вставим уже имеющиеся значения сообщения из БД и добавим одно скрытое поле со значением mid.
public function display_update(){ $message_id = $_GET['mid']; //записываем mid в переменную if(!empty($message_id)){ $result = mysql_query('SELECT * FROM Messages WHERE mid='.$message_id); // запрашиваем нужную нам строку где mid совпадает с нашим значением $message = mysql_fetch_object($result); // обрабатываем результат в переменную message $content = ''; $content .= '<form action="/index.php?admin=update" method="post">'; // отправляем результаты формы на эту же страницу $content .= '<label for="title">Имя:</label><br />'; $content .= '<input name="title" id="title" type="text" maxlength="150" value=' . $message->title .' />'; // добавляем значение заголовка $content .= '<div class="clear"></div>'; $content .= '<input name="mid" id="mid" type="hidden" value="'.$message->mid.'" />'; // добавляем скрытое поле для хранения mid $content .= '<label for="bodytext">Сообщение:</label><br />'; $content .= '<textarea name="bodytext" id="bodytext">'. $message->bodytext .'</textarea>'; // добавляем значение текста $content .= '<div class="clear"></div>'; $content .= '<input type="submit" value="Сохранить" />'; $content .= '</form>'; $content .= '<p><a href="/index.php">Вернуться на главную</a></p>'; }else{ if (!empty($_POST)) { // проверяем результаты отправки формы print_r($_POST); // распечатаем массив post $content .= '<p><a href="/index.php">Вернуться на главную</a></p>'; }else{ $content .= '<p>Нет значения mid!</p>'; $content .= '<p><a href="/index.php">Вернуться на главную</a></p>'; } } return $content; }
В комментариях я пояснил, что изменилось в форме. Теперь давайте займемся обработкой массива post, который отправляется после заполнения формы обновления.
Array( [title] => asdf [mid] => 1 [bodytext] => asdfasf )
У меня это вот такой вот массив. Если посмотрите на запрос добавления записи, там такие же поля, за исключением mid. Давайте напишем обработку массива post с использованием запроса обновления:
public function display_update(){ $message_id = $_GET['mid']; //записываем mid в переменную if(!empty($message_id)){ $result = mysql_query('SELECT * FROM Messages WHERE mid='.$message_id); // запрашиваем нужную нам строку где mid совпадает с нашим значением $message = mysql_fetch_object($result); // обрабатываем результат в переменную message $content = ''; $content .= '<form action="/index.php?admin=update" method="post">'; // отправляем результаты формы на эту же страницу $content .= '<label for="title">Имя:</label><br />'; $content .= '<input name="title" id="title" type="text" maxlength="150" value=' . $message->title .' />'; // добавляем значение заголовка $content .= '<div class="clear"></div>'; $content .= '<input name="mid" id="mid" type="hidden" value="'.$message->mid.'" />'; // добавляем скрытое поле для хранения mid $content .= '<label for="bodytext">Сообщение:</label><br />'; $content .= '<textarea name="bodytext" id="bodytext">'. $message->bodytext .'</textarea>'; // добавляем значение текста $content .= '<div class="clear"></div>'; $content .= '<input type="submit" value="Сохранить" />'; $content .= '</form>'; $content .= '<p><a href="/index.php">Вернуться на главную</a></p>'; }else{ if (!empty($_POST)) { // проверяем результаты отправки формы mysql_query('UPDATE Messages SET title="'.$_POST["title"].'", bodytext="'.$_POST["bodytext"].'" WHERE mid='.$_POST["mid"]); $content .= '<p>Сообщение изменено!'; $content .= '<p><a href="/index.php#mid-'.$_POST['mid'].'">Перейти к записи</a></p>'; }else{ $content .= '<p>Нет значения mid!</p>'; $content .= '<p><a href="/index.php">Вернуться на главную</a></p>'; } } return $content; }
dВот весь код нашего метода display_update(), давайте посмотрим из чего же состоит запрос UPDATE:
ПСначала идет оператор UPDATE, за ним имя таблицы. После имени таблицы идет еще один оператор SET, после оператора SET мы указываем чему будут равняться поля, после этого мы ставим условие с помощь оператора WHERE, которое означает, что нужно обновить записи где mid= нужному значению. Потом я составлю краткий обзор всех операторов MySQL, этот же урок в первую очередь предназначен для тех кто только начал изучать php и mysql.