Редактирование ячейки MySQL (предпосылки к созданию собственной CMS, оператор UPDATE). Пользовательские формы редактирования элементов Php редактирование данных

Продолжаем серию уроков по работе с базами данных MySql. В этом уроке мы научимся редактировать информацию в базе данных MySql прямо из веб страницы.

Такие возможности могут Вам понадобиться, когда Вы предоставляете пользователю Вашего ресурса заполнять свой профиль, а также редактировать его. Также эти знания пригодятся, если Вы пишите администраторский раздел для сайта и хотите иметь возможность редактирования записей не заходя в базу данных.

В прошлых уроках мы создали базу данных MySql, заполнили ее, создали код для вывода информации из базы, а также для внесения новых записей в базу прямо из веб страницы.

В данном уроке я продолжу использовать уже имеющуюся структуру файлов. Все файлы данного урока есть в исходниках к этому уроку.

Итак, давайте начнем!

Редактируем запись в базе данных MySql из веб страницы.

Что нам нужно сделать?

1. Создаем кнопку, которая будет запрашивать все записи из базы.

2. Создать файл, в котором списком будут выводиться все имеющиеся в базе данных записи (для того, чтобы выбрать ту, которую хотим редактировать).

3. При выборе определенной записи в работу включается файл-обработчик, который забирает из базы данных всю информацию по нужной нам записи.

4. Выбранная информация вставляется в поля формы для редактирования, которую мы создадим.

5. После редактирования, при помощи определенного SQL-запроса информация отправляется на обновление в базу данных MySql.

1. Первое, что мы сделаем – это создадим файл “select_change.php” и разместим его в том же каталоге, что и все наши основные файлы (то есть в основном каталоге).

Пока мы не начали с ним работать давайте откроем файлы: “search_user.html”, “info_form.html”, “select_user.php”, “all_users.php” и добавим ссылку на этот файл для того, чтобы он был доступен из всех файлов нашего приложения (это для удобства, чтобы каждый раз не прописывать его адрес в адресной строке, когда мы будем тестировать наши веб страницы).

Добавляем следующую строку в каждый из файлов перед закрывающим тегом body .

Редактировать запись базы данных

2. Теперь откроем сам файл “select_change.php”. Мы будем выводить только имя и фамилию из базы для выбора пользователя, информацию о котором мы хотим редактировать.

Для этого сначала мы сформируем запрос к базе данных, который скажет выбрать все записи из базы, а затем выведем списком имена и фамилии каждого человека.

Выводить данные мы будем как радиокнопки. Это мы делаем для того, чтобы можно было выбрать пользователя (притом только одного).

Из базы мы будем запрашивать только 3 параметра: это id, first_name, last_name. Последние два будут выводиться на экран для того чтобы мы могли определиться какую информацию из базы данных будем редактировать. Параметр же id будет невидим (он будет значением атрибута value ), но он необходим для того, чтобы программа могла идентифицировать в базе данных выбранный элемент (фамилии и имена могут повторяться, а id всегда индивидуален).

Обратите также внимание на способ вывода информации в этом файле. Вы можете увидеть такие символы как %s .

Принцип здесь такой: в двойных кавычках в функции “printf” выводится html код, вместо определенной переменной (например, такой как “$row[‘first_name’]”) мы ставим якоря — %s. А после того как закрылись двойные кавычки, мы перечисляем эти переменные, соответствующие поставленным якорям. Это удобно, когда работаешь с функцией “printf”, однако следует следить за порядком якорей и перечисляемых переменных, так как они будут подставлены именно в том порядке, в котором Вы их перечисляете.

Все это заключено в тег формы, в которой action=»edit.php». Файл edit.php мы создадим в следующем шаге.

Итак, код нашего файла “select_change.php” будет выглядеть следующим образом:

Выбор пользователя для редактирования.

%s %s

", $row["id"], $row["first_name"], $row["last_name"]); } while($row = mysql_fetch_array($result)) ?>
Добавить пользователя

Вернуться к поиску

А если загрузить страницу в браузере, то можно увидеть примерно следующее:

