How is PHP PDO preprocessing cached?

WBOY
Release: 2016-09-15 11:31:00
Original
1373 people have browsed it

Recently, preprocessing SQL (prepare) is used for the following two reasons.

  1. High efficiency.

  2. Prevent SQL injection.

Read the official document, php.net data object

But it still feels a bit confusing to use.

Whether the efficiency will be improved? If the preprocessing is the same preprocessing SQL and just changes the parameters, then I think the efficiency will definitely be improved: However, if it is the following situation:

<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>
Copy after login
Copy after login

I feel like writing this, the most important thing is to know how PDO perpare is cached? Or there is a similar document (English is also acceptable).

Reply content:

Recently, preprocessing SQL (prepare) is used for the following two reasons.

  1. High efficiency.

  2. Prevent SQL injection.

Read the official document, php.net data object

But it still feels a bit confusing to use.

Whether the efficiency will be improved? If the preprocessing is the same preprocessing SQL and just changes the parameters, then I think the efficiency will definitely be improved: However, if it is the following situation:

<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>
Copy after login
Copy after login

I feel like writing this, the most important thing is to know how PDO perpare is cached? Or there is a similar document (English is also acceptable).

The main functions of prepared statements are as follows:
1. It is safer. PDO or the underlying database library will take special care of bind variables that do not take constraints. If you always use prepared statements, you will not Vulnerable to SQL injection attacks.
2. Sometimes queries may be faster. Many databases cache prepared statements in query plans and use symbolic references to prepared statements instead of retransmitting the entire query text. The most obvious thing is that you only need to declare a prepared statement object once and then reuse the prepared statement object when encountering different variables.

Of the two, safety is obviously more important, which makes prepared statements indispensable. If it is efficient, I think it may be that it uses the same object in multiple preprocessing, which improves efficiency.

Original post

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template