Почему код не может записать в БД определённое строковое значение?

Ссылка скопирована
12 февраля 2026 1 ответ

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-сервером (а не то, что, по твоему мнению, послала программа). Этот текст тоже желательно найти и показать.

  • alexalexes, Спасибо. Всё по делу!
    1. "issisi" - это верно.
    3. Ошибок не выдаёт. Все данные записываются, кроме, блин $description! (((

    Надо было в одном месте использовать ".=" вместо"=".

  • Ошибка, скорее всего, возникает из-за символов в $description, не попадающих в кодировку поля `description`. Такой эффект, например, дают новые эмодзи, требующие utf8mb4.
    Также стоит включить режим выброса исключений для всех ошибок Mysqli, перейти на драйвер mysqlnd, если ещё не сделали этого, и использовать подготовленные выражения.
    Рекомендую прочитать статью: https://habr.com/ru/articles/662523/

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Виктор Sys Ответ

    Для того чтобы код не мог записать определенное строковое значение в базу данных, может быть несколько причин. Вот некоторые из них:

    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);
    }

    $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-&gt;error;
    }

    $value = "some value"; $sql = "INSERT INTO table_name (column_name) VALUES ('$value')"; if ($conn-&gt;query($sql) === TRUE) { echo "Record inserted successfully"; } else { echo "Error: " . $sql . "<br>" . $conn-&gt;error; }

    3. Ограничения столбца в базе данных. Проверьте, что длина значения, которое вы пытаетесь записать в базу данных, не превышает максимальное значение, установленное для данного столбца.

    4. Проблемы с кодировкой. Убедитесь, что кодировка вашей базы данных и таблицы соответствует кодировке, которую вы используете при записи данных. Например, если вы используете UTF-8, убедитесь, что ваша таблица также использует UTF-8.

    5. Ошибки в логике приложения. Проверьте ваш код на наличие ошибок в логике, которые могут препятствовать записи определенного значения в базу данных.

    Проверьте все вышеперечисленные аспекты, чтобы убедиться, что проблема не связана с одним из них. Если после этого проблема не будет решена, возможно, вам придется более детально изучить код и процесс записи данных в базу данных, чтобы выявить и исправить ошибку.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно