Странная нерешенная ошибка PDO: синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL имеется ошибка; - PullRequest
0 голосов
/ 05 июня 2018

У меня есть ошибка в сценарии php:

Неустранимая ошибка PHP: Uncaught PDOException: SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 Ошибка в вашем SQLсинтаксис;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '' в строке 1 в /var/www/html/a.php:143

Обратите внимание, что написано около '' (две одинарные цитаты).Этот скрипт раньше корректно работал на моем предыдущем сервере, но когда я перешел на новый сервер, он продолжал показывать эту ошибку.Моя версия PHP - 7.0, а версия MySQL - 5.7.22.

Как я подключился к mysql:

try{
    $pdo = new PDO("mysql:host=localhost;dbname=db_name", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected successfully";
} catch(PDOException $e){
    echo "Connection failed: " . $e->getMessage();
}

Он печатает: «Подключено успешно».Это строки 142 и 143, которые содержат запросы PDO:

$stmt = $pdo->prepare("SELECT has_paid FROM info WHERE chat_id=".$chat_id);
$stmt->execute();

Я посетил похожие вопросы, но они не помогли.

Как я могу решить эту проблему?

Ответы [ 2 ]

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

Вы неправильно используете подготовленные операторы и открываете себя для уязвимостей SQL-инъекций.

Используйте что-то вроде этого ...

$stmt = $pdo->prepare("SELECT has_paid FROM info WHERE chat_id= :chat_id");
$stmt->bindValue(":chat_id", $chat_id);
$stmt->execute();

Ваша ошибка говорит вам, что именнонеправильно.Ваш SQL-запрос недействителен.Это не проблема с PHP или PDO.Вероятно, $chat_id является пустой переменной.На самом деле, я проверил ваш синтаксис SQL.Это совершенно верно, если для $chat_id указано значение.

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

Я подозреваю, что ваш $chat_id пуст.Таким образом, ваш SQL-запрос в конечном итоге выглядит так:

SELECT has_paid FROM info WHERE chat_id=

Синтаксические ошибки MySQL сообщают о той части SQL-запроса, которая следует - место, где MySQL запутался.В этом случае он сообщает об ошибке около '', поскольку в конце запроса он запутался.Это неудивительно, поскольку для = требуется аргумент с правой стороны.

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

Кстати, мне кажется странным, что вы используете prepare() и execute(), но вы не используете параметры запроса.Вы должны написать код следующим образом:

$stmt = $pdo->prepare("SELECT has_paid FROM info WHERE chat_id=?");
$stmt->execute([$chat_id]);

(Нет необходимости использовать bindValue(), как скажут некоторые люди.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...