首頁  >  問答  >  主體

為什麼 MySQLi 函式庫本身不支援命名參數?

來自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 擴充函式庫中未實作命名參數的原因。

P粉024986150P粉024986150377 天前620

全部回覆(2)我來回復

  • P粉792026467

    P粉7920264672023-11-01 09:02:19

    傳統上,MySQLi 是 MySQL API。它本身不會添加任何內容,並且是有原因的:添加命名佔位符等功能將需要(如果您想到的話)整個 SQL 查詢解析的龐然大物。當然,這不是資料庫 API 的工作。就像其他答案中所說的那樣,API 不是 DAL 或 DBAL;它們有不同的用途。

    PDO 是一項您在語言中很難再看到的偉大壯舉,而韋斯·弗隆 (Wes Furlong) 是一位天才,他幾乎單槍匹馬地承擔了這項任務。但 PDO 又是另一回事了。它是一個資料庫存取抽象層,為了實現這個目標,無論你喜歡與否,你都需要一個查詢解析器。由於您已經有了一個查詢解析器,並且其中一個驅動程式已經支援命名佔位符,因此自然地將其添加到所有支援的驅動程式中。正如您所看到的,使用 MySQLi 一切都不同了。

    簡單來說,不是“懶”,而是“懶”。這是關於遵循規範。

    回覆
    0
  • P粉533898694

    P粉5338986942023-11-01 00:14:00

    MYSQLi 不支援命名參數有兩個主要原因:

    1. 它「旨在」(我寬鬆地使用這個術語)與包裝器一起使用,並且
    2. 它的對應項 PDO 確實如此 - 而且沒有必要重新發明輪子

    詳細說明第1 點:mysqli,儘管與PDO 相比有許多缺點,但很容易與一個好的包裝器相媲美- 即命名參數(除其他外) )由包裝器而不是mysqli 本身支援。這是設計使然,只有一個原因:

    1. Mysqli 被設計為一個快速且靈活的函式庫。

    如果開發人員將更多功能合併到基礎庫中,與直覺相反,它就會變得不太靈活,並且需要更長的載入/執行時間。

    mysqlipdo 都是隨 PHP 5 發布的(我相信 PDO 版本為 5.3),因此有不同的用途。

    您想要更快的執行時間嗎?使用沒有包裝器的mysqli。您想要命名參數嗎?使用 PDO 或建置 mysqli 包裝器來處理此類問題 - 但請注意,這會阻礙您的執行時間。

    回覆
    0
  • 取消回覆