Не удается найти ошибку в моем синтаксисе SQL - PHP (см. Руководство по синтаксису?) - PullRequest
0 голосов
/ 26 июня 2018

Проблема:

Я пытаюсь вычесть 0,05 из переменной cash_amount в моей базе данных с именем users, и я вызываю этот файл с помощью ajax, но ничего не происходит. Чтобы это исправить, я открыл файл в своем браузере и получил эту ошибку:

Ошибка:

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '' в строке 1

Код:

PHP:

<?php
session_start();

$servername = "localhost";
$username = "myUser";
$password = "myPass";
$dbname = "myDBname";
$cash_amount = $_SESSION['cash_amount'];

// Create connection

$userid = $_SESSION['id'];

// You must enter the user's id here. /\

$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// Fetch the existing value of the cash_amount against that particular user here. You can use the SELECT cash_amount from users where userid = $userid
$_SESSION['cash_amount'] -= 0.05;
$newAmount = $cash_amount - 0.05;

$sql = "UPDATE users SET cash_amount = $newAmount WHERE id = $userid";
$result = $conn->query($sql);

if($result)
{
   echo "5 cents have been subtracted!";
}
else
{
   echo mysqli_error($conn);
   session_start();
   session_unset();
   session_destroy();
}

$conn->close();
?>

Javascript / AJAX:

function countdownEnded() {
    //make serverscreen dissapear
        document.getElementById('serverScreenWrapper').style.display = 'none';
        document.getElementById('serverScreenWrapper').style.opacity = '0';
        document.getElementById("cashOutNumTwo").style.right = '150%';
        document.getElementById("cashOutNumOne").style.right = '150%';
//start Timer
        setInterval(gameTimer.update, 1000);
//make player move again
        socket.emit('4');
        socket.emit('6');
//make game appear
        document.getElementById('gameAreaWrapper').style.opacity = 1;
//play sound
        document.getElementById('spawn_cell').play();
//cut 5 cents from account - php function
        $.ajax({
        type: "POST",
        url: 'http://cashballz.net/game/5game/subtract5.php',
        data: { },
        success: function (data) {
            alert(data);
        }
    });
}

Моя база данных:

Моя таблица называется users и находится внутри БД casball_accounts.

Вот формат:

id | имя_файла | фамилия | электронная почта | пароль | cash_amount | 4 между | хеш | активный

Вывод:

Я не совсем понимаю, почему мой php-код не работает, я уже пытался найти исправление и нашел слова «SQL-инъекция», но все еще не нашел ошибку. Я продвинутый в JS, но новичок в PHP, поэтому, пожалуйста, потерпите меня. Спасибо!

Ответы [ 4 ]

0 голосов
/ 27 июня 2018

Вы могли бы упростить запрос и сделать

$sql = "UPDATE users SET cash_amount = cash_amount - 0.05 WHERE id = $userid";

Но чтобы избежать возможности SQL-инъекций, я бы предложил изменить код для использования параметризованного и связанного запроса, например,

$sql = "UPDATE users SET cash_amount = cash_amount - 0.05 WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param('s', $userid);
$result = $stmt->execute();
0 голосов
/ 26 июня 2018

Вы интерполируете данные в запросе, который, если это то, что вы хотите, идет с ответом Мостафы и ставит кавычки вокруг этих значений в случае, если они искажены. Это также означает, что вы должны проверить, являются ли они допустимыми значениями, прежде чем вводить их в запрос.

Однако они также могут быть предметом пользовательского ввода где-то в строке, поэтому используйте подготовленные операторы PDO.

$sql = "UPDATE users SET cash_amount = :newAmount WHERE id = :userid";
$conn = $conn->prepare($sql, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);
$conn->execute([':newAmount' => $newAmount, ':userid' => $userid])

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

0 голосов
/ 27 июня 2018

Синтаксическая ошибка жалуется, что есть проблема около '', что означает, что нет ничего после точки, где это запутано. То есть, это запутывается в конце запроса.

Если $userid пусто, ваш SQL-запрос будет

UPDATE users SET cash_amount = ... WHERE id =

Это явно неправильный синтаксис, потому что = требует двух операндов.

Вы должны убедиться, что ваше $userid имеет непустое значение.

Предложения в других ответах пытаются обойти проблему, используя кавычки или параметры запроса, но реальная проблема заключается в том, что вы не проверяете значение $userid перед его использованием.

0 голосов
/ 26 июня 2018

Заменить

   $sql = "UPDATE users SET cash_amount = '$newAmount' WHERE id = '$userid'";

вместо

$sql = "UPDATE users SET cash_amount = $newAmount WHERE id = $userid";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...