Вставить данные / обновить, если они уже существуют

#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. Например. пользователь продолжает редактирование страницы и нажимает второй раз «Сохранить». Как обновить существующее поле? Пожалуйста, отредактируйте код, если это возможно