2016-12-11 25 views
2

顯然沒有SQL注入的威脅,但是如果沒有變量插入到準備好的語句中,使用準備語句而不是query()是否有任何性能考慮因素?應該準備好的語句曾經被使用沒有佔位符

$sql='SELECT t1.a,t1.b,t2.c FROM t1 INNER JOIN t2 ON t2.id=t1.t2_id'; 
$stmt=$db->prepare($sql); 
while(true) { 
    ... 
    //Should this be used 
    $stmt->execute(); 
    //or this, and get rid of the above prepared statement? 
    $rs=$db->query($sql); 

    $rs=$stmt->fetchAll(); 
    ... 
} 

編輯。 lonesomeday的和你的常識的答案是衝突的,但都是正確的,因爲我沒有說明我是否正在使用仿真模式。然而,我並不認爲在這一點上從根本上編輯原始問題是合適的,並且希望我可以同時選擇兩種方法......

+0

你說你正在使用'PDO :: ATTR_EMULATE_PREPARES => false',所以你沒有使用仿真模式。 –

+0

@YourCommonSense我認識到我沒有使用仿真模式,但我在原文中沒有這麼說。 – user1032531

回答

3

在這種情況下,是的,因爲您正在循環。

通過使用預處理語句,您只需將該查詢發送到MySQL一次,並且僅解析一次。如果你每次只發送一次SQL,它必須重新解析它,而不是重新使用相同的代碼。

在循環中,您正在多次重新執行查詢,因此使用相同的SQL語句(顯微鏡)會更有效。

1

有沒有應該,但只是出於常識,這將是一個合理的想法ut使用query()方法查詢不包含佔位符。

但是,如果您使用的PDO與emulation mode關閉,則上述內容是有意義的。否則,準備/執行對就像單個query()調用一樣有效。

然而,鑑於建議把仿真模式的時候,我會實現一個簡單的PDO包裝器這樣

class MyPDO extends PDO 
{ 
    public function run($sql, $args = NULL) 
    { 
     if (!$args) return $this->query($sql); 
     $stmt = $this->prepare($sql); 
     $stmt->execute($args); 
     return $stmt; 
    } 
} 

顯然,在對方的回答中提到的情況下,但我幾乎能想象可以使用的情況。

+0

我的典型配置PDO使用'[ PDO :: ATTR_EMULATE_PREPARES =>假, PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY =>真, PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION, PDO :: ATTR_DEFAULT_FETCH_MODE => PDO :: FETCH_ASSOC ]' – user1032531

+0

因此,在這種情況下,query()而不是prepare將會爲您節省往返數據庫的時間。差異被認爲是微不足道的,但是,只是爲了它。 –

+0

@YourCommonSense平心而論,我無法想象使用它。這似乎就像問題中提出的問題。 – lonesomeday

相關問題