PHP PDO 預處理是怎麼緩存的呢?

WBOY
發布: 2016-09-15 11:31:00
原創
1372 人瀏覽過

最近出於以下兩個原因,使用預處理SQL(prepare)。

  1. 效率高。

  2. 防SQL注入。

看了官方文檔,php.net資料物件

但用起來還是覺得有點困惑。

效率究竟會不會提升,預處理如果是相同預處理SQL,只是換參數,那我想效率一定會提升的:但是,如果是下面這些情況:

<code>//1. 在参数数量不一致的时候不能使用同一个预处理SQL。如下要使用两个预处理语句。
SELECT name FROM product WHERE product_id in (?, ?, ?, ?);
SELECT name FROM product WHERE product_id in (?, ?, ?, ?, ?);

//PS: 如果是参数数量比较多的话,不知道效率会不会比直接(12, 34, 45, 23...)慢,但直接用id列表不能预防SQL注入。

//2. 每次执行完预处理之后,再次执行相同的预处理,会不会速度更快。
$sql = 'SELECT name FROM product where product_id = ?';
$statement = PDO::prepare($preSql);

$product_id = 111;
$statement.bindParam(1, $product_id);
$statement->execute();

/*
最理想的情况是除掉注释的,直接使用$statement调用两次。
但是,平常一些SQL操作并不是这么连贯(同类型的SQL可能分开执行),并不好分析。
不能缓存$statement, 然后调用同一个$statement.
如果第一次执行完成后,方法已经结束(资源释放),第二次执行又重新prepare相同的SQL。
这时候不知道会不会调用缓存的预处理SQL,如果是缓存在DB,应该可以调用。
但如果缓存在PHP的话,感觉应该又要重新处理了,这样感觉没有直接使用不预处理的SQL效率高。
*/

//$sql = 'SELECT name FROM product where product_id = ?';
//$statement = PDO::prepare($preSql);

$product_id = 123;
//$statement.bindParam(1, $product_id);
$statement->execute();

/*
同理在处理ORDER的时候,如果缓存能生效使用参数,是最好的.
这样的话,就可以不用重新预处理SQL。也可以防SQL注入。
*/
</code>
登入後複製
登入後複製

感覺寫了這些,最主要的是想知道PDO perpare是怎麼快取的?或有類似的文檔也行(英文的也可以)。

回覆內容:

最近出於以下兩個原因,使用預處理SQL(prepare)。

  1. 效率高。

  2. 防SQL注入。

看了官方文檔,php.net資料物件

但用起來還是覺得有點困惑。

效率究竟會不會提升,預處理如果是相同預處理SQL,只是換參數,那我想效率一定會提升的:但是,如果是下面這些情況:

<code>//1. 在参数数量不一致的时候不能使用同一个预处理SQL。如下要使用两个预处理语句。
SELECT name FROM product WHERE product_id in (?, ?, ?, ?);
SELECT name FROM product WHERE product_id in (?, ?, ?, ?, ?);

//PS: 如果是参数数量比较多的话,不知道效率会不会比直接(12, 34, 45, 23...)慢,但直接用id列表不能预防SQL注入。

//2. 每次执行完预处理之后,再次执行相同的预处理,会不会速度更快。
$sql = 'SELECT name FROM product where product_id = ?';
$statement = PDO::prepare($preSql);

$product_id = 111;
$statement.bindParam(1, $product_id);
$statement->execute();

/*
最理想的情况是除掉注释的,直接使用$statement调用两次。
但是,平常一些SQL操作并不是这么连贯(同类型的SQL可能分开执行),并不好分析。
不能缓存$statement, 然后调用同一个$statement.
如果第一次执行完成后,方法已经结束(资源释放),第二次执行又重新prepare相同的SQL。
这时候不知道会不会调用缓存的预处理SQL,如果是缓存在DB,应该可以调用。
但如果缓存在PHP的话,感觉应该又要重新处理了,这样感觉没有直接使用不预处理的SQL效率高。
*/

//$sql = 'SELECT name FROM product where product_id = ?';
//$statement = PDO::prepare($preSql);

$product_id = 123;
//$statement.bindParam(1, $product_id);
$statement->execute();

/*
同理在处理ORDER的时候,如果缓存能生效使用参数,是最好的.
这样的话,就可以不用重新预处理SQL。也可以防SQL注入。
*/
</code>
登入後複製
登入後複製

感覺寫了這些,最主要的是想知道PDO perpare是怎麼快取的?或有類似的文檔也行(英文的也可以)。

預處理語句的主要作用有以下兩點:
1.更安全,PDO或底層資料庫的函式庫會特別照顧那些沒有採取約束條件的綁定變數.如果你總是使用預處理語句,你將不會容易受到SQL的注入攻擊。
2.有時查詢可能更快,許多資料庫會快取查詢計畫裡的預處理語句,並用符號參照事先準備好聲明,而不是重新傳輸整個查詢文字。最明顯的是,你只要聲明過一次預處理對象,後面就能在遇到不同變數時重複使用該預處理語句物件。

這兩者中,更安全顯然是更重要的,這使得預處理語句缺一不可。效率高的話我覺得可能是在多個預處理中它都使用同一個對象,這部分提高了效率。

原貼

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板