#php #mysql
#php #mysql
Вопрос:
Этот код работает. Я не могу понять, как вставить данные в БД, если пользователь впервые нажал кнопку «СОХРАНИТЬ» или обновил данные.
Сторона php
<?php
require '../../core/includes/common.php';
$name=filter($_POST['name'], $db);
$title=filter($_POST['title'], $db);
$parentcheck=filter($_POST['parentcheck'],$db);
if(isset ($_POST['parent'])) $parent=filter($_POST['parent'],$db);
else $parent=$parentcheck;
$menu=filter($_POST['menu'], $db);
$content = $db->escape_string($_POST['content']);
$result=$db->query("INSERT INTO menu (parent, name, showinmenu) VALUES ('$parent', '$name', '$menu')") or die($db->error);
$new_id = $db->insert_id;
$result2=$db->query("INSERT INTO pages (id, title, content) VALUES ('$new_id', '$title', '$content')") or die($db->error);
if ($new_id>0){
echo "{";
echo '"msg": "success" ';
echo "}";
}else{
echo "{";
echo
'"err": "error"';
echo "}";
}
?>
Обновить
Благодаря @jmlsteeke я нашел способ
Поместите этот фрагмент кода в html-часть
<?php
$result=$db->query("INSERT INTO menu (parent, name, showinmenu) VALUES ('555', 'new', '0')") or die($db->error);
$new_id = $db->insert_id;
$result2=$db->query("INSERT INTO pages (id, title, content) VALUES ('$new_id', 'new', 'new')") or die($db->error);
?>
И добавил следующий код в форму
<input type="hidden" name="id" value="<?=$new_id?>"/>
В используемом серверном скрипте
$result=$db->query("UPDATE pages AS p, menu AS m SET m.parent='$parent', m.name='$name', m.showinmenu='$menu', p.id='$id', p.title='$title', p.content='$content' WHERE m.id='$id' AND p.id=m.id") or die($db->error);
Спасибо @jmlsteeke
Комментарии:
1. Это не совсем то, что я имел в виду, но я не знаю, как объяснить это лучше, не видя / не редактируя весь ваш код. Кроме того, мне давно пора ложиться спать.
Ответ №1:
Обычным способом было бы сохранить идентификатор в виде скрытого поля при редактировании страницы. Таким образом, когда пользователь отправляет страницу, если присутствует идентификатор, вы выполняете команды ОБНОВЛЕНИЯ, а если его нет, вы знаете, что это новая страница, и выполняете команды ВСТАВКИ.
Если вам нужно, чтобы я был более тщательным, дайте мне знать.
Редактировать: быть более тщательным
Я приведу простой и полный пример того, что я имею в виду.
Form.php псевдокод
//set default values for fields
//print form tag
if (isset($'id',$_GET)) {
//fetch data from database
//print hidden id field
//override default values for fields
}
//print rest of fields using default values (possibly overridden)
DoForm.php псевдокод
//Sanitize user input
if (isset('id',$_POST)) {
//UPDATE database with user input
} else {
//INSERT new rows into table with user input
}
Допустим, у вас есть php-файл с именем Form.php который отвечает за отображение формы, и другой php-скрипт, вызываемый DoForm.php который отвечает за обработку формы.
Если пользователь посещает Form.php без указанного идентификатора (http://example.com/Form.php ) затем он отобразит следующую форму:
<form method="post" action="DoForm.php">
<input type="text" name="name" value="" />
<input type="text" name="title" value="" />
... other stuff ...
</form>
Пользователь добавит некоторую информацию, нажмет на кнопку отправки, и DoForm получит следующие переменные POST:
"name" => "NewPageName"
"title" => "My First Webpag" [intetional typo, see later]
... other stuff ...
DoForm проверит $_POST['id']
, существует ли он. Поскольку он не выполняет форму, выдает команды ВСТАВКИ для добавления новой страницы.
Позже пользователь понимает, что допустил опечатку, и идет ее исправлять. Пользователь нажимает на элемент управления «Редактировать страницу» для «NewPageName», который будет http://example.com/Form.php?id=1
Form.php смотрите, что идентификатор установлен, поэтому форма, которую он выводит, выглядит следующим образом:
<form method="post" action="DoForm.php">
<input type="hidden" name="id" value="1"
<input type="text" name="name" value="NewPageName" />
<input type="text" name="title" value="My First Webpag" />
... other stuff ...
</form>
Пользователь исправляет их тип, меняя Webpag на Webpage и нажимает submit. DoForm получает следующие переменные Post
"id" => 1
"name" => "NewPageName"
"title" => "My First Webpage"
... other stuff ...
DoForm видит, что идентификатор установлен, и поэтому использует UPDATE вместо INSERT .
Еще что-нибудь понятно?
Комментарии:
1. Чтобы было ясно, это система управления контентом. Допустим, пользователь добавляет новую страницу. В первый раз, когда пользователь нажимает кнопку «Сохранить», он вставляет содержимое с новым идентификатором. Моя html-сторона отправляет данные через ajax. Например. пользователь продолжает редактирование страницы и нажимает второй раз «Сохранить». Как обновить существующее поле? Пожалуйста, отредактируйте код, если это возможно
2. HTML для добавления страницы и для редактирования страницы должен немного отличаться. При редактировании страницы вам необходимо добавить скрытое поле ввода, содержащее идентификатор страницы <тип ввода=»скрытый» имя =»идентификатор» значение =»<page.id >» />. Затем, когда они нажимают кнопку сохранить, идентификатор страницы будет передан вместе с данными страницы. Ваш PHP проверит, был ли отправлен идентификатор, так же, как вы проверяете parentcheck, и если он был отправлен, выполните обновление с использованием этого идентификатора. Если этого не было, сделайте вставку, точно так же, как вы сейчас.
3. Я не могу редактировать код, потому что для этого требуется внести изменения в код, который вы не включили.
4. Послушайте, таблица БД генерирует мой идентификатор, это автоматически добавляемое значение. Как получить идентификатор, если он вообще не существует?
5. Вариант использования 1: новая страница. Пользователь нажимает «Новая страница», ваш скрипт генерирует HTML-форму, которая не содержит скрытого элемента id. Пользователь отправляет эту форму, новая страница создается с помощью команд ВСТАВКИ.
Ответ №2:
В MySQL есть INSERT ... ON DUPLICATE KEY UPDATE
функция, которая позволит вам попытаться вставить строку или вернуться к обновлению, если он обнаружит дубликат ключа (т. Е. Строка уже существует).
Комментарии:
1. Если у него есть ключ, отличный от id, то это был бы правильный путь, но, исходя из контекста, я не думаю, что это сработает, потому что вполне возможно, что ни одна из других данных не должна быть уникальной. Глядя на это, единственной возможностью, которую я вижу для наличия уникального ключа, было бы parent name , но вполне возможно, что они захотят иметь несколько дочерних элементов с одинаковыми именами (возможно, не лучшая практика, но и не самая сумасшедшая).
2. Чтобы было ясно, это система управления контентом. Допустим, пользователь добавляет новую страницу. В первый раз, когда пользователь нажимает кнопку «Сохранить», он вставляет содержимое с новым идентификатором. Моя html-сторона отправляет данные через ajax. Например. пользователь продолжает редактирование страницы и нажимает второй раз «Сохранить». Как обновить существующее поле? Пожалуйста, отредактируйте код, если это возможно