PHP: $id = $_POST["id"]; $parent_id = $_POST["parent_id"]; $name = $_POST["name"]; $result = mysql_query("UPDATE `categories` SET `parent_id`='".$parent_id."', `name`='".$name."' WHERE `id`='".$id."'") or die (mysql_error()); if ($result) { echo "Данные успешно обновлены."; } else { echo "Данные не обновлены!"; } mysql_close(); PHP: <table> <form action="update_cat.php" method="POST"> <tr> <td>ID</td><td>Parent_ID</td><td>Name</td> </tr> <?php foreach ($articles as $article): ?> <tr> <td><input type="none" name="id" style="display:none;"/><?php echo $article['id']; ?></td> <td><input type="text" name="parent_id" value="<?php echo $article['parent_id']; ?>"/></td> <td><input type="text" name="name" value="<?php echo $article['name']; ?>" /></td> </tr> <?php endforeach; ?> <tr><td><input type="submit" value="Save" /></td></tr> </form> </table> Говорит то что данные успешно обновлены, но вот по факту в базе изменений никаких.
1) расширение mysql_ устарело и в современных версиях PHP не работает. Замените на mysqli_, это не сложно. 2) PHP: $id = $_POST["id"]; $parent_id = $_POST["parent_id"]; $name = $_POST["name"]; $result = mysql_query("UPDATE `categories` SET `parent_id`='".$parent_id."', `name`='".$name."' WHERE `id`='".$id."'") or die (mysql_error()); Этот запрос уязвим к SQL-инъекции, потому что данные вставляются "как есть", это плохо. 3) Так делать нельзя: HTML: <table> <form> </form> </table> Форма снаружи должна быть. 4)Вот это: HTML: <input type="none" name="id" style="display:none;"/><?php echo $article['id']; ?> замените на: HTML: <input type="hidden" name="id"/><?php echo $article['id']; ?>
Если код не работает нужно закоментировать всё и раскоментировать построчно и проверять работает или нет. Выводить при необходимости на экран индикационную информацию. Для начала посмотри передаются ли переменные, потом выполняется ли запрос... ну и такое всё.. что учить тебя чтоли
Если код не работает, нужно расставить брейкпоинты и сделать трассировку с просмотром скоупов и, опционально, коллстэка. Дебажить надо через дебаггер, а не через расстановку комментариев и выводы данных на экран. А какое невероятное удовольствие дебажить по описанной вами методе код, отдающий строго структурированные данные какому-нибудь аяксу..ммм... Нет, спасибо. xDebug настраивается за 5-10 минут. И потом, вот чесслово, экономит, на долгой дистанции, целые часы на отладке.
PHP: <h1>Редактировать</h1> <form id="update_from" action="update_cat.php" method="POST"> <table> <tr> <td>ID</td><td>Parent_ID</td><td>Name</td> </tr> <?php foreach ($articles as $article): ?> <tr> <td><input type="hidden" name="update_id" value="<?php echo $article['id']; ?>"/><?php echo $article['id']; ?></td> <td><input type="text" name="update_parent_id" value="<?php echo $article['parent_id']; ?>"/></td> <td><input type="text" name="update_name" value="<?php echo $article['name']; ?>" /></td> </tr> <?php endforeach; ?> <tr><td><input id="update" type="submit" value="save" /></td></tr> </table> </form> PHP: require_once ($_SERVER['DOCUMENT_ROOT'].'/database.php'); // подключаем скрипт $link = mysqli_connect($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass']); // Соединение с MySQL mysqli_select_db ($link ,$INFO['sql_database'] ); // Выбор базы данных $id = mysqli_real_escape_string($link ,$_POST['update_id']); $parent_id = mysqli_real_escape_string($link ,$_POST['update_parent_id']); $name = mysqli_real_escape_string ($link ,$_POST['update_name']); if(isset($_POST['update_parent_id'])){ // ... } else { echo 'Параметра ID - Нету!'; } if($id !="" || $parent_id !="" || $name!="") { $result = mysqli_query($link ,"UPDATE `categories` SET `parent_id`='$parent_id', `name`='$name' WHERE `id`='$id'") or die("Ошибки запроса: " . mysqli_error()); if ($result) { echo "Данные успешно обновлены."; } else { echo "Данные не обновлены!"; } } else { echo "ERROR"; } mysqli_close($link); все ровно не работает. Почему форма значение ID вообще не передает. Как буто он её вообще не видит.
А остальные нормально передаются? Вас не смущает, кстати, что у вас в цикле генерятся инпуты с одинаковыми name? Сделайте var_dump($_POST); Что там лежит? По части остальных пунктов - все отлично, кроме одного момента. Вы не указали кодировку подключения к БД. Это важно. Не в решении вашей проблемы, а просто, очень важно. Кодировка скрипта, соединения с базой, данных в базе и кодировка отдаваемой страницы должны быть идентичны. В идеале - везде UTF-8.
А вот еще раз проверил, с выше скриптом все тоже самое, только теперь ID передает, все передает, но факт то что база не обновляется все ровно! Вывод "array(3) { ["update_id"]=> string(2) "17" ["update_parent_id"]=> string(1) "4" ["update_name"]=> string(24) "Недвижимость" } Параметра ID - есть!Данные успешно обновлены." а в базе тишина...
эмм, по var_dump($_POST); я понял он только передает последнее значение, т.е последнею строку... на данный момент обновляется только она. Почему остальные не обновляются ?
@Fell-x27 Спасибо за помощь. Разобрался, сделал так: PHP: <?php foreach ($articles as $article): ?> <form id="update_from" action="update_cat.php" method="POST"> <table> <tr> <td><input type="hidden" name="update_id" value="<?php echo $article['id']; ?>"/><?php echo $article['id']; ?></td> <td><input type="text" name="update_parent_id" value="<?php echo $article['parent_id']; ?>"/></td> <td><input type="text" name="update_name" value="<?php echo $article['name']; ?>" /></td> <td><input id="update" type="submit" value="UPDATE" /></td> </tr> </table> </form> <?php endforeach; ?>
Потому что у вас генерируются строки одинаковым name, и, в итоге, получается, что будь их хоть триста, но в php придут только те, у которых имена уникальные. Нет, не разобрался. У тебя получается теперь, что на странице пачка форм, в каждой форме по таблице однострочной. За один проход ты все серверу не отдашь. Оно так не работает, можно только оду форму за раз отослать. Ты, конечно, сделал для каждой такой таблицы свою кнопку апдейта, но разве это круто? А 200 строк надо будет обновить? 200 кнопок нажимать теперь? Не, это не путь джедая. Путь джедая такой: PHP: <form id="update_from" action="update_cat.php" method="POST"> <table> <tr> <td>ID</td><td>Parent_ID</td><td>Name</td> </tr> <?php foreach ($articles as $article): ?> <tr> <td><input type="hidden" name="articles[<?php echo $article['id'] ?>][name]" value="<?php echo $article['id']; ?>"/><?php echo $article['id']; ?></td> <td><input type="text" name="articles[<?php echo $article['id'] ?>][update_parent_id]" value="<?php echo $article['parent_id']; ?>"/></td> <td><input type="text" name="articles[<?php echo $article['id'] ?>][update_name]" value="<?php echo $article['name']; ?>" /></td> </tr> <?php endforeach; ?> <tr><td><input id="update" type="submit" value="save" /></td></tr> </table> </form> Попробуй с такой штукой сделать var_dump. Совсем другая тема, а? --- Добавлено --- Если все пройдет как надо, у тебя на сервер придет двухмерный массив, где первый ключ будет такой же, как у идентификатора строки, а второй - как у идентификатора инпута в колонке. Осталось только его обработать.
array(1) { ["articles"]=> array(2) { [1]=> array(3) { ["name"]=> string(1) "1" ["update_parent_id"]=> string(1) "1" ["update_name"]=> string(20) "Рестораны11" } [2]=> array(3) { ["name"]=> string(1) "2" ["update_parent_id"]=> string(1) "2" ["update_name"]=> string(20) "Авиокассы11" } } } Получается так, как теперь его обработать? то ))
PHP: $id = $_POST['update_id']; $parent_id = $_POST['update_parent_id']; $name = $_POST['update_name']; if($id !="" || $parent_id !="" || $name!="") { $id_count = count($id); for ($i=0; $i<$id_count; $i++){ $result = mysqli_query($link ,"UPDATE `categories` SET `parent_id`='".$parent_id[$i]."', `name`='".$name[$i]."' WHERE `id`='".$id[$i]."'") or die("Ошибки запроса: " . mysqli_error()); } Сделал так, работает нормально. Но вот как если добавляю защиту $id = mysqli_real_escape_string( $link ,$_POST['update_id']); Выводит ошибку "Warning: mysqli_real_escape_string() expects parameter 2 to be string, array given in "
говорит, что mysqli_real_escape_string() ожидает второй параметр. Видимо в $_POST['update_id'] пусто.
Это замечательно. Значит нужно сделать так, чтобы mysqli_real_escape_string() получил второй параметр и тогда всё должно заработать. Выведи на экран $_POST['update_id']. Если в нём не пусто, то присвой его переменной и вставь переменную, а если пусто, то сделай так, чтобы было не пусто.
Ты перед этим делал вардамп поста. Есть там $_POST['update_id']? Нет. Там есть $_POST['articles'], в каждой ячейке которого свой $_POST['articles'][N]['update_id']. Значит надо по нему в цикле экранирование провести. Ты не просто копипасти код, даже свой, ты вникай, что он делает. Бро, ты сам-то понял, что сказал? Там проблема совсем другая.
Я то понял. Я подумал, что может быть есть какой-то особый синтаксис для вставки элемента массива, вроде фигурных скобок или чего то еще. Поэтому, если в $_POST['update_id'] что то есть, чтобы не заморачиваться с синтаксисом, просто присвоить это значение переменной и вставить переменную вторым параметром. А если значение пустое, то искать почему. Торопился я...
Он есть. Но это тут не при чем опять же. Проблема в том, что массив стал двухмерным, а автор про это забыл.