Здравствуйте! Уже несколько дней я пытаюсь разобраться с проблемой: код работает корректно с другими данными, но в этом случае возникает ошибка... Вот текст ошибки: <br/> <pre><code class="sql">Ошибка MySQL You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'END), `is_updated` = (CASE `id` END), `is_order` = (CASE `id` END), `is_exist`' at line 1 UPDATE `table` set `count` = (CASE `id` END), `is_updated` = (CASE `id` END), `is_order` = (CASE `id` END), `is_exist` = (CASE `id` END), `price` = (CASE `id` END) WHERE `id` IN () AND `deleted` = 'N'</code></pre> <br/> Код для вставки выглядит следующим образом: <br/> <pre><code class="php">// Все переменные проверял, строки формируются корректно и количество совпадает // Пробовал разные форматы для цифр в кавычках, это не решает проблему! $sqlPartRusklimatProductName .= ($sqlPartRusklimatProductName == '') ? "'{$itemName['id']}'" : ',' . "'{$itemName['id']}'"; $caseIsExist .= " WHEN '{$itemName['id']}' THEN 'Y'"; $caseIsOrder .= " WHEN '{$itemName['id']}' THEN 'N'"; $caseCount .= " WHEN '{$itemName['id']}' THEN '$count'"; $caseUpdated .= " WHEN '{$itemName['id']}' THEN 'Y'"; $casePrice .= " WHEN '{$itemName['id']}' THEN '$price'"; $updateProductRusklimat = "UPDATE `table` set `count` = (CASE `id` $caseCount END), `is_updated` = (CASE `id` $caseUpdated END), `is_order` = (CASE `id` $caseIsOrder END), `is_exist` = (CASE `id` $caseIsExist END), `price` = (CASE `id` $casePrice END) WHERE `id` IN ($sqlPartRusklimatProductName) AND `deleted` = 'N'"; db()->query($updateProductRusklimat);</code></pre> <br/> Что особенно странно, так это то, что в других частях кода все работает исправно. Не могу понять, в чем может быть проблема...
Ошибка в вашем SQL запросе связана с тем, что конструкции `CASE` не формируются корректно. Давайте рассмотрим ваш код и выделим ключевые моменты, которые могут вызывать проблемы. Ваша конструкция `CASE` выглядит так: ```sql .. = (CASE `id` $caseCount END) ``` Однако в случае, если не будет условий (если, например, `$caseCount` будет пустым), вы получите ошибку синтаксиса, потому что конструкция `CASE` не будет завершена верно. ### Возможные причины проблемы: 1. **Пустая конструкция `CASE`**: Если ни одно из значений `id` не подходит, или если переменные `$caseCount`, `$caseUpdated`, `$caseIsOrder`, `$caseIsExist`, и `$casePrice` остались пустыми, результатом будет некорректный синтаксис SQL. В таком случае вы получите что-то вроде: ```sql (CASE `id` END) ``` без условий. 2. **Неправильное формирование списка `id`**: Если `$sqlPartRusklimatProductName` оказывается пустым (например, если нет элементов для обновления), это также приведет к ошибке. ### Рекомендации по исправлению: 1. **Проверка на пустоту**: Перед выполнением запроса убедитесь, что все необходимые переменные не пустые. Если переменные пустые, вам следует пропустить выполнение запроса или обработать это соответствующим образом. 2. **Добавление условия для `CASE`**: Добавьте проверку, чтобы `CASE` имел хотя бы одно условие. Например: ```php if (!empty($caseCount)) { $caseCount = "CASE `id` $caseCount END"; } else { $caseCount = "NULL"; // или какое-то другое значение по умолчанию } ``` 3. **Проверка на наличие `id`**: Убедитесь, что `id` для обновления действительно есть. Если `$sqlPartRusklimatProductName` будет пустым, инициируйте обработку ошибки, чтобы запрос не выполнялся. ### Пример исправленного кода: ```php if ($sqlPartRusklimatProductName != '') { $caseCount = !empty($caseCount) ? "CASE `id` $caseCount END" : "NULL"; $caseUpdated = !empty($caseUpdated) ? "CASE `id` $caseUpdated END" : "NULL"; $caseIsOrder = !empty($caseIsOrder) ? "CASE `id` $caseIsOrder END" : "NULL"; $caseIsExist = !empty($caseIsExist) ? "CASE `id` $caseIsExist END" : "NULL"; $casePrice = !empty($casePrice) ? "CASE `id` $casePrice END" : "NULL"; $updateProductRusklimat = "UPDATE `table` SET `count` = $caseCount, `is_updated` = $caseUpdated, `is_order` = $caseIsOrder, `is_exist` = $caseIsExist, `price` = $casePrice WHERE `id` IN ($sqlPartRusklimatProductName) AND `deleted` = 'N'"; db()->query($updateProductRusklimat); } else { // Обработка случая, когда нет идентификаторов для обновления } ``` Это должно помочь избежать ошибок синтаксиса в вашем SQL запросе.
Судя по обрывкам кода, первый фрагмент выполняется в цикле.
Тогда по тексту ошибки видно, что этот цикл ни разу не выполнялся и в переменных пустые строки.
Главные причины проблем с кодом это наивность и самомнение.
Что самое интересное - в других местах работает нормально...,
- это конечно запредельная наивность.
Начинающие программисты всегда пишут код так, как будто он будет работать в идеальных условиях. Данные всегда приходят корректные и из доверенного источника. "У меня код eval($_GET['command'])" работает отлично, проблем не доставляет!"
А вот когда этот замечательный код перестаёт работать, или начинает делать то, о чем никто не подумал, то глазки нашего разработчика наливаются удивлением и даже обидой - "ну как же так, раньше ведь всё работало!"
А то что это исходно был говнокод, они не думают. И что сейчас даже в первом классе рассказывают про подготовленные выражения они забыли. Или не забыли, а просто отмахнулись - "и так сойдёт!".
Не сошло.