@ikfah012
Не самый умный парень в этом чате

Почему код не вносит запись в бд?

Добрый день.
Есть таблица такого вида, которая в цикле выводит данные из бд. Два поля в ней редактируются и я пытаюсь их сохранить, не то, что хочу.
<tbody><form method="post" action="tost.php" name="save">
   <tr>
     <td><div class="alert <?=$colorClass?>" role="alert"><?=$users['id']?></div></td>
             <input type="hidden" name="form_id" value="<?=$users['id']?>">
     <td><div class="alert <?=$colorClass?>" role="alert"><?=htmlspecialchars($users['delivery_adress'], ENT_QUOTES)?></div></td>
      <td><div class="alert <?=$colorClass?>" role="alert"><?=htmlspecialchars($users['delivery_time'], ENT_QUOTES)?></div></td>
      <td><div class="alert <?=$colorClass?>" role="alert"><?=htmlspecialchars($users['surname'], ENT_QUOTES)?> <?=htmlspecialchars($users['name'], ENT_QUOTES)?> <?=htmlspecialchars($users['second_name'], ENT_QUOTES)?></div></td>
      <td><input class="form-control" size="5" type="text" name="sum" value="<?=htmlspecialchars($users['sum'], ENT_QUOTES)?>"></td>
      <td><input class="form-control" size="5" type="text" name="logist" value="<?=htmlspecialchars($users['logist'], ENT_QUOTES)?>"></td>
      <td><div class="alert <?=$colorClass?>" role="alert"><?=htmlspecialchars($users['manager_comment'], ENT_QUOTES)?></div></td>
      <td><button type="submit" name="save" class="btn btn-xs btn-light mb-3">Save</button></td>
      <td><button type="button" name="delivery_status" class="btn btn-xs btn-success mb-3" value="1">Отдал</button></td>
      <td><button type="button" name="delivery_status" class="btn btn-xs btn-danger mb-3" value="2">Отказ</button></td>
      <td><button type="button" formmethod="post" name="delivery"  class="btn btn-xs btn-warning mb-3" data-toggle="modal" data-target="#exampleModalLong">Перенос</button></td>
</tr></form>
</tbody>

И вот файл, который её обрабатывает.
<?php
require_once('db.php');
if(isset($_POST['save']))
{
global $link;
$link->set_charset("utf8");
$form_id = (int)$_POST['form_id'];
$sum = (int)$_POST['sum'];
$log = strip_tags(trim($_POST['logist']));
$SQL = "UPDATE Users SET logist='$log' AND sum='$sum' WHERE id='$form_id'";
$result = mysqli_query($link, $SQL);
var_dump($result);
}
?>

И вот результат вардампа: "bool(true)". Что пошло не так?
Вардамп $SQL:
string(60) "UPDATE Users SET logist='test1' AND sum='20001' WHERE id='524'"
  • Вопрос задан
  • 156 просмотров
Решения вопроса 1
idShura
@idShura
У тебя ошибка в запросе (Вместо AND должна быть запятая):
UPDATE Users SET logist='$log' AND sum='$sum' WHERE id=$form_id

Измени на:
UPDATE Users SET logist='$log', sum='$sum' WHERE id=$form_id
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Если немного отойти в сторону от насущных потребностей горе-кодеров исправить опечатку и бежать скорее такжекодить дальше, то вопрос довольно интересный.

В частности, возникает закономерный вопрос - почему $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 ктакому типу, с которым оно может работать (числовому)

таким образом мы
  1. сначала приводим выражение '$log' к числовому/булеву типу (и получаем скорее всего 0)
  2. потом получаем результат выражения sum='$sum' (1 или 0 в зависимости от того, равно ли содержимое поля sum значению переменной $sum или нет),
  3. затем выполняем операцию 0 AND 0
  4. и в итоге мы присваиваем этот 0 полю log

Каковой ноль и объясняет загадочные слова автора "я пытаюсь сохранить не то, что хочу."

Напоследок хочется рассказать о важности информирования программиста об ошибках.

На самом деле ошибка в этом запросе все-таки есть. И звучит она как Truncated incorrect DOUBLE value: 'log'
Просто в зависимости от настроек mysql она является либо фатальной, либо просто нотисом. В случае автора это был нотис, который в пхп без специальных средств заметить невозможно.
Но если бы база данных была настроена в strict mode (и у автора вопроса было настроено правильное отображение ошибок mysqli),то ошибка бы стала фатальной, а поведение кода - более предсказуемым: значение поля не обновилось бы на непонятный нуль, а запрос бы выдал ошибку.
Ответ написан
@Kutuzov_ska
А в чем проблема то? Запрос UPDATE и будет возвращать true, это же не select запрос.
$form_id = (int)$_POST['form_id'];
$sum = (int)$_POST['sum'];
Вы пишете INT перед данынми, а в запросе их как стринговые указываете

попробуйте ' ' убрать у sum

"UPDATE Users SET logist='$log' AND sum=$sum WHERE id=$form_id";
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы