2016-12-16 34 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使用反引號,而不是括號。請參閱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')"; 

請參閱該文檔:keywordshow 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攻擊。用戶輸入時請小心

相關問題