High efficiency.
Prevent SQL injection.
Read the official document, php.net data object
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>
High efficiency.
Prevent SQL injection.
Read the official document, php.net data object
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>
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