SQL-запрос успешно выполняется через php-скрипт, но не обновляет базу данных [дубликат]

Вопрос или проблема

Как указано в заголовке, при выполнении моего запроса через PHP-скрипт он выполняется успешно, но не обновляет базу данных.

При выполнении запроса напрямую в SSMS он работает на 100% и обновляет запись. Ранее всё работало, но сегодня просто перестало работать, и у меня нет представления, что может вызывать проблему.

Все столбцы в базе данных имеют значения VARCHAR. Ниже приведены запрос и блок выполнения PHP

try {
    odbc_exec(CONNECTION, $SQL_ORDERS_INSERT);
    echo "ЛОКАЛЬНЫЕ ЗАКАЗЫ ДОБАВЛЕНЫ<br><br>";
    odbc_free_result($ORDER_ADD);
catch (\Throwable $th) {
    echo $th->getMessage();
}

Строка SQL-запроса добавлена в переменную $SQL_ORDERS_INSERT:

IF NOT EXISTS (SELECT ORDER_NUMBER FROM dbo.ORDERS WHERE ORDER_NUMBER = 'ELD24-11-50') 
    INSERT INTO dbo.ORDERS (ORDER_NUMBER, TRANSACTION_TYPE, TRANSPORTER_CODE, SUPPLIER_CODE, SOURCE_CODE, CLIENT_CODE, 
    DESTINATION_CODE, ORDER_STATUS, ORDER_DATE, PRODUCT_CODE, TOTAL_WEIGHT, REMAINING, 
    COMMENT_DESCRIPTION_1, COMMENT_1, COMMENT_DESCRIPTION_2, COMMENT_2, COMMENT_DESCRIPTION_3, COMMENT_3, 
    REMAINING_TRUCKS, EMAIL_SENT, ORDER_SUCCESSOR, BARCODE_RECEIVING, SEAL_QUANTITY, SLIP_FIRST_WEIGH, TRUCKS_PER_DAY,
    NWP_SYNC) 
    VALUES ('ELD24-11-50', 'DISPATCHING', 'VRC', 'ELD', 'CHROME ', 'CHR', 
    'WB', 'ACTIVE', '2024-11-01 13:43', 'CHR001', '3100000', '-56400', 
    '', '', '', '', '', '', 
    '-1', '0', '', '0', '2', 'N/A', '999', '0') 
IF EXISTS (SELECT ORDER_NUMBER FROM dbo.ORDERS WHERE ORDER_NUMBER = 'ELD24-11-50') 
UPDATE dbo.ORDERS SET TRANSACTION_TYPE = 'DISPATCHING', 
                      TRANSPORTER_CODE = 'VRC', 
                         SUPPLIER_CODE = 'ELD', 
                           SOURCE_CODE = 'CHROME ', 
                           CLIENT_CODE = 'CHR', 
                      DESTINATION_CODE = 'WB', 
                          ORDER_STATUS = 'COMPLETE', 
                            ORDER_DATE = '2024-11-01 13:43', 
                          PRODUCT_CODE = 'CHR001', 
                          TOTAL_WEIGHT = '3100000', 
                             REMAINING = '-56400', 
                 COMMENT_DESCRIPTION_1 = '', 
                             COMMENT_1 = '',
                 COMMENT_DESCRIPTION_2 = '', 
                             COMMENT_2 = '', 
                COMMENT_DESCRIPTION_3 = '',
                            COMMENT_3 = '', 
                     REMAINING_TRUCKS = '-1', 
                           EMAIL_SENT = '0', 
                      ORDER_SUCCESSOR = '', 
                    BARCODE_RECEIVING = '0', 
                        SEAL_QUANTITY = '2', 
                     SLIP_FIRST_WEIGH = 'N/A', 
                       TRUCKS_PER_DAY = '999', 
                             NWP_SYNC = '1' 
WHERE ORDER_NUMBER = 'ELD24-11-50'

$SQL_ORDERS_INSERT слишком длинный. PHP поддерживает только набор из 256 символов для строки.

Ответ или решение

Когда вы сталкиваетесь с ситуацией, когда SQL-запрос успешно выполняется через PHP-скрипт, но при этом база данных не обновляется, важно учитывать различные аспекты, которые могут влиять на выполнение команды. Давайте подробно рассмотрим возможные причины такой проблемы и предложим решения.

1. Проверка соединения с базой данных

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

$connection = odbc_connect(CONNECTION_STRING, USERNAME, PASSWORD);
if (!$connection) {
    die("Ошибка соединения: " . odbc_errormsg());
}

2. Проверка выполнения SQL запроса

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

$result = odbc_exec($connection, $SQL_ORDERS_INSERT);
if (!$result) {
    die("Ошибка выполнения запроса: " . odbc_errormsg($connection));
}

3. Обработка транзакций

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

odbc_autocommit($connection, OFF);
odbc_exec($connection, $SQL_ORDERS_INSERT);
odbc_commit($connection);

4. Долгий SQL-запрос

Убедитесь, что SQL-запрос не превышает лимит по длине строки. Вы упомянули, что $SQL_ORDERS_INSERT может быть слишком длинным. Хотя PHP поддерживает длину строки более 256 символов, некоторые драйверы и базы данных могут иметь свои ограничения:

  • Разбейте запрос на более мелкие части, если это возможно.
  • Храните запрос в файле или используйте подготовленные выражения для выполнения более крупных SQL-команд.

5. Отладка и логирование

Для выявления точной причины проблемы рекомендуется включить обширное логирование в коде:

// Включение логирования
error_log("SQL запрос: " . $SQL_ORDERS_INSERT);

6. Другие возможные причины

  • Уровень прав доступа: Убедитесь, что у пользователя, от имени которого выполняется запрос, есть права на выполнение необходимых операций INSERT и UPDATE.
  • Триггеры и ограничения: Проверьте, нет ли триггеров или ограничений, которые могут блокировать изменение данных.
  • Изменения в схеме базы данных: Убедитесь, что структура базы данных не изменялась, что могло бы повлиять на запрос.

Заключение

Проблема, когда запрос успешно выполняется, но не обновляет базу данных, может быть обусловлена несколькими факторами, начиная от некорректного соединения и заканчивая вопросами с транзакциями или правами доступа. Следуя вышеописанным шагам, вы сможете выявить и решить проблему с обновлением данных в базе. Работая системно, вы увеличите вероятность успешного выполнения своих SQL запросов через PHP и минимизируете риски возникновения подобных ситуаций в будущем.

Оцените материал
Добавить комментарий

Капча загружается...