На локальном сервере apache2 под ubuntu 17.04 при попытке отправить данные в форме методом post, форма просто обновляется и ничего не происходит. Использую PHP7 с расширением mysqli. Файл login.php содержит переменные $db_hostname, $db_username, $db_password, $db_database. Сам код из файла sqltest.php. PHP: <?php require_once 'login.php'; $db_server = new mysqli($db_hostname, $db_username, $db_password, $db_database); if($db_server->connect_errno) die("Невозможно подключиться к MySQL: " . $db_server->connect_error); if(isset($_POST['delete']) && isset($_POST['isbn'])) { $isbn = get_post('isbn'); $query = "DELETE FROM classics WHERE isbn='$isbn'"; if(!$db_server->query($query)) echo "Сбой при удалении данных: $query<br />" . $db_server->error . "<br /><br />"; } if (isset($_POST['author']) && isset($_POST['title']) && isset($_POST['category']) && isset($_POST['year']) && isset($_POST['isbn'])) { echo "YES! <br />"; // для проверки $author = get_post('author'); $title = get_post('title'); $category = get_post('category'); $year = get_post('year'); $isbn = get_post('isbn'); $query = "INSERT INTO classics VALUES" . "('$author', '$title', '$category', '$year', '$isbn')"; if(!$db_server->query($query)) echo "Сбой при вставке данных: $query<br />" . $db_server->error . "<br /><br />"; } echo "<form action=\"sqltest.php\" method=\"post\"><pre> Author <input type=\"text\" name=\"author\" /> Title <input type=\"text\" name=\"tittle\" /> Category <input type=\"text\" name=\"category\" /> Year <input type=\"text\" name=\"year\" /> ISBN <input type=\"text\" name=\"isbn\" /> <input type=\"submit\" value=\"ADD RECORD\" /> </pre></form>"; $query = "SELECT * FROM classics"; $result = $db_server->query($query); if(!$result) die ("Сбой при доступе к базе данных: " . $db_server->error); for($row_no = 0; $row_no < $result->num_rows; ++$row_no) { $result->data_seek($row_no); $row = $result->fetch_assoc(); echo " <pre> Author: " . $row['author'] . "<br />Title: " . $row['title'] . "<br />Category: " . $row['category'] . "<br />Year: " . $row['year'] . "<br />ISBN: " . $row['isbn'] . "</pre> <form action=\"sqltest.php\" method=\"post\"> <input type=\"hidden\" name=\"delete\" value=\"yes\" /> <input type=\"hidden\" name=\"isbn\" value=\"" . $row['isbn'] . "\" /> <input type=\"submit\" value=\"DELETE RECORD\" /> </form> "; } $db_server->close(); function get_post($var) { return mysqli_real_escape_string($_POST[$var]); } ?>
Ну если считаешь, что проблема в убунте, то дебажить так дебажить. Сноси убунту, ставь центось, а лучше генту. Собирай окружение, пробуй там запустить код. Если ошибка повторится, то деваться некуда, Linux себя исчерпал, идем на FreeBSD. Если и там не судьба, можно попробовать счастья с Солярой. Что-то да сработает! Ведь проблема не может быть в твоем коде, верно?
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! в случае выполнения). Я не утверждаю, что проблема в ОС. Если видите проблему в коде, подскажите как её решить. И да, Гугл не помог.
и опять тупая машина не работает как надо В скобках после if в твоём случае засчитается истина только при условии, что все эти элементы массива существуют. Если хотя бы один не существует, то будет ложь. А теперь смотрим внимательно на отличия индексов в скобках после if и индексов, которые вернул var_damp()... В if ['title'], а в var_dump() ["tittle"] а вот и ошибка. Проблема решена! Аплодисменты, овации, скандирование, свист, крик, визг, летающие лифаны...
Добро пожаловать в мир программирования. Тут все всегда работает не как надо. Это норма. Когда все с первого раза работает как часы, это, в 95% случаев, значит, что баги просто еще не всплыли и это вопрос времени. Гугли про отладку. В частности про отладку с помощью xDebug, подцепленного к IDE. БОльшую часть времени ты будешь заниматься именно отладкой. Это норма. Независимо от уровня скила. Когда ты новичок, ты отлаживаешь пачку логических условий в if, когда ты опытный, ты отлаживаешь динамическую перелинковку объектов, в которой где-то теряется ссылка. Меняются задачи, но не меняется суть процесса. И помни. Машина права. Ты нет. В 99.999999% случаев машина права. Ты нет. Как мантру повторяй. Почему не 100%? Потому что машину делают люди, и баги тоже имеют место быть. Но вероятность, что ты с ними столкнешься в "stable" версии php на "stable" апаче/fpm под "stable" дистрибутивом linux настолько мала, что более вероятна твоя встреча с живым летающим макаронным монстром. Так что даже если кажется, что ты прав, а машина гонит пургу, отметай это. Машина права. Просто ты пока еще не понял, почему она права.
Огромное спасибо, что "ткнули носом" в мою ошибку. Стыдно, что не заметил такую банальность. В процессе нашёл ещё не одну ошибку и всё поправил, а также сменил интерфейс использования mysqli с объектного на процедурный - так воспринимать и учиться по книжке проще Огромное вам спасибо. Вот исправленный код, может кому-то поможет не наступить на те же грабли. PHP: <?php require_once 'login.php'; $db_server = mysqli_connect($db_hostname, $db_username, $db_password, $db_database); if(mysqli_connect_errno($db_server)) die("Невозможно подключиться к MySQL: " . mysqli_connect_error()); mysqli_set_charset($db_server, "utf8"); if(isset($_POST["delete"]) && isset($_POST["isbn"])) { $isbn = get_post($db_server, 'isbn'); $query = "DELETE FROM classics WHERE isbn='$isbn'"; if(!mysqli_query($db_server, $query)) echo "Сбой при удалении данных: $query<br />" . mysqli_error() . "<br /><br />"; } if (isset($_POST["author"]) && isset($_POST["title"]) && isset($_POST["category"]) && isset($_POST["year"]) && isset($_POST["isbn"])) { $author = get_post($db_server, 'author'); $title = get_post($db_server, 'title'); $category = get_post($db_server, 'category'); $year = get_post($db_server, 'year'); $isbn = get_post($db_server, 'isbn'); $query = "INSERT INTO classics VALUES" . "('$author', '$title', '$category', '$year', '$isbn')"; if(!mysqli_query($db_server, $query)) echo "Сбой при вставке данных: $query<br />" . mysqli_error() . "<br /><br />"; } echo "<form action=\"sqltest.php\" method=\"post\"><pre> Author <input type=\"text\" name=\"author\" /> Title <input type=\"text\" name=\"title\" /> Category <input type=\"text\" name=\"category\" /> Year <input type=\"text\" name=\"year\" /> ISBN <input type=\"text\" name=\"isbn\" /> <input type=\"submit\" value=\"ADD RECORD\" /> </pre></form>"; $query = "SELECT * FROM classics"; $result = mysqli_query($db_server, $query); if(!$result) die ("Сбой при доступе к базе данных: " . mysqli_error()); for($row_no = 0; $row_no < mysqli_num_rows($result); ++$row_no) { mysqli_data_seek($result, $row_no); $row = mysqli_fetch_assoc($result); echo " <pre> Author: " . $row['author'] . "<br />Title: " . $row['title'] . "<br />Category: " . $row['category'] . "<br />Year: " . $row['year'] . "<br />ISBN: " . $row['isbn'] . "</pre> <form action=\"sqltest.php\" method=\"post\"> <input type=\"hidden\" name=\"delete\" value=\"yes\" /> <input type=\"hidden\" name=\"isbn\" value=\"" . $row['isbn'] . "\" /> <input type=\"submit\" value=\"DELETE RECORD\" /> </form> "; } mysqli_close($db_server); function get_post($link, $var) { return mysqli_real_escape_string($link, $_POST[$var]); } ?> Проблема решена. Как тему закрыть? Я тут новенький
Ну...технически, попросить модератора. Но по факту, закрывать что либо не имеет особого смысла. Мало ли, что народ обсудить захочет. Это ж форум, пускай открыта будет
Такого не будет. Ваш код не решает какую-то глобальную проблему. И нужен он только лишь вам. И практическая польза поста сводится к "проверяй что пишешь".