2012-06-18 9 views
1

전자 메일 주소가 이미 사용자 데이터베이스에 있는지 확인하려고합니다. 나는 AJAX를 사용하고있다. SELECT 문이 실행되면 항상 오류가 반환됩니다. 이 문장은 @ 기호로 끝나는 것 같습니다.쿼리에서 @ 기호를 사용할 때 MySQL 오류가 발생 함

AJAX 호출 : 여기

var emailok = false; 
var email = $('input[name="email"]'); 
$(function(){ 
     $.ajax({ 
       type: "POST", 
       data: "email="+email.attr('value'), 
       url: "check_email.php", 
       success: function(data){ 
        alert(data); 
        if(data != 0) { 
         emailok = false; 
         $('#exists_message').slideDown('slow').delay(3500).slideUp('slow'); 
         for(i=0;i<4;i++) { 
          email.animate({ 
           backgroundColor: '#AC0A0A' 
          },300).animate({ 
           backgroundColor: '#FFFFFF' 
          },300); 
         } 
        } else { 
         emailok = true; 
        } 
       } 
      }); 

그리고 내 check_email의 PHP 스크립트입니다 :

가 내 연결 스크립트에 오류가 여기 그것이 그냥 경우
<?php 

include('connect.php'); 

$email = $_POST['email']; 

try { 
    $STH = $DBH->prepare("SELECT * FROM users WHERE email=$email"); 
    $STH->execute(); 
} catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

$DBH = NULL; 
$users = $STH->fetchAll(PDO::FETCH_OBJ); 

echo ' Matches - ' . sizeof($users); 

?> 

:

<?php 

$host = 'localhost'; 
$user = '********'; 
$pass = '********'; 
$dbname = 'tm'; 
try { 
    $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); 
    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

?> 

경고에 나타나는 오류는 다음과 같습니다.

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@asdf.asd' at line 1 Matches - 0 

오류가 끝날 때 0은 해당 이메일 주소에서 발견 된 행의 수이므로 명령문이 실행됩니다.

내가 뭘 잘못하고 있니? 필자는 항상 PDO를 사용하여 전자 메일 주소를 준비했으며 이전에이 오류가 발생하지 않았습니다.

편집 : 단지 이러한 주석을 더 이상 얻을 수 없으므로 SQL 주입을 방지하기 위해 준비된 문을 사용해야합니다. 나는 그것을 시험 할 때 단지이 방법을 사용했다. 이메일 변수 주위에 빠진 작은 따옴표였습니다. 모두에게 감사드립니다. 당신이 준비된 문을 사용하는 것처럼

"SELECT * FROM users WHERE email='$email'"

+0

'준비'를 사용하고 있다면 준비된 문장을 사용하십시오! 일반 오래된 문자열 연결을 수행하지 마십시오. – deceze

+1

이것은 PDO, AJAX 또는 jQuery와 아무 관련이 없습니다. 이스케이프 처리되지 않은 데이터를 쿼리에 삽입하고 왜 실패하는지 궁금합니다. DB 탈출과 준비된 진술에 관한 10 억 개의 다른 질문 중 하나를 읽으십시오. – feeela

+0

나는 보통 진술서를 작성한 다음 준비된 진술서로 전환합니다. 그래도 고마워. :) – ahhchuu

답변

5

문자열은 작은 따옴표로 포장해야 `제대로 입력 탈출하기 : 당신은 쿼리에 작은 따옴표를 추가 할 필요가 없습니다

$STH = $DBH->prepare("SELECT * FROM users WHERE email=:email"); 
$STH->bindValue(':email', $email); 
$STH->execute(); 

- PDO 당신을 위해 그렇게 할 것이다.

+0

오 마이 갓. 내가 그걸 믿을 수 없어. 이건 창피해. 정말 고마워. 나는 그것이 나를 허용 할 때 대답을 받아 들일 것이다. : P – ahhchuu

+3

당신은 [Sql injection] (http://en.wikipedia.org/wiki/SQL_injection)에 취약하기 때문에 그것을 탈출하고 싶을 것입니다. – drew010

3

도`bindValue를 (사용, 당신이 더 잘 내기 것`) : 당신의 SQL이 있어야 할 수 있도록 :

관련 문제