За последние 24 часа нас посетили 16735 программистов и 1692 робота. Сейчас ищет 861 программист ...

Данные в таблице не обновляется "ошибки не выдает"

Тема в разделе "PHP и базы данных", создана пользователем EvilScorpion, 30 ноя 2016.

  1. EvilScorpion

    EvilScorpion Новичок

    С нами с:
    15 окт 2016
    Сообщения:
    44
    Симпатии:
    1
    PHP:
    1. $id = $_POST["id"];
    2. $parent_id = $_POST["parent_id"];
    3. $name = $_POST["name"];
    4.  
    5.  
    6. $result = mysql_query("UPDATE `categories` SET `parent_id`='".$parent_id."', `name`='".$name."' WHERE `id`='".$id."'") or die (mysql_error());
    7. if ($result)
    8. {
    9. echo "Данные успешно обновлены.";
    10. }
    11. else
    12. {
    13. echo "Данные не обновлены!";
    14. }
    15.  
    PHP:
    1.                         <table>
    2.                         <form action="update_cat.php" method="POST">
    3.                           <tr> <td>ID</td><td>Parent_ID</td><td>Name</td> </tr>
    4.                           <?php foreach ($articles as $article): ?>
    5.                           <tr>
    6.                          
    7.                           <td><input type="none" name="id" style="display:none;"/><?php echo $article['id']; ?></td>
    8.                           <td><input type="text" name="parent_id" value="<?php echo $article['parent_id']; ?>"/></td>
    9.                           <td><input type="text" name="name" value="<?php echo $article['name']; ?>" /></td>
    10.                           </tr>
    11.                            <?php endforeach; ?>
    12.                            <tr><td><input type="submit" value="Save" /></td></tr>
    13.                          </form>
    14.                          </table>
    15.                        

    Говорит то что данные успешно обновлены, но вот по факту в базе изменений никаких.
     
  2. EvilScorpion

    EvilScorpion Новичок

    С нами с:
    15 окт 2016
    Сообщения:
    44
    Симпатии:
    1
    Почему то форма не передает значения ID
     
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    1)
    расширение mysql_ устарело и в современных версиях PHP не работает. Замените на mysqli_, это не сложно.
    2)
    PHP:
    1. $id = $_POST["id"];
    2. $parent_id = $_POST["parent_id"];
    3. $name = $_POST["name"];
    4. $result = mysql_query("UPDATE `categories` SET `parent_id`='".$parent_id."', `name`='".$name."' WHERE `id`='".$id."'") or die (mysql_error());
    Этот запрос уязвим к SQL-инъекции, потому что данные вставляются "как есть", это плохо.

    3)
    Так делать нельзя:
    HTML:
    1. </form>
    Форма снаружи должна быть.

    4)Вот это:
    HTML:
    1. <input type="none" name="id" style="display:none;"/><?php echo $article['id']; ?>
    замените на:
    HTML:
    1. <input type="hidden" name="id"/><?php echo $article['id']; ?>
     
    EvilScorpion нравится это.
  4. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Если код не работает нужно закоментировать всё и раскоментировать построчно и проверять работает или нет. Выводить при необходимости на экран индикационную информацию. Для начала посмотри передаются ли переменные, потом выполняется ли запрос...
    ну и такое всё.. что учить тебя чтоли :)
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Если код не работает, нужно расставить брейкпоинты и сделать трассировку с просмотром скоупов и, опционально, коллстэка. Дебажить надо через дебаггер, а не через расстановку комментариев и выводы данных на экран.

    А какое невероятное удовольствие дебажить по описанной вами методе код, отдающий строго структурированные данные какому-нибудь аяксу..ммм... Нет, спасибо.

    xDebug настраивается за 5-10 минут. И потом, вот чесслово, экономит, на долгой дистанции, целые часы на отладке.
     
  6. EvilScorpion

    EvilScorpion Новичок

    С нами с:
    15 окт 2016
    Сообщения:
    44
    Симпатии:
    1
    PHP:
    1. <h1>Редактировать</h1>
    2.                         <form id="update_from" action="update_cat.php" method="POST">
    3.                         <table>    
    4.                           <tr> <td>ID</td><td>Parent_ID</td><td>Name</td> </tr>
    5.                           <?php foreach ($articles as $article): ?>
    6.                           <tr>
    7.                           <td><input type="hidden" name="update_id" value="<?php echo $article['id']; ?>"/><?php echo $article['id']; ?></td>
    8.                           <td><input type="text" name="update_parent_id" value="<?php echo $article['parent_id']; ?>"/></td>
    9.                           <td><input type="text" name="update_name" value="<?php echo $article['name']; ?>" /></td>
    10.                           </tr>
    11.                            <?php endforeach; ?>
    12.                            <tr><td><input id="update"  type="submit" value="save" /></td></tr>
    13.                          </table>
    14.                           </form>
    15.            
    PHP:
    1. require_once ($_SERVER['DOCUMENT_ROOT'].'/database.php'); // подключаем скрипт
    2.  
    3. $link = mysqli_connect($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass']); // Соединение с MySQL
    4. mysqli_select_db ($link ,$INFO['sql_database'] ); // Выбор базы данных
    5.  
    6.  
    7.  
    8.  
    9. $id = mysqli_real_escape_string($link ,$_POST['update_id']);
    10. $parent_id = mysqli_real_escape_string($link ,$_POST['update_parent_id']);
    11. $name = mysqli_real_escape_string ($link ,$_POST['update_name']);
    12.  
    13. if(isset($_POST['update_parent_id'])){
    14.     // ...
    15. } else {
    16.     echo 'Параметра ID - Нету!';
    17. }
    18.  
    19. if($id !="" || $parent_id !="" || $name!="") {
    20.     $result = mysqli_query($link ,"UPDATE `categories` SET `parent_id`='$parent_id', `name`='$name' WHERE  `id`='$id'") or die("Ошибки запроса: " . mysqli_error());
    21.     if ($result)
    22.     {
    23.     echo "Данные успешно обновлены.";
    24.     }
    25.     else
    26.     {
    27.     echo "Данные не обновлены!";
    28.     }
    29.     }
    30. else {
    31.     echo "ERROR";
    32. }
    33.  
    34. mysqli_close($link);
    все ровно не работает. Почему форма значение ID вообще не передает. Как буто он её вообще не видит.
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А остальные нормально передаются?
    Вас не смущает, кстати, что у вас в цикле генерятся инпуты с одинаковыми name?

    Сделайте var_dump($_POST);
    Что там лежит?

    По части остальных пунктов - все отлично, кроме одного момента. Вы не указали кодировку подключения к БД. Это важно. Не в решении вашей проблемы, а просто, очень важно. Кодировка скрипта, соединения с базой, данных в базе и кодировка отдаваемой страницы должны быть идентичны. В идеале - везде UTF-8.
     
    EvilScorpion нравится это.
  8. EvilScorpion

    EvilScorpion Новичок

    С нами с:
    15 окт 2016
    Сообщения:
    44
    Симпатии:
    1
    А вот еще раз проверил, с выше скриптом все тоже самое, только теперь ID передает, все передает, но факт то что база не обновляется все ровно!

    Вывод "array(3) { ["update_id"]=> string(2) "17" ["update_parent_id"]=> string(1) "4" ["update_name"]=> string(24) "Недвижимость" } Параметра ID - есть!Данные успешно обновлены." а в базе тишина...
     
  9. EvilScorpion

    EvilScorpion Новичок

    С нами с:
    15 окт 2016
    Сообщения:
    44
    Симпатии:
    1
    эмм, по var_dump($_POST); я понял он только передает последнее значение, т.е последнею строку... на данный момент обновляется только она. Почему остальные не обновляются ?
     
  10. EvilScorpion

    EvilScorpion Новичок

    С нами с:
    15 окт 2016
    Сообщения:
    44
    Симпатии:
    1
    @Fell-x27 Спасибо за помощь.
    Разобрался, сделал так:
    PHP:
    1.                <?php foreach ($articles as $article): ?>
    2.                         <form id="update_from" action="update_cat.php" method="POST">
    3.                         <table>    
    4.        
    5.                           <tr>
    6.                           <td><input type="hidden" name="update_id" value="<?php echo $article['id']; ?>"/><?php echo $article['id']; ?></td>
    7.                           <td><input type="text" name="update_parent_id" value="<?php echo $article['parent_id']; ?>"/></td>
    8.                           <td><input type="text" name="update_name" value="<?php echo $article['name']; ?>" /></td>
    9.                           <td><input id="update"  type="submit" value="UPDATE" /></td>
    10.                           </tr>
    11.                          </table>
    12.                      </form>
    13.              <?php endforeach; ?>
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Потому что у вас генерируются строки одинаковым name, и, в итоге, получается, что будь их хоть триста, но в php придут только те, у которых имена уникальные.

    Нет, не разобрался. У тебя получается теперь, что на странице пачка форм, в каждой форме по таблице однострочной.
    За один проход ты все серверу не отдашь. Оно так не работает, можно только оду форму за раз отослать. Ты, конечно, сделал для каждой такой таблицы свою кнопку апдейта, но разве это круто? А 200 строк надо будет обновить? 200 кнопок нажимать теперь?

    Не, это не путь джедая. Путь джедая такой:

    PHP:
    1.  <form id="update_from" action="update_cat.php" method="POST">
    2.                         <table>  
    3.                           <tr> <td>ID</td><td>Parent_ID</td><td>Name</td> </tr>
    4.                           <?php foreach ($articles as $article): ?>
    5.                           <tr>
    6.                           <td><input type="hidden" name="articles[<?php echo $article['id'] ?>][name]" value="<?php echo $article['id']; ?>"/><?php echo $article['id']; ?></td>
    7.                           <td><input type="text" name="articles[<?php echo $article['id'] ?>][update_parent_id]" value="<?php echo $article['parent_id']; ?>"/></td>
    8.                           <td><input type="text" name="articles[<?php echo $article['id'] ?>][update_name]" value="<?php echo $article['name']; ?>" /></td>
    9.                           </tr>
    10.                            <?php endforeach; ?>
    11.                            <tr><td><input id="update"  type="submit" value="save" /></td></tr>
    12.                          </table>
    13.                           </form>
    Попробуй с такой штукой сделать var_dump. Совсем другая тема, а?
    --- Добавлено ---
    Если все пройдет как надо, у тебя на сервер придет двухмерный массив, где первый ключ будет такой же, как у идентификатора строки, а второй - как у идентификатора инпута в колонке.
    Осталось только его обработать.
     
  12. EvilScorpion

    EvilScorpion Новичок

    С нами с:
    15 окт 2016
    Сообщения:
    44
    Симпатии:
    1
    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" } } }

    Получается так, как теперь его обработать? то ))
     
  13. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    не наглей. напряги жопу хоть немного. Вот сюда тебе надо.
     
  14. EvilScorpion

    EvilScorpion Новичок

    С нами с:
    15 окт 2016
    Сообщения:
    44
    Симпатии:
    1
    PHP:
    1. $id = $_POST['update_id'];
    2. $parent_id = $_POST['update_parent_id'];
    3. $name =  $_POST['update_name'];
    4.  
    5. if($id !="" || $parent_id !="" || $name!="") {
    6.         $id_count = count($id);
    7.         for ($i=0; $i<$id_count; $i++){
    8.         $result = mysqli_query($link ,"UPDATE `categories` SET  `parent_id`='".$parent_id[$i]."', `name`='".$name[$i]."' WHERE  `id`='".$id[$i]."'") or die("Ошибки запроса: " . mysqli_error());
    9.         }
    Сделал так, работает нормально. Но вот как если добавляю защиту
    $id = mysqli_real_escape_string( $link ,$_POST['update_id']);
    Выводит ошибку "Warning: mysqli_real_escape_string() expects parameter 2 to be string, array given in "
     
  15. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    говорит, что mysqli_real_escape_string() ожидает второй параметр. Видимо в $_POST['update_id'] пусто.
     
  16. EvilScorpion

    EvilScorpion Новичок

    С нами с:
    15 окт 2016
    Сообщения:
    44
    Симпатии:
    1
    Читать я умею!!!
     
  17. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Это замечательно. Значит нужно сделать так, чтобы mysqli_real_escape_string() получил второй параметр и тогда всё должно заработать.
    Выведи на экран $_POST['update_id']. Если в нём не пусто, то присвой его переменной и вставь переменную, а если пусто, то сделай так, чтобы было не пусто.
     
  18. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ты перед этим делал вардамп поста. Есть там $_POST['update_id']? Нет. Там есть $_POST['articles'], в каждой ячейке которого свой $_POST['articles'][N]['update_id']. Значит надо по нему в цикле экранирование провести. Ты не просто копипасти код, даже свой, ты вникай, что он делает.

    Бро, ты сам-то понял, что сказал? Там проблема совсем другая.
     
  19. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Я то понял. Я подумал, что может быть есть какой-то особый синтаксис для вставки элемента массива, вроде фигурных скобок или чего то еще.
    Поэтому, если в $_POST['update_id'] что то есть, чтобы не заморачиваться с синтаксисом, просто присвоить это значение переменной и вставить переменную вторым параметром. А если значение пустое, то искать почему. Торопился я...
     
  20. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Он есть. Но это тут не при чем опять же. Проблема в том, что массив стал двухмерным, а автор про это забыл.