Неустранимая ошибка: неперехваченное исключение PDO: ошибка синтаксиса SQLSTATE [42000] или Access Vilation - PullRequest
0 голосов
/ 13 мая 2018

Я реализую простой код, чтобы проверить, находится ли одно письмо в моей БД и удаляет ли оно его из базы данных. Тем не менее, я получаю это сообщение об ошибке:

Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access
violation: 1064 You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use near 
'@gmail.com' at line 1 in /home/saintpao/public_html/deleteNewsletter.php:24 Stack 
trace: #0 /home/saintpao/public_html/deleteNewsletter.php(24): 
PDOStatement->execute() #1 {main} thrown in /home/saintpao/public_html
/deleteNewsletter.php on line 24

Это conectar.php файл

$dbhost = "myHost";
$dbuser = "myUser";
$dbpass = "myPassword";
$dbname = "myDBName";
try {
    $db = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass,  
                  array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(Exception $error) {
    die("Error conexión BBDD " . $error->getMessage());
}   

И это deleteNewsletter.php файл:

function sanitazeEmail($email){
   if(empty($email)){
       return "";
   }
   $sanitized = filter_var($email, FILTER_SANITIZE_EMAIL);
   if(filter_var($sanitized, FILTER_VALIDATE_EMAIL)){
       return $sanitized;
   }
   return "";
}

$success = false;
$email = sanitazeEmail($_POST['email']);

if(!empty($email)){
    require_once 'conectar.php';

    $sql = "SELECT `email` FROM `emails` WHERE `email` = " . $email;
    $statement = $db->prepare($sql);

    if($statement->execute()){
        $sql_delete = "DELETE FROM `emails` WHERE `email` =" . $email;
        $statement = $db->prepare($sql_delete);
        $success = $statement->execute();
    }
}

Связь с базой данных работает, потому что я могу сделать петицию SELECT в другом файле, поэтому это должно быть проблема с файлом deleteNewsletter.php. Есть идеи, что случилось?

1 Ответ

0 голосов
/ 13 мая 2018

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

$sql_delete = "DELETE FROM `emails` WHERE `email` = :email";
$statement = $db->prepare($sql_delete);
$sucess = $statement->execute([':email' => $email]);

Обратите внимание, что ваш запрос select не очень полезен, и вы можете просто выполнить deleteзапрос.Обратите внимание, что $statement->execute() возвращает оператор, а не результаты.

Как указывал @NigelRen, вы можете использовать $statement->rowCount(), чтобы проверить, была ли удалена строка.

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