Почему код не может записать в БД определённое строковое значение?
PHP 5.3. мини-проектом, точнее php-скриптом, который должен искать в почтовом ящике определённые письма и формировать на их основе запись в таблице в скрипте есть вызов функции, которой параметров:
createDismissedTask($taskId, $subject, $messageText, $fromEmail, $deadline); |
createDismissedTask($taskId, $subject, $messageText, $fromEmail, $deadline);
ID предварительно созданной записи для задачи, передаю тему письма, передаю текст письма, передаю e-mail отправителя и передаю крайнюю дату выполнения. функцию:
function createDismissedTask($taskId, $title, $description, $fromEmail, $deadline) { // Предполагается, что переменная $setSql определена вне функции global $setSql; // Получаем объект пользователя, который послал письмо, содержащий всю информацию о пользователе $tSource = getUserInfo($fromEmail); $description = mysqli_real_escape_string($setSql, $description); $sql = "UPDATE `tasks` SET `pid` = '33', `zakaz` = '" . $tSource->id . "', `ispol` = '0', `daten` = NOW(), `dateo` = '0000-00-00 00:00:00', `status` = '9', `tupetasks` = '188', `title` = '" . $title . "', `descr` = '" . $description . "', `vote` = '0', `executor` = '0', `ip` = '192.168.11.2', `ball` = '0', `podr` = '33', `podrout` = '" . $tSource->podr . "', `region` = '1', `doch` = '0', `ndatetletask` = '" . $deadline . "', `prigla` = '12865', `lock` = '', `lock_time` = '0000-00-00 00:00:00', `cartridge` = '0', `notify` = '1', `tracker` = '0', `requestid` = '0', `hidden` = '0' WHERE `id` = '" . $taskId . "'"; $res = mysqli_query($setSql, $sql); if ($res) { // Для отладки уже написал, чтобы функция возвращала описание: return "ВЕРНУЛ: " . $description . "!!!!!!!!!!!!!!!!!!!!!!!"; } else { return "Error: " . mysqli_error($setSql); } } |
function createDismissedTask($taskId, $title, $description, $fromEmail, $deadline) { // Предполагается, что переменная $setSql определена вне функции global $setSql; // Получаем объект пользователя, который послал письмо, содержащий всю информацию о пользователе $tSource = getUserInfo($fromEmail); $description = mysqli_real_escape_string($setSql, $description); $sql = "UPDATE `tasks` SET `pid` = '33', `zakaz` = '" . $tSource->id . "', `ispol` = '0', `daten` = NOW(), `dateo` = '0000-00-00 00:00:00', `status` = '9', `tupetasks` = '188', `title` = '" . $title . "', `descr` = '" . $description . "', `vote` = '0', `executor` = '0', `ip` = '192.168.11.2', `ball` = '0', `podr` = '33', `podrout` = '" . $tSource->podr . "', `region` = '1', `doch` = '0', `ndatetletask` = '" . $deadline . "', `prigla` = '12865', `lock` = '', `lock_time` = '0000-00-00 00:00:00', `cartridge` = '0', `notify` = '1', `tracker` = '0', `requestid` = '0', `hidden` = '0' WHERE `id` = '" . $taskId . "'"; $res = mysqli_query($setSql, $sql); if ($res) { // Для отладки уже написал, чтобы функция возвращала описание: return "ВЕРНУЛ: " . $description . "!!!!!!!!!!!!!!!!!!!!!!!"; } else { return "Error: " . mysqli_error($setSql); } }
содержимое аргумента $description не записывается поле `descr`. Поле `descr` имеет тип "longtext"
Может не передаётся текст?
Вот так работает:
$messageText = "Какой-то текст любой длины..."; createDismissedTask($taskId, $subject, $messageText, $fromEmail, $deadline); |
$messageText = "Какой-то текст любой длины..."; createDismissedTask($taskId, $subject, $messageText, $fromEmail, $deadline);
Дополнительно:
Сначала вас обработаем бейсбольной битой, потому, что не используете подготовленные запросы.
// это использовать не нужно, нужно правильно подготавливать запросы с параметрами //$description = mysqli_real_escape_string($setSql, $description); // начинаем подготовку запроса $stmt = mysqli_prepare($setSql, "UPDATE `tasks` SET `pid` = '33', `zakaz` = ?, `ispol` = '0', `daten` = NOW(), `dateo` = '0000-00-00 00:00:00', `status` = '9', `tupetasks` = '188', `title` = ?, `descr` = ?, `vote` = '0', `executor` = '0', `ip` = '192.168.11.2', `ball` = '0', `podr` = '33', `podrout` = ?, `region` = '1', `doch` = '0', `ndatetletask` = ?, `prigla` = '12865', `lock` = '', `lock_time` = '0000-00-00 00:00:00', `cartridge` = '0', `notify` = '1', `tracker` = '0', `requestid` = '0', `hidden` = '0' WHERE `id` = ?"); mysqli_stmt_bind_param($stmt, 'issssi' /* тут нужно определится какого типа данных в колонках таблицы и подставить правильные */ , $tSource->id, $title, $description, $tSource->podr, $deadline, $taskId); // заканчиваем подготовку, выполняем mysqli_execute($stmt); // посмотрите, что там по ошибкам, которые выводит СУБД var_dump(mysqli_error($setSql)); |
// это использовать не нужно, нужно правильно подготавливать запросы с параметрами //$description = mysqli_real_escape_string($setSql, $description); // начинаем подготовку запроса $stmt = mysqli_prepare($setSql, "UPDATE `tasks` SET `pid` = '33', `zakaz` = ?, `ispol` = '0', `daten` = NOW(), `dateo` = '0000-00-00 00:00:00', `status` = '9', `tupetasks` = '188', `title` = ?, `descr` = ?, `vote` = '0', `executor` = '0', `ip` = '192.168.11.2', `ball` = '0', `podr` = '33', `podrout` = ?, `region` = '1', `doch` = '0', `ndatetletask` = ?, `prigla` = '12865', `lock` = '', `lock_time` = '0000-00-00 00:00:00', `cartridge` = '0', `notify` = '1', `tracker` = '0', `requestid` = '0', `hidden` = '0' WHERE `id` = ?"); mysqli_stmt_bind_param($stmt, 'issssi' /* тут нужно определится какого типа данных в колонках таблицы и подставить правильные */ , $tSource->id, $title, $description, $tSource->podr, $deadline, $taskId); // заканчиваем подготовку, выполняем mysqli_execute($stmt); // посмотрите, что там по ошибкам, которые выводит СУБД var_dump(mysqli_error($setSql));
А потом можно, разговаривать.
1. Какие типы данных на тех колонках, куда подставляете входные параметры? Вы уверены, что в Id-шках строки используются (все ли колонки строковые - кавычки расставлены прямо везде).
3. Какие ошибки выдает СУБД после выполнения запроса?
Да нет, он передаётся, т.к. return его мне показывает.
Ага, и он настолько секретный, что показать его нам ну никак невозможно... Скорее всего, именно там косяк, в виде служебных неквотированных символов.
А ещё у MySQL есть такая штука как General Log. Правда, дефолтно отключенный. А если его включить - то можно увидеть текст SQL-запроса, причём именно в том виде, в каком он был получен MySQL-сервером (а не то, что, по твоему мнению, послала программа). Этот текст тоже желательно найти и показать.
1. "issisi" - это верно.
3. Ошибок не выдаёт. Все данные записываются, кроме, блин $description! (((
Надо было в одном месте использовать ".=" вместо"=".
Ошибка, скорее всего, возникает из-за символов в $description, не попадающих в кодировку поля `description`. Такой эффект, например, дают новые эмодзи, требующие utf8mb4.
Также стоит включить режим выброса исключений для всех ошибок Mysqli, перейти на драйвер mysqlnd, если ещё не сделали этого, и использовать подготовленные выражения.
Рекомендую прочитать статью: https://habr.com/ru/articles/662523/
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы код не мог записать определенное строковое значение в базу данных, может быть несколько причин. Вот некоторые из них:
1. Неправильно настроенные параметры подключения к базе данных. Убедитесь, что вы используете правильные учетные данные для подключения к базе данных, а также правильно указали хост, имя базы данных и порт.
$servername = "localhost"; $username = "username"; $password = "password"; $dbname = "database_name"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); }
2. Неправильный запрос SQL. Убедитесь, что ваш запрос SQL корректен и не содержит ошибок. Например, если вы используете переменные в запросе, убедитесь, что они корректно экранированы, чтобы избежать SQL инъекций.
$value = "some value"; $sql = "INSERT INTO table_name (column_name) VALUES ('$value')"; if ($conn->query($sql) === TRUE) { echo "Record inserted successfully"; } else { echo "Error: " . $sql . "<br>" . $conn->error; }
3. Ограничения столбца в базе данных. Проверьте, что длина значения, которое вы пытаетесь записать в базу данных, не превышает максимальное значение, установленное для данного столбца.
4. Проблемы с кодировкой. Убедитесь, что кодировка вашей базы данных и таблицы соответствует кодировке, которую вы используете при записи данных. Например, если вы используете UTF-8, убедитесь, что ваша таблица также использует UTF-8.
5. Ошибки в логике приложения. Проверьте ваш код на наличие ошибок в логике, которые могут препятствовать записи определенного значения в базу данных.
Проверьте все вышеперечисленные аспекты, чтобы убедиться, что проблема не связана с одним из них. Если после этого проблема не будет решена, возможно, вам придется более детально изучить код и процесс записи данных в базу данных, чтобы выявить и исправить ошибку.