Уроки PHP - урок 3.3 - Работа с БД MySQL. Обновление данных UPDATE.

php 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.

ВложениеРазмер
Package icon php_urok_3-3.zip3.56 КБ

Комментарии

Добавить комментарий

Войти, используя Loginza Google Account Yandex Mail.ru Vkontakte Facebook
(If you're a human, don't change the following field)
Your first name.
(If you're a human, don't change the following field)
Your first name.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.

странно с таким последним

странно с таким последним кодом обновления, обновляется нужная запись и создается еще одна запись в бд, которая полностью дублирует исправленную . 

потому что

потому что
if($_POST){
$obj->write($_POST);
}
всегда сработает после update,т.к. мы там используем метод POST, а он не пустой.