복붙노트

참조 - PDO에 대해 자주 묻는 질문

PHP

참조 - PDO에 대해 자주 묻는 질문

이것은 PHP 데이터 객체에 관한 자주 묻는 질문 목록입니다

PDO에는 일반 PHP 사용자가 모르는 몇 가지 기능이 있으므로 PDO에서 준비된 명령문 및 오류 처리와 관련된 질문은 매우 자주 발생합니다. 그래서, 이것들은 모든 것을 발견 할 수있는 곳입니다.

귀하의 질문에이 목록이있는 경우, 아래 질문을 찾아 코드에 적용하십시오. 다른 일반적인 함정을 준비 할 수 있도록 다른 질문에 대해 간략히 살펴 보는 것도 좋은 생각입니다.

또한보십시오

해결법

  1. ==============================

    1.

    데이터베이스 오류를 보려면 PDO errmode를 예외로 설정해야합니다. 예외는 여러 가지면에서 일반 오류보다 우수합니다. 항상 스택 추적을 포함하며 try..catch를 사용하여 캐치하거나 전용 오류 처리기를 사용하여 처리 할 수 ​​있습니다. 심지어 처리되지 않아도 사이트 전체의 오류보고 설정에 따라 모든 중요한 정보를 제공하는 일반적인 PHP 오류로 작동합니다.

    이 모드를 연결 옵션으로 설정하면 PDO가 연결 오류에 대해 예외를 발생하게하므로 매우 중요합니다. PDO 연결을 올바르게 만드는 예제가 있습니다.

    $dsn = "mysql:host=$host;dbname=$db;charset=utf8";
    $opt = array(
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        // other options 
    );
    $pdo = new PDO($dsn, $user, $pass, $opt);
    

    이 방법을 통해 쿼리 실행 중에 발생한 모든 데이터베이스 오류를 항상 알 수 있습니다. PHP 오류를 일반적으로 볼 수 있어야합니다. 라이브 사이트에서 오류 로그를 들여다 봐야하므로 설정을해야합니다.

    error_reporting(E_ALL);
    ini_set('display_errors',0);
    ini_set('log_errors',1);
    

    로컬 개발 서버에서는 화면에 오류가 발생해도 괜찮습니다.

    error_reporting(E_ALL);
    ini_set('display_errors',1);
    

    물론 PDO 명령문 앞에 오류 억제 연산자 (@)를 사용해서는 안됩니다.

    또한 모든 PDO 문을 try..catch 블록으로 랩핑하라는 많은 나쁜 예가 있기 때문에 별개의 메모를 작성해야합니다.

  2. ==============================

    2.

    호환성을 위해 PDO는 별도로 명시하지 않는 한, 서버에 별도로 데이터를 보내는 대신 실제 데이터로 자리 표시자를 대체하여 준비된 문을 에뮬레이션합니다. 그리고 "lazy"바인딩 (execute ()에서 배열 사용)을 사용하면 PDO는 모든 매개 변수를 문자열로 처리합니다. 결과적으로, 준비된 LIMIT?,? 쿼리가 LIMIT '10', '10'이되어 쿼리가 실패하게하는 잘못된 구문입니다.

    이 문제는 다음 중 하나에서 해결할 수 있습니다.

  3. ==============================

    3.

    준비된 문은 완전한 데이터 리터럴 만 나타낼 수 있습니다. 리터럴의 일부도 아니고 복잡한 표현이나 식별자도 아닙니다. 그러나 문자열 또는 숫자 만. 따라서 매우 일반적인 함정은 다음과 같은 쿼리입니다.

    $sql = "SELECT * FROM t WHERE column LIKE '%?%'";
    

    이 쿼리를 약간 숙고한다면 작은 따옴표 안에는 준비 문에 특별한 의미가없는 물음표가 리터럴 물음표가된다는 사실을 이해할 수 있습니다.

    그래서, 준비된 문장을 사용하여 완전한 문자열 리터럴을 보내야합니다. 가능한 두 가지 방법이 있습니다.

    후자는 너무 부풀어 오른 것처럼 보입니다.

  4. from https://stackoverflow.com/questions/15990857/reference-frequently-asked-questions-about-pdo by cc-by-sa and MIT lisence