2012-10-23 4 views
2

내 화면에이 오류가 표시됩니다. 디버그를 시도했습니다.MYSQL 구문 오류 - SELECT 문

"당신은 당신의 SQL 구문에 오류가 있습니다; 행 1에서 TESTNAME '' '=에'근처에 사용할 수있는 권리 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인"

내 기능 메신저

사용을 다음과 같이입니다 :

function recentMessages() { 
    $tbl_name="messages"; 
    $username = $_SESSION['username']; 
    $result = mysql_query("SELECT * FROM $tbl_name WHERE to = '$username' ") or die(mysql_error()); 
    while ($row = mysql_fetch_row($result)) 
     { 
     return $row['date']." ".$row['time']." ".$row['from']." ".$row['subject']. "<br />";  
     } 
} 

기본적으로 어떤 메신저가 시도하는 것은 그 '으로는'그 밖으로 echo'd 세션과의 사용자 이름입니다 데이터베이스 메시지에서 데이터의 모든 행을 얻을 수 있습니다. 무엇이 잘못하고 있는지에 대한 아이디어가 있습니까? 감사합니다

+0

는 SQL에 있지만 변수를 탈출 (물론) 유효한 점이다 @BrendanLong. 앤드류 - $ username = " 'OR 1 = 1 or x ='"라고 생각하십시오. – AD7six

+0

정말로 [이스케이프 문자열 데이터] (http://php.net/manual/en/function.mysql-real-escape-string. php)을 데이터베이스에서 사용하기 전에 외부 소스에서 가져올 수 있습니다. –

답변

10

to은 예약어입니다. 그것을 눈금으로 표시하십시오.

... WHERE `to` = '$username' 

자세한 내용은 MySQL reserved words을 참조하십시오.

가능한 경우 예약어를 사용하지 마십시오.

+0

좋은 ty! 그들은 mysql에 대한 예약어를 가지고 있다는 것을 깨닫지 못했다! – Nexus9988

+0

@AndrewL 대부분의 DBMS에 예약어가 있습니다. – Kermit

-1

to는 내가 믿는 예약어입니다. [to] (으)로 변경해보십시오. Edit : 완전히 확신하지 못했습니다. 나는 그것을 SQL Server에 넣고 TO가 예약어임을 보았습니다.

+0

그것은 mssql이 아니므로 mysql입니다 – AD7six

+0

대괄호는 MSSQL에만 적용됩니다. – Kermit

+1

이것에 대한 투표는 가혹했습니다. 이 대답은 여전히 ​​문제 (예약어)에 대해 정확하며 잘못된 데이터베이스에 대한 구문을 가지고 있습니다. –

1

to는 예약어입니다. 이것을 시도하십시오 :

$result = mysql_query("SELECT * FROM $tbl_name WHERE `to` = '$username' ") 
       or die(mysql_error()); 

일반적으로 ~, ~ 사이의 작은 단어는 피하십시오. 이런 종류의 문제를 막기 위해서입니다. 더 나은 해결책은 "receiver"또는 "message_to"또는 유사한 것과 같은 필드 이름을 갖는 것입니다.

0

TO는 MySQL의 예약어입니다. 백틱을 사용하여 분리하십시오. 이 세션 데이터를 수정하는 사소한 경우, SQL 인젝션이 응용 프로그램의 걱정거리가 될 것입니다 :

SELECT * FROM $tbl_name WHERE `to` = '$username'