За последние 24 часа нас посетили 20813 программистов и 1128 роботов. Сейчас ищут 314 программистов ...

Не работает метод post в PHP7 на Ubuntu

Тема в разделе "PHP для новичков", создана пользователем Blider, 15 май 2017.

Метки:
  1. Blider

    Blider Новичок

    С нами с:
    15 май 2017
    Сообщения:
    9
    Симпатии:
    0
    На локальном сервере apache2 под ubuntu 17.04 при попытке отправить данные в форме методом post, форма просто обновляется и ничего не происходит. Использую PHP7 с расширением mysqli. Файл login.php содержит переменные $db_hostname, $db_username, $db_password, $db_database. Сам код из файла sqltest.php.
    PHP:
    1. <?php
    2. require_once 'login.php';
    3. $db_server = new mysqli($db_hostname, $db_username, $db_password, $db_database);
    4.  
    5. if($db_server->connect_errno) die("Невозможно подключиться к MySQL: " . $db_server->connect_error);
    6.  
    7. if(isset($_POST['delete']) && isset($_POST['isbn']))
    8. {
    9.     $isbn = get_post('isbn');
    10.     $query = "DELETE FROM classics WHERE isbn='$isbn'";
    11.  
    12.     if(!$db_server->query($query))
    13.         echo "Сбой при удалении данных: $query<br />" . $db_server->error . "<br /><br />";
    14. }
    15.  
    16. if (isset($_POST['author']) &&
    17.     isset($_POST['title']) &&
    18.     isset($_POST['category']) &&
    19.     isset($_POST['year']) &&
    20.     isset($_POST['isbn']))
    21.     {
    22.         echo "YES! <br />"; // для проверки
    23.         $author = get_post('author');
    24.         $title = get_post('title');
    25.         $category = get_post('category');
    26.         $year = get_post('year');
    27.         $isbn = get_post('isbn');
    28.  
    29.         $query = "INSERT INTO classics VALUES" . "('$author', '$title', '$category', '$year', '$isbn')";
    30.  
    31.         if(!$db_server->query($query))
    32.             echo "Сбой при вставке данных: $query<br />" . $db_server->error . "<br /><br />";
    33.     }
    34.  
    35. echo "<form action=\"sqltest.php\" method=\"post\"><pre>
    36. Author         <input type=\"text\" name=\"author\" />
    37. Title         <input type=\"text\" name=\"tittle\" />
    38. Category     <input type=\"text\" name=\"category\" />
    39. Year         <input type=\"text\" name=\"year\" />
    40. ISBN         <input type=\"text\" name=\"isbn\" />
    41. <input type=\"submit\" value=\"ADD RECORD\" />
    42. </pre></form>";
    43.  
    44. $query = "SELECT * FROM classics";
    45. $result = $db_server->query($query);
    46. if(!$result) die ("Сбой при доступе к базе данных: " . $db_server->error);
    47.  
    48. for($row_no = 0; $row_no < $result->num_rows; ++$row_no)
    49. {
    50.     $result->data_seek($row_no);
    51.     $row = $result->fetch_assoc();
    52.     echo "
    53.    <pre>
    54. Author:        " . $row['author'] .
    55. "<br />Title:        " . $row['title'] .
    56. "<br />Category:    " . $row['category'] .
    57. "<br />Year:        " . $row['year'] .
    58. "<br />ISBN:        " . $row['isbn'] .
    59. "</pre>
    60.    <form action=\"sqltest.php\" method=\"post\">
    61.    <input type=\"hidden\" name=\"delete\" value=\"yes\" />
    62.    <input type=\"hidden\" name=\"isbn\" value=\"" . $row['isbn'] . "\" />
    63.    <input type=\"submit\" value=\"DELETE RECORD\" />
    64.    </form>
    65.    ";
    66. }
    67.  
    68. $db_server->close();
    69.  
    70. function get_post($var)
    71. {
    72.     return mysqli_real_escape_string($_POST[$var]);
    73. }
    74. ?>
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    И сразу виноваты PHP и Ubuntu :) Как определил, что именно не отправляется post-запрос?
     
    Fell-x27 нравится это.
  3. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
  4. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Ну если считаешь, что проблема в убунте, то дебажить так дебажить. Сноси убунту, ставь центось, а лучше генту. Собирай окружение, пробуй там запустить код. Если ошибка повторится, то деваться некуда, Linux себя исчерпал, идем на FreeBSD. Если и там не судьба, можно попробовать счастья с Солярой. Что-то да сработает! Ведь проблема не может быть в твоем коде, верно?
     
    denis01, Dmitriy A. Arteshuk и mkramer нравится это.
  5. Blider

    Blider Новичок

    С нами с:
    15 май 2017
    Сообщения:
    9
    Симпатии:
    0
    var_dump вывел array(5) { ["author"]=> string(4) "test" ["tittle"]=> string(4) "test" ["category"]=> string(4) "test" ["year"]=> string(4) "2017" ["isbn"]=> string(4) "2017" } , т.е. запрос таки отправляется, но не обрабатывается, т.к. условие с isset'ами не выполняется(должно выводиться YES! в случае выполнения). Я не утверждаю, что проблема в ОС. Если видите проблему в коде, подскажите как её решить. И да, Гугл не помог.
     
  6. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    и опять тупая машина не работает как надо :)
    В скобках после if в твоём случае засчитается истина только при условии, что все эти элементы массива существуют. Если хотя бы один не существует, то будет ложь.
    А теперь смотрим внимательно на отличия индексов в скобках после if и индексов, которые вернул var_damp()...
    В if ['title'], а в var_dump() ["tittle"]
    а вот и ошибка.
    Проблема решена!

    Аплодисменты, овации, скандирование, свист, крик, визг, летающие лифаны...
     
    Blider и Fell-x27 нравится это.
  7. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Добро пожаловать в мир программирования. Тут все всегда работает не как надо. Это норма. Когда все с первого раза работает как часы, это, в 95% случаев, значит, что баги просто еще не всплыли и это вопрос времени. Гугли про отладку. В частности про отладку с помощью xDebug, подцепленного к IDE. БОльшую часть времени ты будешь заниматься именно отладкой. Это норма. Независимо от уровня скила. Когда ты новичок, ты отлаживаешь пачку логических условий в if, когда ты опытный, ты отлаживаешь динамическую перелинковку объектов, в которой где-то теряется ссылка. Меняются задачи, но не меняется суть процесса.

    И помни. Машина права. Ты нет. В 99.999999% случаев машина права. Ты нет. Как мантру повторяй. Почему не 100%? Потому что машину делают люди, и баги тоже имеют место быть. Но вероятность, что ты с ними столкнешься в "stable" версии php на "stable" апаче/fpm под "stable" дистрибутивом linux настолько мала, что более вероятна твоя встреча с живым летающим макаронным монстром.

    Так что даже если кажется, что ты прав, а машина гонит пургу, отметай это. Машина права. Просто ты пока еще не понял, почему она права.
     
    Blider нравится это.
  8. Blider

    Blider Новичок

    С нами с:
    15 май 2017
    Сообщения:
    9
    Симпатии:
    0
    Огромное спасибо, что "ткнули носом" в мою ошибку. Стыдно, что не заметил такую банальность. В процессе нашёл ещё не одну ошибку и всё поправил, а также сменил интерфейс использования mysqli с объектного на процедурный - так воспринимать и учиться по книжке проще:) Огромное вам спасибо. Вот исправленный код, может кому-то поможет не наступить на те же грабли.
    PHP:
    1. <?php
    2. require_once 'login.php';
    3. $db_server = mysqli_connect($db_hostname, $db_username, $db_password, $db_database);
    4.  
    5. if(mysqli_connect_errno($db_server)) die("Невозможно подключиться к MySQL: " . mysqli_connect_error());
    6.  
    7. mysqli_set_charset($db_server, "utf8");
    8.  
    9. if(isset($_POST["delete"]) && isset($_POST["isbn"]))
    10. {
    11.     $isbn = get_post($db_server, 'isbn');
    12.     $query = "DELETE FROM classics WHERE isbn='$isbn'";
    13.  
    14.     if(!mysqli_query($db_server, $query))
    15.         echo "Сбой при удалении данных: $query<br />" . mysqli_error() . "<br /><br />";
    16. }
    17.  
    18. if (isset($_POST["author"]) &&
    19.     isset($_POST["title"]) &&
    20.     isset($_POST["category"]) &&
    21.     isset($_POST["year"]) &&
    22.     isset($_POST["isbn"]))
    23.     {
    24.         $author = get_post($db_server, 'author');
    25.         $title = get_post($db_server, 'title');
    26.         $category = get_post($db_server, 'category');
    27.         $year = get_post($db_server, 'year');
    28.         $isbn = get_post($db_server, 'isbn');
    29.  
    30.         $query = "INSERT INTO classics VALUES" . "('$author', '$title', '$category', '$year', '$isbn')";
    31.  
    32.         if(!mysqli_query($db_server, $query))
    33.             echo "Сбой при вставке данных: $query<br />" . mysqli_error() . "<br /><br />";
    34.     }
    35.  
    36. echo "<form action=\"sqltest.php\" method=\"post\"><pre>
    37. Author         <input type=\"text\" name=\"author\" />
    38. Title         <input type=\"text\" name=\"title\" />
    39. Category     <input type=\"text\" name=\"category\" />
    40. Year         <input type=\"text\" name=\"year\" />
    41. ISBN         <input type=\"text\" name=\"isbn\" />
    42. <input type=\"submit\" value=\"ADD RECORD\" />
    43. </pre></form>";
    44.  
    45. $query = "SELECT * FROM classics";
    46. $result = mysqli_query($db_server, $query);
    47. if(!$result) die ("Сбой при доступе к базе данных: " . mysqli_error());
    48.  
    49. for($row_no = 0; $row_no < mysqli_num_rows($result); ++$row_no)
    50. {
    51.     mysqli_data_seek($result, $row_no);
    52.     $row = mysqli_fetch_assoc($result);
    53.     echo "
    54.    <pre>
    55. Author:        " . $row['author'] .
    56. "<br />Title:        " . $row['title'] .
    57. "<br />Category:    " . $row['category'] .
    58. "<br />Year:        " . $row['year'] .
    59. "<br />ISBN:        " . $row['isbn'] .
    60. "</pre>
    61.    <form action=\"sqltest.php\" method=\"post\">
    62.    <input type=\"hidden\" name=\"delete\" value=\"yes\" />
    63.    <input type=\"hidden\" name=\"isbn\" value=\"" . $row['isbn'] . "\" />
    64.    <input type=\"submit\" value=\"DELETE RECORD\" />
    65.    </form>
    66.    ";
    67. }
    68.  
    69. mysqli_close($db_server);
    70.  
    71. function get_post($link, $var)
    72. {
    73.     return mysqli_real_escape_string($link, $_POST[$var]);
    74. }
    75. ?>
    Проблема решена. Как тему закрыть? Я тут новенький:)
     
  9. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Ну...технически, попросить модератора. Но по факту, закрывать что либо не имеет особого смысла. Мало ли, что народ обсудить захочет. Это ж форум, пускай открыта будет :)
     
  10. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Такого не будет. Ваш код не решает какую-то глобальную проблему. И нужен он только лишь вам. И практическая польза поста сводится к "проверяй что пишешь".
     
    Blider нравится это.