2009-06-29 70 views
1

我在使用PDO編寫的PHP查詢中遇到問題。代碼: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語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在第1行''05_26_09'GROUP BY locality_name ORDER BY locality_name DESC'處使用正確的語法。

當我直接在服務器上執行查詢時,結果集沒有任何問題。任何想法我做錯了什麼?

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 2009-06-29 23:04:14

1

PDO使用mysql的C-API編寫語句。
http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-prepare.html說:

這些標記只在SQL語句中的某些地方是合法的。 [...]然而,它們不允許用於標識符(例如表格或列名稱)
作爲一個經驗法則,我使用:「如果您不能用單引號將它包裝在即席查詢字符串中無法在準備好的聲明中將其參數化「