我知道標題聽起來很可笑,但我已經花了幾個小時的時間進行了研究,只是想知道PDO最終是沒有明顯解決方案的越野車......我致力於開放一個。我也願意接受我的代碼有缺陷。PDO和PHP/MySQL:PDO準備好的語句有什麼問題?
使用PHP 5.2/Ubuntu的,此代碼的工作(不使用預處理語句/打開注射):
$sql ="SELECT COUNT(*) FROM property p
INNER JOIN property_attribute pa ON p.property_id = pa.property_id
INNER JOIN property_area pc ON p.property_id = pc.property_id
WHERE pa.attribute_value_id
IN (
SELECT av.attribute_value_id
FROM attribute_value av
INNER JOIN attribute a ON av.attribute_id = a.attribute_id
WHERE a.name LIKE '$attributes'
AND av.value LIKE '$values'
)
ORDER BY p.price ASC";
$params = array();
$rHowManyPages = Listings::HowManyPages($sql, $params);
但是,使用PDO的精彩準備語句:
$sql ='SELECT COUNT(*) FROM property p
INNER JOIN property_attribute pa ON p.property_id = pa.property_id
INNER JOIN property_area pc ON p.property_id = pc.property_id
WHERE pa.attribute_value_id
IN (
SELECT av.attribute_value_id
FROM attribute_value av
INNER JOIN attribute a ON av.attribute_id = a.attribute_id
WHERE a.name LIKE :attributes
AND av.value LIKE :values
)
ORDER BY p.price ASC';
$params = array(':attributes' => $attributes, ':values' => $values);
$rHowManyPages = Listings::HowManyPages($sql, $params);
它的工作原理,還挺。這裏的Spartanic瘋狂部分:傳遞1/5刷新相同的數據,PDO給出了這樣的錯誤:
TEXT: SQLSTATE[HY093]: Invalid parameter number
這是隨機的!如何和爲什麼?
[This Drupal bug](https:// drupal。org/node/1350346)顯示了類似的問題,如果你的值有':'在其中。 – 2012-07-27 22:20:57
@Brendan:非常好的一點,我完全可以看到綁定數據中的冒號字符如何導致類似於我用問號字符所遇到的問題。 – spencer7593 2012-07-27 22:42:53
@ spencer7593一個傑出的迴應。我不知道如何在沒有很多重構的情況下讓它工作(我有一個班正在做我所有的DBO準備和執行的內容),但這肯定會有很多答案。謝謝。 – 2012-07-27 23:16:57