Member 13637584 Ответов: 2

Может ли кто-нибудь найти проблему с SQL-оператором?


Привет, я недавно решил эту проблему - но, конечно же, я потерял свою работу

Я работаю над запросом обновления, который вставляет точки в таблицу

В настоящее время у меня есть var_dump всех возможных переменных, и все они верны.

Оператор SQL также возвращается как TRUE, но он ничего не меняет в базе данных

Кто-нибудь может помочь как можно скорее?

Что я уже пробовал:

while ($dbRow=$dbQuery->fetch(PDO::FETCH_ASSOC)) {
$points = $dbRow['Points'];
$pointsDeduction =-20;
 }

if($daysLeft == $End) {
		 $stmt = $conn->prepare("UPDATE Profile SET Points = $points - $pointsDeduction WHERE UserID= $UserID WHERE UserID= $UserID");
		$dbQuery->execute();
	echo" - 20 points will be deducted</h4></center></h4>";
  }

Paulo Zemek

Не уверен насчет этого кода, так как я никогда не использовал PHP, но есть много вещей, которые я вижу, которые не совсем хороши.

Во-первых: у вас есть WHERE UserID= $UserID WHERE UserID... Я не думаю, что двое вместе когда-нибудь будут работать.

В любом случае, разве вам не нужно совершить транзакцию или что-то в этом роде? Опять же, я не знаю PHP, но большинство баз данных требуют фиксации, иначе все действия были бы откатаны.

Maciej Los

Хорошая мысль!
Предложение Where не может встречаться дважды.

2 Ответов

Рейтинг:
2

Patrice T

Просто чтобы знать, что происходит, я бы сделал пару изменений:

// the loop will do something useful only on last row
while ($dbRow=$dbQuery->fetch(PDO::FETCH_ASSOC)) {
  $points = $dbRow['Points'];
  $pointsDeduction =-20; // this is constant value and should be out of loop
}

if($daysLeft == $End) {
  $stmt = $conn->prepare("UPDATE Profile SET Points = $points - $pointsDeduction WHERE UserID= $UserID WHERE UserID= $UserID");
  $dbQuery->execute();
  echo" - 20 points will be deducted</h4></center></h4>";
}

Этот "$точек $pointsDeduction" перевести на "$очки - -20" и "$очков + 20".
Вы в этом уверены ?
Ваша команда SQL повторяет предложение where 2 раза.

Я бы изменил команду sql на что-то вроде:
$stmt = $conn->prepare("UPDATE Profile SET Points = Points - 20 WHERE UserID= $UserID");

-----
Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.
while ($dbRow=$dbQuery->fetch(PDO::FETCH_ASSOC)) {
  $points = $dbRow['Points'];
  $pointsDeduction =-20;
}

if($daysLeft == $End) {
  $stmt = $conn->prepare("UPDATE Profile SET Points = $points - $pointsDeduction WHERE UserID= $UserID WHERE UserID= $UserID");
  $dbQuery->execute();
  echo" - 20 points will be deducted</h4></center></h4>";
}

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]


Maciej Los

Дважды где оговорка?

Patrice T

В этой строке

$stmt = $conn->prepare("UPDATE Profile SET Points = $points - $pointsDeduction WHERE UserID= $UserID WHERE UserID= $UserID");

Рейтинг:
0

Jochen Arndt

Как уже упоминалось у вас их два WHERE статьи. Это не сработает.
Вы также передаете вычисленное значение, которое также может работать не так, как ожидалось.

Это должно сработать:

if($daysLeft == $End) {
    newPoints = $points - 20;
    $stmt = $conn->prepare("UPDATE Profile SET Points=$newPoints WHERE UserID=$UserID");
    $dbQuery->execute();
}
Когда $UserID это не числовое значение, оно должно быть заключено в кавычки (должно быть, когда оно может содержать пробелы):
$stmt = $conn->prepare("UPDATE Profile SET Points=$newPoints WHERE UserID='$UserID'");
Но тогда вы должны использовать параметризованные запросы вместо этого, когда $UserID это из пользовательского ввода, чтобы избежать SQL-инъекций.