3. Создайте файл “edit.php” и поместите его там же в основном каталоге.

Этот файл является файлом-обработчиком нашего предыдущего файла. В нем будет выводиться форма и автоматически заполняться информацией из базы данных MySql той записи, которую мы выбрали.

Кроме того, в этой форме можно будет изменить один или несколько параметров (например, имя, фамилию и т.д.).

Во-первых, программа должна понимать, какую запись Вы от нее требуете. А для этого должен быть передан параметр id . Имя для input в прошлом файле мы дали — ”user”, там же у нас хранится в атрибуте value нужный id . А следовательно получить его можно запросив при помощи “$_REQUESR[‘user’]”. И далее занести результат в переменную ”$id” .

Во-вторых, нужно сформировать запрос, который будет выводить из нашей таблицы базы данных всю информацию о записи с указанным идентификатором.

В-третьих, нужно исполнить этот запрос и вывести каждый параметр в предусмотренное для него поле (в атрибутах value ).

Вот код всего вышеописанного:

Вносим изменеиния











",$row["id"], $row["first_name"], $row["last_name"], $row["email"], $row["facebook"]); ?> Добавить пользователя

Вернуться к поиску



Обратите внимание, что у нашей формы action=’scripts/update.php’ . Этот файл мы создадим в следующем шаге.

Также обратите внимание на то, что параметр id также передается, но мы его не увидим, так как ему присвоен type=’hidden’. Передать его нужно, но лучше не давать возможности его менять, чтобы не допустить ошибок.

А вот и результат, которого мы пока что достигли:

4. Что же, осталось совсем немного!

Нужно создать файл update.php и положить его в папку со скриптами.

Что будет делать данный файл?

Он получит из предыдущего файла все введенные значения и каждое занесет в переменную.

Потом он сформирует запрос к базе данных, в котором попросит обновить запись с учетом переданного идентификатора, подставив в соответствующее поле соответствующую переменную.

После он отправит запрос на исполнение и выведет нам результат в виде текстового сообщение (либо все прошло хорошо, либо произошла ошибка).

Вот код этого файла:

Untitled Document Запись успешно обновлена!

"; ?> Добавить пользователя

Вернуться к поиску

Вернуться к выбору записей для редактирования

А вот и результат работы этого скрипта:

Итак, на данный момент (если Вы прошли все 4 урока этой серии) у Вас есть приложение, с помощью которого Вы можете добавлять новые записи в базу данных, выводить их в списке, либо искать и выводить по нужным имени и фамилии, а также редактировать уже имеющиеся записи.

Согласитесь, не мало. И все это не заходя в саму базу. Все происходит из веб страниц.

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

Если Вы еще не подписались на обновление блога, то обязательно подписывайтесь, чтобы не пропустить новые уроки.

Также жду Ваших отзывов и комментариев.

Удачи Вам, и до встречи в следующем уроке!

Форма добавления/изменения элементов информационных блоков является одной из самых часто используемых, а в интернет-магазинах или информационных изданиях эта форма однозначно является самой популярной в административном разделе. И несмотря на то, что внешний вид и поля формы изменяются в зависимости от настроек информационного блока, а также можно настроить вид формы редактирования элементов стандартными средствами системы, для специфических задач, иногда этого недостаточно.

В этом случае в /bitrix/php_interface/include/ следует создать один или два (в зависимости от задачи) дополнительных файла:

Затем в настройках инфоблока задать пути к этим файлам:

Файл с формой редактирования элемента

Создадим в папке /bitrix/php_interface/include/ , например, файл iblock_element_edit_my.php , затем скопируем в него код из файла /bitrix/modules/iblock/admin/iblock_element_edit.php от строки:

до строки:

////////////////////////// //END of the custom form //////////////////////////

Важно! Не забудьте в вашем файле подключить необходимые пространства имен (смотрите первые строки файла /bitrix/modules/iblock/admin/iblock_element_edit.php).

