PHP PDO 전처리는 어떻게 캐시되나요?

WBOY
풀어 주다: 2016-09-15 11:31:00
원래의
1373명이 탐색했습니다.

최근에는 다음과 같은 두 가지 이유로 전처리 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가 어떻게 캐시되는지 아는 것입니다. 또는 유사한 서류가 있습니다. (영어도 가능합니다.)

Prepared 문장의 주요 기능은 다음과 같습니다.
1. 더 안전한 PDO 또는 기본 데이터베이스 라이브러리는 제약 조건을 사용하지 않는 바인드 변수를 특별히 관리합니다. SQL 주입 공격에 취약합니다.
2. 때로는 쿼리가 더 빠를 수도 있습니다. 많은 데이터베이스는 쿼리 계획에서 준비된 문을 캐시하고 전체 쿼리 텍스트를 재전송하는 대신 준비된 문에 대한 기호 참조를 사용합니다. 가장 분명한 점은 준비된 문 개체를 한 번만 선언한 다음 다른 변수를 만날 때 준비된 문 개체를 재사용하면 된다는 것입니다.

둘 중에서 안전이 더 중요하다는 것은 분명하므로 준비된 진술이 필수입니다. 효율적이라면 다중 전처리에서 동일한 객체를 사용하여 효율성을 높이는 것이 아닐까 생각합니다.

원본 게시물

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