2010-05-10 95 views
5

PHP的PDO允許一次執行多個查詢,可以通過query()方法或準備好的語句。下面的兩個例子的工作:PHP的PDO可以限制爲單個查詢嗎?

// Two SQL queries 
$query = "SELECT * FROM table; DROP table;" 

// Execute via query() 
$pdo->query($query); 

// Execute via prepared statement 
$stmt = $pdo->prepare($query); 
$stmt->execute(); 

有什麼辦法來PDO限制爲單個查詢的時間,很像mysql_query()函數是什麼?

回答

6

這是一種更先進的最新回答這個問題。

防止多查詢執行的老辦法是禁用模擬準備,然而這僅適用於PDO::prepare()方法。在PHP的新版本(> = 21年5月5日和> = 5.6.5),一個新的常數已被引入到禁用兩個PDO::prepare()PDO::query()這種多查詢執行。 (通常不會在補丁版本中添加常量,但是這是由於此功能帶來的Drupal SQL injection attack的嚴重性)。

新常數PDO::MYSQL_ATTR_MULTI_STATEMENTS必須上創建對象設置(作爲第四個參數的構造函數PDO) - 與PDO::setAttribute()設置它預先存在的對象將無法正常工作。

$pdo = new PDO('mysql:host=_;dbname=_', '', '', [PDO::MYSQL_ATTR_MULTI_STATEMENTS => false]); 
+0

我在PHP文檔中找不到關於PDO :: MYSQL_ATTR_MULTI_STATEMENTS的任何信息。但我嘗試了它,並且工作正常; – 2016-05-08 20:20:54

+0

我不知道它還沒有成爲文檔。我已經將它添加到[MySQL的常量頁面](http://php.net/manual/en/ref.pdo-mysql.php) - 它應該可以在幾個小時內查看。 – tpunt 2016-05-08 20:43:12

6

嗯,還有通過禁用PDO準備語句,使其使用本地的mysql的API,而不是仿真實現這一目標的一種方式(多查詢沒有在服務器端預處理語句支持):

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

但是,此選項的缺點之一是查詢緩存丟失。

+1

「與5.1.17開始,預處理語句使用查詢緩存,在一定條件下」 - http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html – VolkerK 2010-05-10 14:12:24

+0

有沒有辦法通過query()方法來阻止它? – 2010-05-11 15:02:04

+0

不是我所知道的,除非你使用一些自定義代碼來預先過濾查詢字符串。 – nuqqsa 2010-05-11 15:24:42