2016-12-16 17 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は予約語なので、エスケープするにはバッククォートで囲む必要があります。 keywordshow to quote identifiers using backticks

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

は、ドキュメントを参照してください。


また、連結でクエリを作成しないでください。 mysqli_real_escape_string()であっても、this questionの回答で説明されているように、あなたはSQL injectionのリスクがあります。準備されたステートメントを使用する。

最後に、少なくとも1つのセキュリティ上の脆弱性が存在することがわかります。この行:

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

は、$sqlにあるものをエコーアウトします。何らかの理由でクエリが失敗した場合(一意のキーの競合など)、SQLはページに表示されます。しかし、その文字列には、たとえばscriptというタグが含まれている可能性があります。これはXSS攻撃を開始するために使用できます。 非常にと入力してください。

関連する問題