Если немного отойти в сторону от насущных потребностей горе-кодеров исправить опечатку и бежать скорее
такжекодить дальше, то вопрос довольно интересный.
В частности, возникает закономерный вопрос - почему $result содержит true, а не false, как должно быть в случае ошибки? Ведь у запроса явно неверный синтаксис? И что означают загадочные слова автора (который не в ладах не только с РНР, но и с русским языком), "Два поля в ней редактируются и я пытаюсь их сохранить, не то, что хочу"?
Ответ, для тех кто хочет научиться программировать на уровне чуть сложнее, чем складывание программ из десятка с трудом заученных операторов, довольно интересный.
Начнем с запроса. Ошибка в нем действительно есть, но не синтаксическая. Дело в том, что оператор AND может использоваться не только в операторе WHERE. Это совершенно самостоятельный логический оператор:
SELECT 1 AND 1;
это совершенно легитимный запрос, который вернет единицу - результат операции
1 AND 1;
.
Точно так же результат этой операции можно присвоить и полю при запросе UPDATE:
UPDATE Users SET logist=1 AND 1 WHERE id=100;
А теперь посмотрим внимательно на исходный запрос. Для удобства я поставил скобки, чтобы показать, в каком порядке выполнятся операторы в запросе:
UPDATE Users SET logist=('$log' AND (sum='$sum')) WHERE id='$form_id'
Что здесь важно понимать?
- - что в выражении sum='$sum' знак "равно" меняет свое значение и из оператора присваивания превращается в оператор сравнения.
- - что существует такое явление, как приоритет выполнения операторов. И у оператора AND приоритет выше, чем у = как оператора присваивания, но ниже, чем у = как оператора сравнения!
- - что существует такое явление, как приведение типов, и mysql по мере сил пытается привести операнды выражения AND ктакому типу, с которым оно может работать (числовому)
таким образом мы
- сначала приводим выражение '$log' к числовому/булеву типу (и получаем скорее всего 0)
- потом получаем результат выражения
sum='$sum'
(1 или 0 в зависимости от того, равно ли содержимое поля sum значению переменной $sum или нет),
- затем выполняем операцию 0 AND 0
- и в итоге мы присваиваем этот 0 полю log
Каковой ноль и объясняет загадочные слова автора
"я пытаюсь сохранить не то, что хочу."
Напоследок хочется рассказать о важности информирования программиста об ошибках.
На самом деле ошибка в этом запросе все-таки есть. И звучит она как
Truncated incorrect DOUBLE value: 'log'
Просто в зависимости от настроек mysql она является либо фатальной, либо просто нотисом. В случае автора это был нотис, который в пхп без специальных средств заметить невозможно.
Но если бы база данных была настроена в strict mode (и у автора вопроса было настроено правильное
отображение ошибок mysqli),то ошибка бы стала фатальной, а поведение кода - более предсказуемым: значение поля не обновилось бы на непонятный нуль, а запрос бы выдал ошибку.