Теперь можно приступать к редактированию файла, т.е. к изменению внешнего вида формы редактирования элемента инфоблока под собственные нужды. (Перед процедурой необходимо отменить настройки формы, если таковые ранее были сделаны.)

  • Вы можете удалить ненужные вам поля инфоблока. Для отображения полей формы используются конструкции следующего вида: BeginCustomField("ACTIVE_TO", GetMessage("IBLOCK_FIELD_ACTIVE_PERIOD_TO"), $arIBlock["FIELDS"]["ACTIVE_TO"]["IS_REQUIRED"] === "Y"); ?> GetCustomLabelHTML()?>:EndCustomField("ACTIVE_TO", "
  • Для отображения в форме свойств элементов инфоблока используется функция _ShowPropertyField() : BeginCustomField("PROPERTY_".$prop_fields["ID"], $prop_fields["NAME"], $prop_fields["IS_REQUIRED"]==="Y"); ?> <? $tabControl->EndCustomField("PROPERTY_".$prop_fields["ID"], $hidden); ?>

При использовании собственной формы на странице редактирования элемента пропадает кнопка Настроить , позволяющая отсортировать и настроить отображение полей формы элемента.

Чтобы не добавлять механизм сортировки полей в iblock_element_edit_my.php и не отказываться от стандартной функции, необходимо добавить следующий код в файл:

GetCurPage()."?mode=settings".($link <> ""? "&".$link:""); $aMenu = array("TEXT"=>GetMessage("IBEL_E_SETTINGS"), "TITLE"=>GetMessage("IBEL_E_SETTINGS_TITLE"), "LINK"=>"javascript:".$tabControl->GetName().".ShowSettings("".urlencode($link)."")", "ICON"=>"btn_settings",); $context = new CAdminContextMenu($aMenu); $context->Show(); } ?>

Важно!

Файл, отвечающий за обработку полей элемента перед его сохранением

Чтобы изменить сохраняемые поля, необходимо модифицировать одноименные поля в массивах $_POST и $_FILES , значения всех свойств необходимо модифицировать в массиве $PROP .

Создадим в /bitrix/php_interface/include/ , например, файл iblock_element_edit_before_save.php .

Для проверки, что детальный текст элемента введен, используем следующее условие:

If (strlen($_POST["DETAIL_TEXT"])<=0) $error = new _CIBlockError(2, "DESCRIPTION_REQUIRED", "Введите текст статьи");

Конструктор объекта _CIBlockError принимает три параметра: степень серьезности ошибки, произвольный идентификатор и текст ошибки. Если на странице редактирования определить переменную $error со значением этого объекта, то сохранения внесённых изменений не произойдет. Для того чтобы значения, пришедшие из формы, не потерялись, после инициализации переменной $error также инициализируйте переменную $bVarsFromForm=true . Переменная $bVarsFromForm как раз указывает, что значения в полях необходимо показывать те, которые пришли из формы.

Для автоматического создания маленькой картинки на основе большой воспользуемся функцией BXIBlockAfterSave . Если ее определить до сохранения элемента, то она автоматически будет вызвана после успешного сохранения элемента. Определим ее в начале файла /bitrix/php_interface/include/iblock_element_edit_before_save.php:

Fetch()) && $ar["DETAIL_PICTURE"]> < $height_orig)) $width = ($height / $height_orig) * $width_orig; else $height = ($width / $width_orig) * $height_orig; $image_p = imagecreatetruecolor($width, $height); $image = imagecreatefromjpeg($img_path); imagecopyresized($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); $new_img_path = tempnam("/tmp", "FOO").".jpg"; imagejpeg($image_p, $new_img_path); $be = new CIBlockElement(); $be->Update($arFields["ID"], Array("PREVIEW_PICTURE" => CFile::MakeFileArray($new_img_path)), false); @unlink($new_img_path); } } ?>

Примечание: в вышеприведенном скрипте на основе большой картинки будет создана маленькая и эта картинка будет подставлена в поле для маленькой картинки. Пример работает только с картинками в формате JPG .

Приведем полный код страницы /bitrix/php_interface/include/iblock_element_edit_before_save.php:

