來自http://php.net/manual/en/mysqli.quickstart.prepared-statements.php的正確MySQLi參數化查詢語法:
$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)"); $stmt->bind_param("i", $id);
但永遠不要這樣:
$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (:id_value)"); $stmt->bind_param("i", "id_value", $id);
在我看來,命名參數
替換是在API層級實現的合理功能。令我驚訝的是,MySQLi 在函式庫中只實作了 未命名參數
。
有正當理由嗎?看到 PDO、DQL、ORM 都如何在查詢中採用命名參數,這對我來說沒有意義。
我希望 MySQLi 開發人員不會有「我們很懶又不想」的情況。我相信一定有一個很好的理由,我正在尋找那個理由,或尋找那個理由的方法。 MySQLi 擴充函式庫中未實作命名參數的原因。
傳統上,MySQLi 是 MySQL API。它本身不會添加任何內容,並且是有原因的:添加命名佔位符等功能將需要(如果您想到的話)整個 SQL 查詢解析的龐然大物。當然,這不是資料庫 API 的工作。就像其他答案中所說的那樣,API 不是 DAL 或 DBAL;它們有不同的用途。
PDO 是一項您在語言中很難再看到的偉大壯舉,而韋斯·弗隆 (Wes Furlong) 是一位天才,他幾乎單槍匹馬地承擔了這項任務。但 PDO 又是另一回事了。它是一個資料庫存取抽象層,為了實現這個目標,無論你喜歡與否,你都需要一個查詢解析器。由於您已經有了一個查詢解析器,並且其中一個驅動程式已經支援命名佔位符,因此自然地將其添加到所有支援的驅動程式中。正如您所看到的,使用 MySQLi 一切都不同了。
簡單來說,不是“懶”,而是“懶”。這是關於遵循規範。
MYSQLi
不支援命名參數有兩個主要原因:PDO
確實如此 - 而且沒有必要重新發明輪子詳細說明第1 點:
mysqli
,儘管與PDO
相比有許多缺點,但很容易與一個好的包裝器相媲美- 即命名參數(除其他外) )由包裝器而不是mysqli 本身支援。這是設計使然,只有一個原因:Mysqli
被設計為一個快速且靈活的函式庫。如果開發人員將更多功能合併到基礎庫中,與直覺相反,它就會變得不太靈活,並且需要更長的載入/執行時間。
mysqli
和pdo
都是隨 PHP 5 發布的(我相信 PDO 版本為 5.3),因此有不同的用途。您想要更快的執行時間嗎?使用沒有包裝器的
mysqli
。您想要命名參數嗎?使用PDO
或建置mysqli
包裝器來處理此類問題 - 但請注意,這會阻礙您的執行時間。