효율성이 높습니다.
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>
효율성이 높습니다.
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>
Prepared 문장의 주요 기능은 다음과 같습니다.
1. 더 안전한 PDO 또는 기본 데이터베이스 라이브러리는 제약 조건을 사용하지 않는 바인드 변수를 특별히 관리합니다. SQL 주입 공격에 취약합니다.
2. 때로는 쿼리가 더 빠를 수도 있습니다. 많은 데이터베이스는 쿼리 계획에서 준비된 문을 캐시하고 전체 쿼리 텍스트를 재전송하는 대신 준비된 문에 대한 기호 참조를 사용합니다. 가장 분명한 점은 준비된 문 개체를 한 번만 선언한 다음 다른 변수를 만날 때 준비된 문 개체를 재사용하면 된다는 것입니다.
둘 중에서 안전이 더 중요하다는 것은 분명하므로 준비된 진술이 필수입니다. 효율적이라면 다중 전처리에서 동일한 객체를 사용하여 효율성을 높이는 것이 아닐까 생각합니다.
원본 게시물