傳遞陣列參數並在PDO 中使用LIMIT 子句
處理資料庫查詢時,將參數陣列傳遞給使用LIMIT 子句時的PDO 語句。然而,當使用 bindParam 方法設定各個參數時,這可能具有挑戰性。
困境
出現挑戰是因為 LIMIT 子句需要綁定特定的數值,而執行方法需要一個命名參數陣列。這種不相容性導致兩種方法無法同時使用。
克服問題
解決方案在於停用 PDO::ATTR_EMULATE_PREPARES 的預設設定。啟用後,PDO 在內部產生動態 SQL 和引號值,本質上模擬準備好的語句。但是,此預設行為會幹擾傳遞命名參數。
停用模擬準備
透過使用 setAttribute 方法將 PDO::ATTR_EMULATE_PREPARES 設為 false,將停用預設行為。這允許 PDO 使用實際的準備好的語句,啟用命名參數的綁定,同時仍使用 LIMIT 子句。
用法範例
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$sql = "SELECT * FROM table WHERE id LIKE CONCAT('%', :id, '%') LIMIT :limit1, :limit2";
$stmt = $pdo->prepare($sql);
$stmt->execute(array(':id' => $id, ':limit1' => $limit1, ':limit2' => $limit2)); // Works!
效能注意事項
MySQL 預設使用模擬準備來增強效能。停用模擬準備可能會稍微降低效能,但它可以提高參數綁定的靈活性。
其他資源
有關此主題的更多信息,請參閱以下資源:
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3