2012-07-17 3 views
0
와 MySQL의 오류를 반환

얘들 아 내가 여기이 작은 기능는 PDO는 bindParam

function getBeaches() { 

$request=Slim::getInstance()->request(); 

$args=filter_var_array(func_get_args(),FILTER_SANITIZE_STRING); 
$sql="SELECT * FROM beaches WHERE state=:state AND city=:city"; 

    // var_export($args); die(); 
    // array (0 => 'wa', 1 => 'seattle',) 

try { 
    $db   = getConnection(); 
    $stmt  = $db->prepare($sql); 


     $stmt->bindValue('state', $args[0], PDO::PARAM_STR); //should bind wa 
     $stmt->bindValue('city', $args[1], PDO::PARAM_STR); //should bind seattle 
     $stmt->execute(); 

    $stmt  = $db->query($sql); 
    $beaches = $stmt->fetchObject(); 
    $db   = null; 

    echo '{"map": ' . stripslashes(json_encode($beaches)) . '}'; 
} catch(PDOException $e) { 
    echo '{"error":{"text":'. $e->getMessage() .'}}'; 
} 

    /* {"error":{"text":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 ':state AND city=:city' at line 1}} 
    */ 

} 

을 실행하는거야 그래서

mysql$ SELECT * FROM beaches WHERE state='wa' AND city='seattle';

처럼이 실행하려고, 나는 바닥에 주석 오류를 얻고있다

일부 벨이 울릴 수 있습니까?

답변

3

당신은 당신의 PARAM 이름 전에 세미콜론이 필요합니다 (100 % 사실, 편집 참조) PDOStatement::bindValue()에 PHP 워드 프로세서에서

$stmt->bindValue(':state', $args[0], PDO::PARAM_STR); //should bind wa 
$stmt->bindValue(':city', $args[1], PDO::PARAM_STR); //should bind seattle 

:

매개 변수의 식별자입니다. 명명 된 자리 표시자를 사용하여 준비된 명령문의 경우이 이름은 : 형식의 매개 변수 이름이됩니다. 물음표 자리 표시자를 사용하여 준비된 문에 대해 이것은 매개 변수의 1- 색인 위치가됩니다.

편집 @jeroen으로 당신이 그것에서 데이터를 얻을 전에 $stmt 변수를 덮어 쓰기 문제 (당신의 페이스트 빈에서 같은 일을) 지적했다. 문제를 코드로하면 17 선 주위 : 도움이된다면

$stmt->execute(); 
$beaches = $stmt->fetchObject(); 
+0

사실, bindParam 및 bindValue가 아니며 콜론없이 작동합니다. – ehime

+1

그리고 콜론이':'세미콜론이 아님';') – Martin

+1

@hime 매우 사실입니다 (세미콜론을 사용한 경우). 증거에 대한 오류를보십시오. 값이 대체되지 않기 때문에 MySQL은': state AND city = : city'를 받고 있습니다. 물론 다른 접두사 문자 (예 :'@ '또는 전혀 없음)를 사용할 수는 있지만 설명서에서 권장하는 것은 아닙니다. 그리고 무엇을 하든지'bindValue()'에 넘겨주는 매개 변수 식별자 (문서의'$ parameter')는 문자열에있는 것과 정확히 일치해야합니다. –

0

확실하지,하지만 난 항상 bindValue 이상 bindParam를 사용 : 당신이 위의 라인을 변경하여이 문제를 해결할 수

$stmt->execute(); // $stmt now has query results (from the query with parameters bounded) 

$stmt  = $db->query($sql); // You redo the query. Now $stmt has no query results and no parameters are bound 
$beaches = $stmt->fetchObject(); // Statement assumes you want to execute query and does so but not parameters are bound 

. 그렇게하기로 결정했다면 바인더를 다음과 같이 수정하십시오 :

그 외 모든 작업은 저에게 잘 보입니다.

+0

처음에는 'bindParam'을 사용했지만 동일한 오류가 발생했습니다. 내가 참조로 지나가지 않아서 Value로 바뀌 었는지 궁금하다. 그래도 같은 오류 = ( – ehime

관련 문제