0

В SQL-запросе "UPDATE" в поле "WHERE" неправильно сравнивается переменная. Если заменить переменную в поле «WHERE» на значение, запрос сработает:

WHERE `Id` = "1"

Таблица Main:

 Group_IDGroup (int) 1 
 Human_IDHuman (int) 1
 Month_IDMonth (int) 1
 DayID (int) 1
 Pos (int) 0
 Id (int) 1

================================================== ======================

Уже пытался ставить все виды кавычек и апострофов, какие только нашел в похожих темах:

$result[Id]
$result["Id"]
"$result["Id"]"
\"$result[\"Id\"]\"
".$result["Id"]."

Эти варианты не работают, уже пробовал. $query = "UPDATE main SET Pos = '!Pos' WHERE (Id = '{$result['Id']}')"; //$query = 'UPDATE main SET Pos = !Pos WHERE Id="'. $result['Id']. '")';

Вот вырезка куска кода, который не работает.

$sqlchk = mysqli_query ($link, 'SELECT `Group_IDGroup`,` Human_IDHuman`, `Month_IDMonth`,` DayID`, `Pos`,` Id` FROM `Main`');
$result = mysqli_fetch_array ($sqlchk)
$query = 'UPDATE `main` SET` Pos` = "! Pos" WHERE (`Id` ="$result[Id]")';
$sqlposchk = mysqli_query ($link, $query);
  • а знак доллара еще не пытались слитно написать с названием переменной? – Алексей Шиманский Jun 24 '19 at 08:13
  • Это ошибка вставки на форум, а не кода, уже исправил. – Артём Титов Jun 24 '19 at 08:15
  • Не нужно вообще так пытаться делать, потому что это потенциальная sql-инъекция. Используйте параметризованные запросы, а лучше сразу PDO – andreymal Jun 24 '19 at 08:40
  • Дело в том, что я совсем недавно в этой теме и до PDO еще не добрался, а сейчас хочу лишь разобраться, почему у меня не работает правильно написанный код. – Артём Титов Jun 24 '19 at 08:42
  • У вас неправильно написанный код. Правильно написанный (без оглядки на sql-инъекцию) вам уже дали тут: http://sandbox.onlinephpfunctions.com/code/6894d805c58bbd56228b5c92114399e99e6fb765 – andreymal Jun 24 '19 at 08:43
  • @andreymal если удалить круглую закрывающую скобку в конце правда)) – Алексей Шиманский Jun 24 '19 at 08:44
  • Прочитайте пожалуйста полностью то, что я писал. Я пробовал все варианты, которые мне предложили еще до того, как выложил вопрос, ни один из них не сработал. – Артём Титов Jun 24 '19 at 08:44
  • @АртёмТитов попробуем разобрать. ЧТо не так с кодом: $query = "UPDATE \main` SET `Pos` = !Pos WHERE `Id`='{$result['Id']}'";` ? – Алексей Шиманский Jun 24 '19 at 08:46
  • 1
    Потому что нужно не бездумно пробовать что попало, а пользоваться инструментами отладки, читать логи ошибок и разбираться, что сломалось. Если вы не расскажете нам, почему не работает — мы и помочь никак не сможем. По ссылке выше вы можете нажать Execute code и с помощью написанного там echo лично убедиться, что этот код замечательно подставляет переменную. Если у вас не подставляет — значит делайте echo в своём коде и смотрите, чем полученная строка отличается от ожидаемой вами. И, разумеется, расскажите нам о результате отладки — иначе как мы вам поможем? – andreymal Jun 24 '19 at 08:46
  • @СергейМишин В нем только одна проблема: он не обновляет значение в БД. Собственно решение этой проблемы я и ищу. – Артём Титов Jun 24 '19 at 08:48
  • 1
    @АртёмТитов если не обновляет — значит или элемента с таким Id не существует в таблице, или случилась какая-то ошибка, которую вы можете прочитать в логе ошибок. Не зная, что у вас там происходит, мы ничем вам помочь не сможем. По ссылке выше вам уже показали рабочий вариант подставления переменной. – andreymal Jun 24 '19 at 08:50
  • @АртёмТитов а если убрать круглую скобку в конце? А если включить отладку? А если посмотреть логи ошибок? А если вывести результирующий запрос и исполнить его напрямую в любом редакторе sql запроса? – Алексей Шиманский Jun 24 '19 at 08:50
  • Вывод через echo: UPDATE main SET Pos = '!Pos' WHERE (Id = '1') Это полностью совпадает с тем, что я прописывал вручную для поиска ошибки, но вот в чем проблема: Ручной вариант работает, а через переменную нет. – Артём Титов Jun 24 '19 at 08:50
  • @АртёмТитов уверены, что должно быть Pos = '!Pos', а не Pos = !Pos? – Алексей Шиманский Jun 24 '19 at 08:52
  • @АртёмТитов если запросы совпадают, то проблема не в переменной – Алексей Шиманский Jun 24 '19 at 08:52
  • Я так и не понял, в чем было дело, но после того, как изменил !Pos на '!Pos', а затем назад оно заработало. Спасибо большое всем, кто ответил. – Артём Титов Jun 24 '19 at 08:54
  • @АртёмТитов если что-то в кавычках - это строка. И в mysql даже если там стоИт переменная, то это всего лишь строка со значением !Pos. А если писать Pos = !Pos или \Pos` = !`Pos`` - то это воспринимается уже как имя колонки и смена значения работает – Алексей Шиманский Jun 24 '19 at 17:11

1 Answers1

0

Верный ответ:

$query = "UPDATE `main` SET `Pos` = !Pos WHERE (`Id` = '{$result['Id']}')";

Спасибо вот этому человеку https://ru.stackoverflow.com/users/199253/

Alexshev92
  • 3,135