Кто-нибудь знает, где этот код выдает ошибку? - PullRequest
0 голосов
/ 20 сентября 2019

Я получаю эту ошибку из следующего кода.Это простой запрос на вставку в базу данных из формы ввода на сайте.

Error: INSERT INTO email_contacts (name1, email1, cType) VALUES (?, ?, 'buyer')
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '?, ?, 'buyer')' at line 1

Кто-нибудь может вызвать эту ошибку?

Я использовал этот же код на разных сайтах, и онработал просто отлично.Не уверен, что я просто пропускаю что-то маленькое или что.

$email = $_POST['email'];
$name = $_POST['name'];

//database info
$servername = "localhost";
$username = "myuser";
$password = "myPassword";
$db = "test";

// Create connection
$conn = new mysqli($servername, $username, $password, $db);

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

$sql = "INSERT INTO email_contacts (name1, email1, cType) VALUES (?, ?, 'buyer')";
$stmt = $conn -> prepare($sql);
$stmt->bind_param("ss",$name,$email);
$stmt->execute();

if($conn -> query($sql) === TRUE){
    echo "SUCCESS";
}else{
    echo "Error: ".$sql . "<br>" . $conn ->error;
}
$conn ->close();

следует вставить в таблицу email_contacts и повторить "success"

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

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

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

Код проверки ошибок, который вы добавили,

if($conn -> query($sql) === TRUE){

пытается выполнить ваш запрос снова (что само по себе не имеет смысла) и без подготовленного оператора.И, естественно, вы получаете эту ошибку, поскольку query() не понимает местозаполнители.

По иронии судьбы, код для проверки ошибки является причиной, по которой вы получаете ошибку.

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

  • это сделает ваш код менее раздутым (так как вам не нужно будет добавлять любой такой кодвообще)
  • сделает ваш код дружественным к производству (как, например, грубая ошибка, выпадающая на живом сервере)
  • случайно,он ответит на ваш вопрос (в случае реальной ошибки базы данных) - , где ваш код выдает ошибку.Ваш текущий код, так сказать, не имеет «свидетельства о рождении», и в большой кодовой базе будет действительно невозможно определить, в какой части он потерпел неудачу - это может быть любой запрос в любом файле.В то время как правильно генерируемая ошибка всегда содержит имя файла и номер строки, а также трассировка стека , которая показывает точный путь, по которому следовал код, который привел к ошибке.

Для этого необходимо добавить следующую строку в код подключения mysqli:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Пожалуйста, ознакомьтесь с моими статьями по Отчетам об ошибках PHP и , как сообщать об ошибках вmysqli для более подробного объяснения

0 голосов
/ 20 сентября 2019

Ваша версия MariaDB поддерживает подготовленные заявления?Сообщение об ошибке в основном говорит о том, что первый знак вопроса является неожиданным в этой позиции.

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