2016-12-16 1 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의 위험에 처해 있습니다. 준비된 진술을 사용하십시오.

마지막으로 적어도 하나 이상의 보안 취약점이 있음을 알아야합니다. 이 줄은

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

$sql이 무엇이든 울립니다. 특정 키 충돌과 같은 간단한 이유로 쿼리가 실패하는 경우 SQL이 페이지에 표시됩니다. 그러나 그 문자열에는 예를 들어 script 태그가 포함될 수 있습니다. 이것은 XSS 공격을 시작하는 데 사용될 수 있습니다. 매우 사용자 입력에주의하십시오.

관련 문제