0 && $view!="Y" && (!$error) && empty($dontsave) && strlen($_POST["DETAIL_TEXT"])<=0) $error = new _CIBlockError(2, "DESCRIPTION_REQUIRED", "Введите текст статьи"); function BXIBlockAfterSave($arFields) { $dbr = CIBlockElement::GetByID($arFields["ID"]); if(($ar = $dbr->Fetch()) && $ar["DETAIL_PICTURE"]>0) { $img_path = $_SERVER["DOCUMENT_ROOT"].CFile::GetPath($ar["DETAIL_PICTURE"]); $width = 200; $height = 200; list($width_orig, $height_orig) = getimagesize($img_path); if($width && ($width_orig < $height_orig)) $width = ($height / $height_orig) * $width_orig; else $height = ($width / $width_orig) * $height_orig; $image_p = imagecreatetruecolor($width, $height); $image = imagecreatefromjpeg($img_path); imagecopyresized($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); $new_img_path = tempnam("/tmp", "FOO").".jpg"; imagejpeg($image_p, $new_img_path); $be = new CIBlockElement(); $be->Update($arFields["ID"], Array("PREVIEW_PICTURE" => CFile::MakeFileArray($new_img_path)), false); @unlink($new_img_path); } } ?>

Важно! Не забудьте указать путь к данному файлу в настройках инфоблока.


Иногда бывает необходимо выполнить изменения совсем другого характера, например, форма ввода и изменения одновременно несколько картинок, в этом случае необходимо просто создать свою новую страницу и добавить ее в административное меню.

Последнее обновление: 1.11.2015

Редактирование уже имеющихся данных будет немного сложнее получения и добавления данных из бд. Прежде всего потому, что здесь нам надо совместить, во-первых, получение редактируемых данных, а затем их обновление базы данных новыми значениями.

Для обновления применяется выражение SQL "UPDATE":

$query ="UPDATE tovars SET name="Samsung ACE II", company="Samsung" WHERE id="1"";

После слова SET идет перечисление названий столбцов и новых значений для них. В конце строки запроса указывается селектор с помощью выражения WHERE . В данном случае все у всех строк, у которых id="1", устанавливаются значения name="Samsung ACE II" и company="Samsung"

Теперь создадим новый файл edit.php , который будет содержать логику редактирования. И добавим в него следующее содержание:

Данные обновлены"; } // если запрос GET if(isset($_GET["id"])) { $id = htmlentities(mysqli_real_escape_string($link, $_GET["id"])); // создание строки запроса $query ="SELECT * FROM tovars WHERE id = "$id""; // выполняем запрос $result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link)); //если в запросе более нуля строк if($result && mysqli_num_rows($result)>0) { $row = mysqli_fetch_row($result); // получаем первую строку $name = $row; $company = $row; echo "

Изменить модель

Введите модель:

Производитель:

"; mysqli_free_result($result); } } // закрываем подключение mysqli_close($link); ?>

Структурно весь код делится на две части: обработку запроса POST и обработку запроса GET. Обработка POST-запроса подобна добавлению данных, только в данном случае используется выражение UPDATE: "UPDATE tovars SET name="$name", company="$company" WHERE id="$id""

При обработке запроса GET получаем id записи и по ней получаем всю запись с помощью выражения "SELECT * FROM tovars WHERE id = "$id"" . Если получена более нуля строк, то выводим содержимое строки в форму для редактирования.

Теперь, чтобы отредактировать первую запись, нам надо обратиться в браузере к скрипту по адресу http://localhost:8080/edit.php?id=1 .

Уважаемые посетители сайта, задающие вопросы вроде "А как прикрутить вашу корзину к сайту?" и т.п. Я не делаю готовых решений, я описываю логику реализации, для каждого отдельного сайта нужно будет дописывать те или иные вещи в любом случае, поэтому если вам очень нужно что-либо прикрутить или приделать, я оказываю платные и бесплатные услуги по консультированию и доработке сайтов. Пишите в форму обратной связи вверху страницы, отвечу всем.


Редактирование ячейки MySQL (предпосылки к созданию собственной CMS, оператор UPDATE)

