2016-12-16 3 views
-1

У меня есть следующий код, который работал на предыдущем сайте, но больше не работает. Я изменил значения на значения, которые мне теперь нужно вводить, и дважды проверял их имена.Ошибка Mysql - У вас есть ошибка в синтаксисе SQL

<?php 
/* 
Attempt MySQL server connection. Assuming you are running MySQL 
server with default setting (user 'root' with no password) 
*/ 
$link = mysqli_connect("localhost", "***", "***", "***"); 

// Check connection 
if($link === false){ 
    die("ERROR: Could not connect. " . mysqli_connect_error()); 
} 

// Escape user inputs for security 
$cname = mysqli_real_escape_string($link, $_POST['cname']); 
$name = mysqli_real_escape_string($link, $_POST['name']); 
$contact = mysqli_real_escape_string($link, $_POST['contact']); 
$reason = mysqli_real_escape_string($link, $_POST['reason']); 



// attempt insert query execution 
$sql = "INSERT INTO keys (cname, name, contact, reason) VALUES ('$cname', '$name', '$contact', '$reason')"; 
if(mysqli_query($link, $sql)){ 
    echo "<script>alert('User added!')</script>"; 

    echo "<script>window.open('index.php','_self')</script>"; 
} else{ 
    echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); 
} 

// close connection 
mysqli_close($link); 
?> 

Все, что я получаю следующее сообщение об ошибке при отправке формы:

Mysql ошибка - У Вас есть ошибка в вашем SQL синтаксиса

Что я делаю неправильно?

+1

'keys' является зарезервированным словом mysql. –

+0

@GurwinderSingh Неверный синтаксис; MySQL использует backticks, а не скобки. См. Https://dev.mysql.com/doc/refman/5.5/en/identifiers.html. –

ответ

2

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

$sql = "INSERT INTO `keys` (`cname`, `name`, `contact`, `reason`) VALUES ('$cname', '$name', '$contact', '$reason')"; 

Смотрите документацию: keywords и how to quote identifiers using backticks.


Кроме того, не создавайте запрос путем конкатенации; даже с mysqli_real_escape_string(), вы рискуете SQL injection, как объяснено в ответах на this question. Используйте подготовленные заявления.

Наконец, вы должны знать, что у вас есть хотя бы одна уязвимость безопасности. Эта строка:

echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); 

будет выводить все, что находится в $sql. Если ваш запрос завершился с ошибкой по какой-либо причине, которая может быть такой же простой, как конфликт уникальных ключей, тогда SQL появится на странице. Но эта строка может содержать, например, script теги. Это можно использовать для запуска атаки XSS. Будьте очень осторожны с пользовательским вводом.

Смежные вопросы