Не работает INSERT INTO, почему?
В один момент, файл добавления поста перестал работать
<div class="content "> <form action="create.php" method="post" enctype="multipart/form-data"> <input name="name" type="text" placeholder="Название"><br> <input name="img" type="file"> <!-- <h2>Постер(горизонтальный), название_файла.формат</h2><br> --> <input name="img_vert" type="file"> <!-- <h2>Постер(вертикальныкй), название_файла.формат</h2><br> --> <input name="trayler" type="file"> <!-- <h2>Трейлер(формат webm), название_файла.формат</h2><br> --> <select name="select"> <?php while ($cate = mysqli_fetch_assoc($categories)) { ?> <option value="<? echo $cate['id'] ?>"><?php echo $cate['title'] ?></option> <?php } ?> </select> <textarea value="<?php echo @$data['state']; ?>" name="state" type="text" placeholder="Доп. информация" cols="30"></textarea><br> <textarea value="<?php echo @$data['sinops']; ?>" name="sinops" type="text" placeholder="Синопсис" cols="30"></textarea><br> <textarea value="<?php echo @$data['roles']; ?>" name="roles" type="text" placeholder="В ролях" cols="30"></textarea><br> <textarea value="<?php echo @$data['creators']; ?>" name="creators" type="text" placeholder="Создатели" cols="30"></textarea><br> <textarea value="<?php echo @$data['awards']; ?>" name="awards" type="text" placeholder="Награды" cols="30"></textarea><br> <button name="do" class="btn-primary" type="submit">Создать</button> </form> <?php if (isset($_POST['do'])) { $fileName = $_FILES['img']['name']; // var_dump($_FILES); // var_dump($_POST); // exit(); $fileTmpName = $_FILES['img']['tmp_name']; $fileType = $_FILES['img']['type']; $fileExt = explode('.', $fileName); $fileActualExt = strtolower(end($fileExt)); if (isset($_SESSION['logged_user'])) { $fileNameNew = uniqid('', true).".".$fileActualExt; $fileDestination = 'assets/project/Постеры/' . $fileNameNew; move_uploaded_file($fileTmpName, $fileDestination); echo "Файл загружен!"; } $fileNameTWO = $_FILES['img_vert']['name']; $fileTmpNameTWO = $_FILES['img_vert']['tmp_name']; $fileTypeTWO = $_FILES['img_vert']['type']; $fileExtTWO = explode('.', $fileNameTWO); $fileActualExtTWO = strtolower(end($fileExtTWO)); if (isset($_SESSION['logged_user'])) { $fileNameNewTWO = uniqid('', true).".".$fileActualExtTWO; $fileDestinationTWO = 'assets/project/Постеры/' . $fileNameNewTWO; move_uploaded_file($fileTmpNameTWO, $fileDestinationTWO); echo "Файл загружен!"; } $fileNameTRAYLER = $_FILES['trayler']['name']; $fileTmpNameTRAYLER = $_FILES['trayler']['tmp_name']; $fileTypeTRAYLER = $_FILES['trayler']['type']; $fileExtTRAYLER = explode('.', $fileNameTRAYLER); $fileActualExtTRAYLER = strtolower(end($fileExtTRAYLER)); if (isset($_SESSION['logged_user'])) { $fileNameNewTRAYLER = uniqid('', true).".".$fileActualExtTRAYLER; $fileDestinationTRAYLER = 'assets/project/Трейлеры/' . $fileNameNewTRAYLER; move_uploaded_file($fileTmpNameTRAYLER, $fileDestinationTRAYLER); echo "Файл загружен!"; mysqli_query($connect, "INSERT INTO `films`(`img`, `img_vertical`, `trayler`,`film_categories`, `name`, `state`, `sinops`, `roles`, `creators`, `awards`) VALUES ('".$fileNameNew."','".$fileNameNewTWO."', '".$fileNameNewTRAYLER."', '".$_POST['select']."', '".$_POST['name']."','".$_POST['state']."','".$_POST['sinops']."','".$_POST['roles']."','".$_POST['creators']."', '".$_POST['awards']."')"); } } ?> </div> |
<div class="content "> <form action="create.php" method="post" enctype="multipart/form-data"> <input name="name" type="text" placeholder="Название"><br> <input name="img" type="file"> <!-- <h2>Постер(горизонтальный), название_файла.формат</h2><br> --> <input name="img_vert" type="file"> <!-- <h2>Постер(вертикальныкй), название_файла.формат</h2><br> --> <input name="trayler" type="file"> <!-- <h2>Трейлер(формат webm), название_файла.формат</h2><br> --> <select name="select"> <?php while ($cate = mysqli_fetch_assoc($categories)) { ?> <option value="<? echo $cate['id'] ?>"><?php echo $cate['title'] ?></option> <?php } ?> </select> <textarea value="<?php echo @$data['state']; ?>" name="state" type="text" placeholder="Доп. информация" cols="30"></textarea><br> <textarea value="<?php echo @$data['sinops']; ?>" name="sinops" type="text" placeholder="Синопсис" cols="30"></textarea><br> <textarea value="<?php echo @$data['roles']; ?>" name="roles" type="text" placeholder="В ролях" cols="30"></textarea><br> <textarea value="<?php echo @$data['creators']; ?>" name="creators" type="text" placeholder="Создатели" cols="30"></textarea><br> <textarea value="<?php echo @$data['awards']; ?>" name="awards" type="text" placeholder="Награды" cols="30"></textarea><br> <button name="do" class="btn-primary" type="submit">Создать</button> </form> <?php if (isset($_POST['do'])) { $fileName = $_FILES['img']['name']; // var_dump($_FILES); // var_dump($_POST); // exit(); $fileTmpName = $_FILES['img']['tmp_name']; $fileType = $_FILES['img']['type']; $fileExt = explode('.', $fileName); $fileActualExt = strtolower(end($fileExt)); if (isset($_SESSION['logged_user'])) { $fileNameNew = uniqid('', true).".".$fileActualExt; $fileDestination = 'assets/project/Постеры/' . $fileNameNew; move_uploaded_file($fileTmpName, $fileDestination); echo "Файл загружен!"; } $fileNameTWO = $_FILES['img_vert']['name']; $fileTmpNameTWO = $_FILES['img_vert']['tmp_name']; $fileTypeTWO = $_FILES['img_vert']['type']; $fileExtTWO = explode('.', $fileNameTWO); $fileActualExtTWO = strtolower(end($fileExtTWO)); if (isset($_SESSION['logged_user'])) { $fileNameNewTWO = uniqid('', true).".".$fileActualExtTWO; $fileDestinationTWO = 'assets/project/Постеры/' . $fileNameNewTWO; move_uploaded_file($fileTmpNameTWO, $fileDestinationTWO); echo "Файл загружен!"; } $fileNameTRAYLER = $_FILES['trayler']['name']; $fileTmpNameTRAYLER = $_FILES['trayler']['tmp_name']; $fileTypeTRAYLER = $_FILES['trayler']['type']; $fileExtTRAYLER = explode('.', $fileNameTRAYLER); $fileActualExtTRAYLER = strtolower(end($fileExtTRAYLER)); if (isset($_SESSION['logged_user'])) { $fileNameNewTRAYLER = uniqid('', true).".".$fileActualExtTRAYLER; $fileDestinationTRAYLER = 'assets/project/Трейлеры/' . $fileNameNewTRAYLER; move_uploaded_file($fileTmpNameTRAYLER, $fileDestinationTRAYLER); echo "Файл загружен!"; mysqli_query($connect, "INSERT INTO `films`(`img`, `img_vertical`, `trayler`,`film_categories`, `name`, `state`, `sinops`, `roles`, `creators`, `awards`) VALUES ('".$fileNameNew."','".$fileNameNewTWO."', '".$fileNameNewTRAYLER."', '".$_POST['select']."', '".$_POST['name']."','".$_POST['state']."','".$_POST['sinops']."','".$_POST['roles']."','".$_POST['creators']."', '".$_POST['awards']."')"); } } ?> </div>
Я пробовал var_dump-ить и $_FILES и $_POST. После первого нажатия на кнопку ничего не выводится. А когда все значения пустые выводит.
Дополнительно:
Не надо ставить как можно больше тэгов. Лучше оставить один, но конкретный, с которым проблема.
См.п.3.1 Регламента.
return $fileNameNewTRAYLER; -> тут мы вышли, дальше код не исполняется!
mysqli_query($connect ... хоть и говнокод, просто поднять перед return
Открой MySQL консоль и выполни эту команду с конкретными параметрами
INSERT INTO `films`(`img`, `img_vertical`, `trayler`,`film_categories`, `name`, `state`, `sinops`, `roles`, `creators`, `awards`) VALUES (................ |
INSERT INTO `films`(`img`, `img_vertical`, `trayler`,`film_categories`, `name`, `state`, `sinops`, `roles`, `creators`, `awards`) VALUES (................
Увидишь ошибку и пояснение. Предположительно там идет нарушение unique key либо констрейнта not null.
- когда я делаю такой запрос, в phpMyadmind всё ок
- Возможно в консоли у тебя все строками и работает а в коде есть типизация и где-то целочисленное не кастуется например. Но я не люблю такие гадания.
Нам нужно точно знать какая ошибка. Посмотри как тут
https://www.w3schools.com/php/func_mysqli_error.asp
PHP ловит ошибку и выдай ее на экран.
Ответы:
Если insert into вызывает ошибку из-за дубликата, это можно решить разными способами.
1. Перед вставкой выполнить запрос, проверяющий, есть ли такая запись.
2. Использовать insert ignore into. Это приведёт к тому, что при наличии дубликата запись не будет добавлена, но при этом выполнение скрипта продолжится.
3. Использовать replace into. В этом случае старая запись будет заменена новой. Но если у какой-то другой таблицы создана связь с этой посредством foreign key с каскадной реакцией, это приведёт к удалению всех ссылающихся на этот ключ записей.
4. Использовать on duplicate key update:
insert into films (img, img_vertical, trayler...) values (:img, :img_vertical, :trayler...) on duplicate key update set img = :imgUpd , img_vertical = :img_verticalUpd, trayler = :trayler итд ...; |
insert into films (img, img_vertical, trayler...) values (:img, :img_vertical, :trayler...) on duplicate key update set img = :imgUpd , img_vertical = :img_verticalUpd, trayler = :trayler итд ...;
прочее
Часть ответа пришлось удалить, поскольку за педагогические услуги мне не платят.
- Не совсем понял...
- Здесь очень вероятна sql-иньекция.
Они случаются не только из-за злобных хакеров.
Пришли случайно данные с какими-нибудь символами и запрос ломается.
Чтобы этого не происходило, запросы следует подготавливать. - SymphoGraph, так вроде запрос подготовлен
- Это он подготовлен вами. Пусть даже аккуратно и кропотливо.
Но ведь вы человек, а не машина. Человек не может за всем уследить.
Машины с этим лучше справляются.
Подготовленный выглядит так:$mysqli = new mysqli(host, username, password, dbname); $stmt = $mysqli->prepare(" INSERT INTO `films` (`img`, `img_vertical`, `trayler`,`film_categories`, `name`, `state`, `sinops`, `roles`, `creators`, `awards`) VALUES (?,?,?,?,?,?,?,?,?,?)" ); $stmt->bind_param("ssssssssss", $fileNameNew, $fileNameNewTWO, $fileNameNewTRAYLER, $data['select'], $data['name'], $data['state'], $data['sinops'], $data['roles'], $data['creators'], $data['awards']); $stmt->execute();
$mysqli = new mysqli(host, username, password, dbname); $stmt = $mysqli->prepare(" INSERT INTO `films` (`img`, `img_vertical`, `trayler`,`film_categories`, `name`, `state`, `sinops`, `roles`, `creators`, `awards`) VALUES (?,?,?,?,?,?,?,?,?,?)" ); $stmt->bind_param("ssssssssss", $fileNameNew, $fileNameNewTWO, $fileNameNewTRAYLER, $data['select'], $data['name'], $data['state'], $data['sinops'], $data['roles'], $data['creators'], $data['awards']); $stmt->execute();
ssssssssss - это десять букв. столько, сколько параметров.
s - значит строка,
i - значит число
Например, если $data['select'] - это число, то надо писать sssissssss - Кирилл, и поставить return $fileNameNewTRAYLER; после mysqli_query(), а не перед!
Неожиданно у него... Такое наглое враньё ни до чего хорошего не доводит.
- AUser0, очень даже доводит. Например, до навыка подготавливать запросы в бд.
- SymphoGraph, ахаха, из всех материалов по SQL инъекциям вы выбрали статью Сенкевича, который опозорился на весь Хабр. Вы сами-то её читали? Это же винегрет из противоречивых заявлений, который по большей части только подтверждает кривой подход автора вопроса, и только в самом конце мельком упоминает подготовленные вопросы, и как всегда криво, как всё у него.
Если рассудок и жизнь дороги вам, держитесь подальше от торфяных болот материалов HTML академии. - Ипатьев, может и так. На этапе принятия их существования это не столь критично.:)
- SymphoGraph, не помогает
- Кирилл, Это помогает не сломать бд.
Теперь вам нужно зайти в логи и посмотреть что там есть на предмет mysqli_sql_exception.Если вы не знаете где лежат логи, можете обернуть $stmt->execute(); в блок try - catch.
Вот так:try{ $stmt->execute(); } catch (mysqli_sql_exception $err) { echo $err->getMessage(); die(); }
try{ $stmt->execute(); } catch (mysqli_sql_exception $err) { echo $err->getMessage(); die(); }
Это просто чтобы сейчас посмотреть. В действующем проекте никаких выводов ошибок на экран быть не должно. Все ошибки следует смотреть в логах. Поэтому не забудьте потом вынуть $stmt->execute(); обратно и удалить try-catch
- Вероятнее всего там будет написано Duplicate entry.
Это означает, что запрос не может быть выполнен, поскольку такая запись уже есть.
В том, разумеется, случае, если в таблице есть уникальное поле. - Ну как не критично-то? Человек способен запомнить за один раз только ограниченное количество информации. Вот он и запомнит всю эту ересь из начала статьи. потом вдруг откроет для себя, что если в $_FILES окажется, например "); Delete from users", то никакой инъекции не случится, и перестанет вообще заморачиваться. А все потому что статья написана неграмотным индюком, который ни разу не запускал код, который пишет.
-
Поэтому не забудьте потом вынуть $stmt->execute();
Мда, я вижу идеи у вас здравые, а вот с практикой не очень.
Давайте я вам открою один секрет.
Вы совершенно правы, что в действующем проекте никаких выводов ошибок на экран быть не должно. Вот только никакие танцы с приседаниями - "оберните, заверните, обратно удалите" для этого не нужны.
Во-первых, чтобы увидеть исключение, его не нужно ловить - РНР отобразит его и так.
Во-вторых, чтобы видеть ошибки на экране, достаточно добавить всего одну строчку на весь сайт, ini_set('display_errors', 1);
Согласитесь, поменять потом единичку на нолик гораздо проще, чем постоянно заворачивать-разворачивать? :)А вот для того, чтобы сами исключения возникали, try catch как раз не поможет. Поэтому в случае, если используется устаревшая версия РНР, для mysqli надо добавить строчку
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
и тогда она начнет выбрасывать исключения самостоятельно. В современных версиях это происходит полностью автоматически.
- Ипатьев, это зависит от того, с какими параметрами запускались set_error_handler, set_exception_handler и register_shutdown_function.
Поэтому ini_set('display_errors', 1) может и не привести к ожидаемому вами эффекту.
В моём случае ошибка придёт только в виде json при обращении по ajax.
Случай автора мне неизвестен, поэтому echo в try-catch более гарантировано. - Ну офигеть какая эрудиция :)
Только непонятно, при чем тут json.У вас просто отличная теоретическая подготовка. Но надо все-таки иногда опускаться из сияющих теоретических высот к грешной земле
может и не привести
Может. Вот только вероятность этого стремится к нулю. Я думаю, даже вы, глядя на этот код, и сами согласитесь, что никакими set_error_handler, set_exception_handler и register_shutdown_function тут и близко не пахнет :)
А вот без установки режима выброса исключений, пиши-не пиши try catch - толку не будет.
Так что давая советы на хабре, рекомендую делать литсо попроще, и вместо сомнительной рекомендации "заворачивать разворачивать", давать более практичную - включить выброс исключений и отображения ошибок. Этого будет, во-первых, достаточно, а во-вторых, не будет приучать к порочной практике использовать трай для вывода ошибок. Таких советов и так слишком много в интернете. Даже в мануале по пхп только в этом году начали исправлять эту ересь. -
Только непонятно, при чем тут json.
При том, что json позволяет смотреть трейс ошибки в эстетичном человекочитаемом виде, а также смотреть логи, используя сортировку и фильтрацию.
Странно, что вам это нужно объяснять.вероятность этого стремится к нулю
Мне неизвестно чем вы её измеряете. Начинающий разработчик вполне мог подключить файл с конфигурацией взятый откуда-нибудь.
Мог и не подключить. Мы этого не знаем.без установки режима выброса исключений, пиши-не пиши try catch - толку не будет
А вот то, что начинающий разработчик установил себе старую версию php я действительно нахожу маловероятным.
к порочной практике использовать трай для вывода ошибок
Рад, что здесь наши мнения совпадают.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Существует несколько причин, по которым оператор INSERT INTO может не работать. Одной из возможных причин может быть неправильно составленный SQL запрос. Проверьте синтаксис вашего запроса, убедитесь, что вы правильно указали название таблицы, поля и значения, которые вы хотите добавить.
Еще одной причиной может быть отсутствие прав доступа к базе данных. Убедитесь, что у вас есть достаточные права для выполнения операции вставки данных в таблицу. Проверьте, что ваш пользователь имеет необходимые разрешения на выполнение оператора INSERT INTO.
Также возможно, что у вас нет соединения с базой данных. Проверьте подключение к базе данных, убедитесь, что вы правильно указали параметры подключения (хост, имя пользователя, пароль и т.д.). Попробуйте перезапустить сервер базы данных и убедиться, что ваше соединение работает корректно.
Если вы все еще испытываете проблемы с оператором INSERT INTO, попробуйте выполнить другие операции вставки данных в таблицу, чтобы выяснить, возникают ли проблемы только с этим оператором или с другими операторами тоже. Проверьте логи базы данных на наличие ошибок или предупреждений, которые могут помочь вам выявить причину проблемы.
Если ничего из вышеперечисленного не помогло, возможно, проблема кроется глубже и требуется более детальное исследование. Обратитесь к специалисту по базам данных или администратору системы, чтобы помочь вам разобраться с проблемой и исправить ее.