2010-01-28 112 views
2

我有一個表格: '對象'有幾列: object_id:int,object_type:int,object_status:int,object_lati:float,object_long:float 我的查詢是:無效的參數編號:綁定變量的數量不匹配令牌的數量

$stmt = $db->query('SELECT o.object_id, o.object_type, o.object_status, o.object_lati, o.object_long FROM objects o WHERE o.object_id = 1'); 
$res = $stmt->fetch(); 

PDO拋出一個錯誤:

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

當我刪除列object_latiobject_long查詢做工精細。

+2

是不是有沒有使用ORM的原因?現在 – 2011-08-18 20:09:16

+0

@YourCommonSense,這個問題是(間接)[元交]的主題(http://meta.stackoverflow.com/q/253911/176646),可能發生的越快。 – ThisSuitIsBlackNot 2014-05-07 18:22:50

回答

-1

嘗試像聲明:

$stmt = $db->query('SELECT object_id, object_type, object_status, object_lati, object_long FROM objects o WHERE object_id = ? ', 1); 
-1

試試這個,而不是

$row = $db->fetchRow('SELECT o.object_id, o.object_type, o.object_status, o.object_lati, o.object_long FROM objects o WHERE o.object_id = 1'); 
// return false if no result found 

或獲取記錄設置

$rs = $db->fetchAll('SELECT o.object_id, o.object_type, o.object_status, o.object_lati, o.object_long FROM objects o WHERE o.object_id = 1'); 
// returns array with results 
1

雖然這個特定的問題不是一個真實的,因爲所提供的代碼將永遠不會產生這樣的錯誤,看起來Google很樂意將訪問者發送給這個p年齡。對他們來說,是遵循了答案:

這個問題永遠不能憑藉它query()方法調用引起的,因爲它本質上屬於準備好的聲明。

錯誤本身非常明顯:「令牌數量」代表查詢中的?:name令牌的數量(也稱爲「佔位符」),而「綁定的變量數量」表示變量ether通過bindValue或`bindParam綁定,或通過執行發送(技術上相同)。所以,當一個人試圖綁定更多的變量而不是查詢中定義的令牌時,PDO會引發這個錯誤。

例如,如果存在與沒有定義令牌準備的查詢,但我們試圖給一個變量將其綁定:

$stmt = $db->prepare('SELECT * FROM objects o WHERE o.object_id = 1'); 
$stmt->execute(array($id)); 

那麼它會導致在所討論的非常錯誤消息,作爲數綁定變量(1)的數量與令牌(0)的​​數量不匹配。

爲了解決這個問題,一個只需要仔細比較與被綁定到聲明變量的數量準備好的查詢令牌的數量。

相關問題