2009-06-29 5 views
1

PHP에서 PDO로 준비된 쿼리에 문제가 있습니다. 코드 :PHP PDO 준비 쿼리가 제대로 실행을 거부합니다 - 문제가 있습니까?

$link = new PDO("mysql:dbname=$dbname;host=127.0.0.1",$username,$password); 
$link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$query = $link->prepare("SELECT locality_name FROM :passedday GROUP BY locality_name ORDER BY locality_name DESC"); 
$query->bindParam(":passedday",$day); //Where day is, well, a day passed to the script elsewhere 
$query->execute(); 
$result = $query->fetchAll(); 
$link = null; 
//Do things with the $result. 

내가 무엇입니까 오류 메시지는 다음과 같습니다

SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 1064 당신은 당신의 SQL 구문에 오류가 있습니다; '05_26_09'근처에서 사용할 올바른 구문에 대한 설명서를 확인하십시오. GROUP BY locality_name ORDER BY locality_name DESC 'on line 1

서버에서 직접 쿼리를 실행하면 적절한 결과를 아무 문제없이 설정할 수 있습니다. 내가 뭘 잘못하고 있는거야?

TIA.

편집 :

$day가 GET 인수로 전달됩니다. 따라서 http://127.0.0.1/day.php?day=05_26_09$day = $_GET['day'];으로 연결됩니다.

답변

2

05_26_09가 테이블의 이름을 내기로되어 있다면, 나는 당신이 도망가는 문제를 겪고 있다고 생각합니다. 로컬 운영 체제가 라이브 서버와 다른가요?

bindValue()/bindParam()을 값이 아닌 다른 값 (예 : 테이블 이름, 필드 이름)으로 사용할 수 있다고 생각하지 않습니다. 그래서 저는 약간 놀랍습니다. 그것은 당신의 로컬 시스템에서 작동합니다.

+0

Google에서이를 발견했습니다. 감사. – benjy

1

PDO는 prepared statement에 mysql의 C-API를 사용합니다.
http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-prepare.html :

마커는 SQL 문의 특정 위치에서만 유효합니다. [...] 그러나 식별자 (예 : 테이블 또는 열 이름)는 허용되지 않습니다.
엄지 손가락의 규칙으로 : "임시 쿼리 문자열에서 작은 따옴표로 묶을 수없는 경우 준비된 문장으로 매개 변수화 할 수 없음 "