В этой статье я приведу пример, как сделать редактор для содержимого сайта, т.е. редактирование информации содержащейся в базе данных MySQL. Итак, есть следующая задача: отредактировать запись в таблице базы данных. Редактирование будет происходить сиз обычной HTML формы.Первое что необходимо сделать – выбрать нужные значения из таблицы. Как это сделать можно прочитать . Для примера возьмем таблицу товаров из статьи про корзину интернет магазина . Логика скрипта следующая:

  1. Проверяем была ли нажата кнопка «Редактировать»(Submit).
  2. Если нет, выводим форму с заполненными полями
  3. Если да, изменяем содержимое нужной ячейки.

Начнем с формы, так проще. Создаем страницу update.php. Структура таблицы товаров следующая: 1. идентификатор id (smallint) 2. название товара name(текстовое поле varchar(255)) 3. цена товара (float).
Выбираем значение из базы данных:



?>



”/>




Форма для редактирования готова. Следующим шагом необходимо поставить условие, которое будет определять, нажал ли пользователь на кнопку редактировать, или он только хочет заняться редактированием данных.
Условие предельно простое. Обратите внимание на скрытое поле с именем edit, именно оно говорит скрипту, что нужно отредактировать данные:

if (!isset($_POST[‘edit’]) {
$q=mysql_query(”SELECT * FROM products WHERE id=’$id’”);
$product=mysql_fetch_assoc($q);
?>



”/>




}
else {
//Редактируем данные:
$q=mysql_query(”UPDATE products SET name=’”.$_POST[‘name’].”’, price=’”.$_POST[‘price’].”’ WHERE id=’”.$_POST[‘id’].”’”);
if (!q) {
echo “Не удалось выполнить запрос SQL”;
}
}
?>

Обратите внимание, что обработчик формы и сама форма находятся на одной странице update.php. Таким образом теперь мы умеем редактировать данные в базе MySQL, ну а дальше модифицируете форму под вашу структуру данных.
Замечание: Обратите внимание, что в страницу update.php нужно передать значение id, по которому происходит выборка продукта, обычно его можно передать методом GET дописав значение id, т.е. ссылка на страницу редактирования будет выглядеть так: update.php?id=…

Мы сделали небольшое приложение, которое использовало единственную таблицу. В приложении была создана модель, контроллер и несколько видов для просмотра и добавления категорий в таблицу базы данных. В данном уроке мы продолжим работу над приложением и построим функционал для проверки, а также для редактирования и удаления данных из таблицы категорий.

Проверка данных в CakePHP выполняется в модели. Добавить ее очень просто. Так как наша таблица имеет только одно поле для проверки, то нам нужно всего лишь проверять наличие значения при вводе. Изменим код в файле /app/models/category.php :

Class Category extends AppModel { var $name = "Category"; var $validate = array("name" => array("rule" => "notEmpty")); }

Массив $validate указывает CakePHP как выполнять проверку ваших данных при вызове метода save() . В нашем примере мы указываем, что поле name должно иметь значение (то есть, не быть пустым). Механизм проверки CakePHP имеет несколько встроенных правил (проверка номера кредитной карты, адреса email и тому подобное) и позволяет добавлять собственные правила проверки. Более детально мы его рассмотрим при расширении нашего приложения до доски объявления о вакансиях.

Проверка данных является важной частью любого приложения, так как она помогает определять соответствие данных в модели и логики работы приложения.

Теперь у нас есть правило проверки. Попробуйте добавить категорию с пустым полем имени. Так как мы использовали метод input() строителя форм для создания наших элементов, то сообщение об ошибке появится автоматически.

Вы можете написать собственное сообщение об ошибке. Попробуйте использовать следующий код в файле модели:

Class Category extends AppModel { var $name = "Category"; var $validate = array("name" => array("rule" => "notEmpty", "message" => "Категория обязательно должна иметь имя!")); }

Добавим функционал для редактирования и удаления категорий.

Сначала сделаем удаление. Открываем файл и добавляем следующую функцию сразу после функции add() :

Function delete($id) { $this->Category->delete($id); $this->Session->setFlash("Категория с идентификатором: ".$id." удалена."); $this->redirect(array("action"=>"index")); }

Так как данная функция только удаляет категорию и перенаправляет логику приложения к действию index контроллера, то нам не нужно создавать вид. Однако нужно изменить наш вид index , чтобы добавить ссылку для удаления категории. Открываем файл /app/view/categories/index.ctp и изменяем его так, чтобы он выглядел следующим образом:

Категории

link("Добавить категорию",array("controller" => "categories", "action" => "add")); ?>
Id Название Действия
link($category["Category"]["name"], array("controller" => "categories", "action" => "view", $category["Category"]["id"])); ?> link("Удалить", array("action" => "delete", $category["Category"]["id"]), null, "Вы уверенны?")?>

Попробуйте теперь удалить категорию. CakePHP автоматически генерирует диалоговое окно Javascript с вопросом "Вы уверены?" .

Теперь добавим функцию для редактирования категории в наш контроллер. Скопируйте следующий код в файл /app/controllers/categories_controller.php :

Function edit($id = null) { $this->Category->id = $id; if (empty($this->data)) { $this->data = $this->Category->read(); } else { if ($this->Category->save($this->data)) { $this->Session->setFlash("Ваша категория изменена."); $this->redirect(array("action" => "index")); } } }

Данная функция сначала проверяет, переданы ли какие-нибудь данные формы. Если ничего не было передано, она находит категорию и передает ее в вид. Если какие-нибудь данные были переданы, то она пробует сохранить их с помощью модели.

Для данного функционала нам нужен вид. Создаем файл /app/views/categories/edit.ctp и копируем в него код:

Редактируем категорию

create(" Category ", array("action" => "edit")); echo $form->input("name"); echo $form->input("id", array("type"=>"hidden")); echo $form->end("Сохранить"); ?>

Данный вид выводит форму для редактирования (с заполненными значениями полями).

Следует отметить один момент: CakePHP предполагает, что вы выполняете редактирование модели, если присутствует поле ‘id ’ в массиве данных. Если поле ‘id’ отсутствует (посмотрите на вид add ), CakePHP предполагает, что вы вставляете новые данные, когда вызывается метод save() .

Теперь можно обновить вид index ссылкой на редактирование определенной категории, то есть файл /app/views/categories/index.ctp должен выглядеть так:

link("Добавить категорию",array("controller" => "categories", "action" => "add")); ?>

Id Название Действия
link($category["Category"]["name"], array("controller" => "categories", "action" => "view", $category["Category"]["id"])); ?> link("Удалить", array("action" => "delete", $category["Category"]["id"]), null, "Вы уверенны?")?> link("Редактировать", array("action"=>"edit", $category["Category"]["id"]));?>

Вот теперь наше маленькое приложение на CakePHP полностью завершено!

Разберемся теперь с маршрутами в CakePHP. Для некоторых маршрутизация CakePHP по умолчанию будет вполне удовлетворять их запросы. Разработчики, которые стремятся построить удобный для использования интерфейс приложения и сделать его дружественным для поисковых роботов, будут довольны способом генерации адресов URL для действия CakePHP. Но для целей обучения мы изменим маршрутизацию.

По умолчанию CakePHP отвечает на запросы к корневому адресу вашего сайта (например, http://www.example.com) с помощью контроллера страниц PagesController , который выводит вид с названием “home ”. Мы изменим маршрут на наш контроллер категорий, создав соответствующее правило.

Маршрутизация CakePHP находится в файле /app/config/routes.php . Вы можете закомментировать или удалить строку, которая определяет маршрут по умолчанию. Она выглядит так:

Router::connect ("/", array("controller"=>"pages", "action"=>"display", "home"));

Теперь добавим строку ниже:

Router::connect ("/", array("controller"=>"categories", "action"=>"index"));

Таким образом, пользователь, запрашивающий ‘/’ будет направляться к действию index() нашего контроллера категорий. Теперь можно обращаться к нашему приложению через корневой адрес (например, http://localhost/cake ).

В следующем уроке мы начнем разбираться с генератором приложений Bake CakePHP.

Настройка