2017-02-15 109 views
3

我使用PHP和MySQL與PDO。有時我需要準備一個語句,其中有一個變量(佔位符)在此查詢中多次使用。爲什麼PDO不允許具有相同名稱的多個佔位符?

例子:

SELECT * FROM messages WHERE from_id = :user OR to_id = :user 

但是,如果我會盡量準備這個發言,所以我需要做的是這樣一種方法,我將有一個錯誤:

SELECT * FROM messages WHERE from_id = :user1 OR to_id = :user2 

要調用這個說法我需要這樣一個陣列:

array('user1'=>$user_id, 'user2'=>$user_id); 

它對我來說看起來很愚蠢!爲什麼MySQL(PDO?)不允許我多次使用一個佔位符,並迫使我使用需要更多控制的額外變量?!

如果查詢相對簡單(如我上面發佈的),這可以很容易地處理,但現在我建立了一個查詢單個變量的5(!!!)使用。每次我添加佔位符時,我都需要在很多地方檢查代碼,以確保它正常。

是否有任何設置或調整來繞過此?

回答

6

是否有任何設置或調整來繞過此?

是的,有。 You can turn emulation mode ON並且能夠多次使用相同的佔位符。

因此,只有在仿真關閉時纔會觀察到所描述的行爲。我不太明白爲什麼會這樣,但是這裏是Wez Furlong(PDO作者)的解釋:

這個改變是由於兩個原因造成的;首先,如果你重新使用綁定中的相同變量,那麼在使用某些驅動程序時可能會導致崩潰。無法保證做正確的事情,並且有辦法引發崩潰有時可以用作安全漏洞的攻擊媒介。

第二個原因是便攜性。一些司機會在內部執行此檢查和錯誤。如果您對不執行此操作的驅動程序進行編碼,那麼您的代碼將不適用於那些不執行此操作的驅動程序。

http://paul-m-jones.com/archives/243#comment-740

+0

謝謝YCS!我最好避免使用仿真,因爲準備好的語句執行速度應該較慢。對? –

+0

那麼,仿真模式實際上*更快*但我不會說差異是顯着的。上面的鏈接是我的文章,我討論所有的利弊爲每個模式 –

+0

更快?!哇,意想不到的事......在這種情況下,我會去找一個關於這個的閱讀......謝謝! –

相關問題