복붙노트

[SQL] 어떻게 PDO와 MySQL의 기능을 대체하는?

SQL

어떻게 PDO와 MySQL의 기능을 대체하는?

MySQL의 기능에 대한 php.net에 읽을 때. 나는이 메시지를 발생

나는 PDO에 대해 읽었습니다. 어떻게 MySQL의 또는 MSSQL을 사용하여 PDO에 내 코드를 업데이트 할 수 있습니까?

해결법

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

    1.나는 많은 코드가 SO 구현 my_sql 기능에 게시를 참조하십시오. 그리고 MySQL의 기능을 포기하고 PDO 또는 MySQLI 사용을 시작하기 질문자를 눌러 (자신 포함) 다른 사람의 의견. 이 포스팅은 도움말을 여기에있다. 그들이 사용되지 않는 이유에 대한 설명을 제공하고 PDO가 무엇인지, 플러스 최소한의 코드 예제는 PDO를 구현하는대로 당신은 그것을 참조 할 수 있습니다.

    나는 많은 코드가 SO 구현 my_sql 기능에 게시를 참조하십시오. 그리고 MySQL의 기능을 포기하고 PDO 또는 MySQLI 사용을 시작하기 질문자를 눌러 (자신 포함) 다른 사람의 의견. 이 포스팅은 도움말을 여기에있다. 그들이 사용되지 않는 이유에 대한 설명을 제공하고 PDO가 무엇인지, 플러스 최소한의 코드 예제는 PDO를 구현하는대로 당신은 그것을 참조 할 수 있습니다.

    가장 먼저:

    PDO에 MySQL의 기능에서 변환 검색 및 교체의 간단한 아니다. PDO는 PHP 언어에 대한에 객체 지향 프로그래밍의 추가이다. 즉, MySQL의 함수로서 코드를 작성의 다른 접근 방법을 의미한다. 첫 번째 이유는 변환?

    소스 Deceze

    PDO는 여러 데이터베이스에 연결하기위한 하나 개의 솔루션을 제공합니다. 이 답변은 MySQL과 MSSQL 서버를 포함한다.

    MySQL 데이터베이스에 연결 전제 조건

    이것은 매우 간단하고 사전 셋업 PHP의를 필요로하지 않는다. 현대 PHP 설치는 MySQL의 서버에 PDO 연결을 허용하는 모듈과 함께 제공 표준이다.

    MSSQL 데이터베이스에 연결 전제 조건

    이것은 고급 셋업이다. 당신은 php_pdo_sqlsrv 필요 _ ## _ ts.dll 또는 php_pdo_sqlsrv _ ## _ nts.dll 드라이버. 그들은 버전 따라서 고유 한 ##이다. 글을 쓰는 순간, 마이크로 소프트는 출시했습니다 PHP의 5.5.x.에 대한 공식 드라이버 5.6 드라이버는 아직 공식적으로 마이크로 소프트에 의해 발표하지만, 비공식가 다른 사람에 의해 빌드로 사용할 수 없습니다.

    PDO를 사용하여 데이터베이스에 연결 데이터베이스에 연결 당신은 PDO 구조에서 새 PDO 인스턴스를 생성해야합니다.

    $connection = new PDO(arguments);
    

    PDO 생성자는 1 개 필수 인수 및 3 선택을합니다.

    MySQL로 연결

    $dsn = 'mysql:dbname=databasename;host=127.0.0.1';
    $user = 'dbuser';
    $password = 'dbpass';
    
    $dbh = new PDO($dsn, $user, $password);
    

    의는 $ DSN을 살펴 보자 : 우선 운전자 (MySQL의)를 정의합니다. 그런 다음 데이터베이스 이름 그리고 마지막으로 호스트.

    MSSQL에 연결

    $dsn = 'sqlsrv:Server=127.0.0.1;Database=databasename';
    $user = 'dbuser';
    $password = 'dbpass';
    
    $dbh = new PDO($dsn, $user, $password);
    

    의는 $ DSN을 살펴 보자 : 우선 운전자 (SQLSRV)를 정의합니다. 그런 다음 호스트와 마지막으로 데이터베이스 이름입니다.

    인스턴스를 만들 때 연결이 데이터베이스에 이루어진다. 당신은 PHP 스크립트의 실행 중에 한 번이 작업을 수행 할 수 있습니다.

    try 
    {
        $connection = new PDO($dsn, $user, $password);
    }
    catch( PDOException $Exception ) 
    {   
         echo "Unable to connect to database.";
         exit;
    }
    

    PDO 준비된 문을 사용합니다. 이 PDO의 접근 방법과 MySQL의 기능 사이의 진정한 차이입니다. 후자는 SQL 주입에 매우 취약했다. 하나는이 같은 쿼리를 작성합니다 :

    $SQL = 'SELECT ID FROM users WHERE user = '.$username ;
    

    때 악의적 인 웹 사이트 또는 사람이 게시물 사용자 이름 인젝터를; DROP 표 사용자. 결과는 파괴 될 것이다. 당신은 탈출 따옴표로 문자열과 변수를 캡슐화하여 증거 코드에 필요합니다. 이 수행해야했다 모든 쿼리. 큰 웹 사이트 또는 잘못 코드를 허용 SQL 주입이 매우 높은 될 수있는 형태를 갖는 위험을 유지했다. 준비된 문은 위의 예와 같이 첫 번째 계층의 SQL 인젝션의 기회를 제거합니다.

    PDO 드라이버의 역할을 중간자 데이터 액세스 추상화 계층라는 PHP 서버와 데이터베이스 서버 사이. 그것은 당신의 SQL 쿼리를 재 작성하지 않지만, 여러 데이터베이스 유형에 연결하는 일반적인 방법을 제공합니까 당신을 위해 쿼리에 변수의 삽입을 처리합니다. MySQL의 기능은 PHP 코드의 실행에 쿼리를 건설했다. PDO와 함께 쿼리가 실제로 데이터베이스 서버에 빌드를 가져옵니다.

    준비된 SQL 예 :

    $SQL = 'SELECT ID, EMAIL FROM users WHERE user = :username';
    

    차이를 참고; 문자열 내에서 대신 문자열 외부 $를 사용하여 PHP 변수, 우리는 사용하여 변수를 소개합니다. 또 다른 방법은 다음과 같습니다

    $SQL = 'SELECT ID, EMAIL FROM users WHERE user = ?';
    

    실제 쿼리를 수행하는 방법

    귀하의 PDO 인스턴스는 쿼리를 실행하는 두 가지 방법을 제공합니다. 당신은 어떤 변수가없는 경우 변수는 준비 사용하는 당신은, 쿼리 ()를 사용할 수있다 (). 쿼리는 () 즉시 호출시 실행됩니다. 호출의 객체 지향 방법을 유의하시기 바랍니다 (->).

    $result = $connection->query($SQL);
    

    contains 메소드를 준비

    contains 메소드는 두 개의 인수를 준비합니다. 첫 번째는 SQL 문자열이고 두 번째 배열의 형태로 옵션입니다. 기본 예

    $connection->prepare($SQL, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
    

    이름 : 우리의 SQL 문자열의 예에서 우리라는 이름 변수를 사용했습니다. 우리는 여전히 그것에 PHP 변수, 정수 또는 문자열을 결합해야합니다. 우리는 두 가지 방법으로이 작업을 수행 할 수 있습니다. 어느 키로라는 변수를 포함하는 배열을 구축하거나 또는 bindValue bindParam 방법을 사용한다. 나는 배열 변형 및 간단하게하기 위해 방법 bindValue을 설명합니다.

    정렬 당신은 당신이 배열의 키와 변수를 제공라는 이름의 변수,이 같은 작업을 수행 할 수 있습니다 :

    $queryArguments = array(':username' => $username);
    

    그리고 인덱스 변수이 (?)

    $queryArguments = array($username);
    

    모든 변수를 추가하면이 방법은 쿼리를 수행하기 위해 () 실행시 호출 할 수 있어야합니다. 이에 함수를 실행하는 인자로 배열 전달.

    $result = $connection->execute($queryArguments);
    

    bindValue bindValue 방법은 당신이 PDO 인스턴스에 값을 바인딩 할 수 있습니다. 방법은 두 개의 필수 인자와 하나의 선택을합니다. 옵션 인수는 값의 데이터 유형을 설정합니다.

    이름 변수의 경우 :

    $connection->bindValue(':username', $username);
    

    인덱스 변수의 경우 :

    $connection->bindValue(1, $username);
    

    인스턴스에 값을 바인딩 한 후에는 인수를 전달하지 않고 실행에 호출 할 수 있습니다.

    $result = $connection->execute();
    

    다시 나는 단지 반환 된 세트의 결과를 가져 오는을위한 기초를 다룰 것입니다. PDO는 상당히 진보 된 추가 기능입니다.

    가져 오기 및 fetchAll 사용

    당신은 선택 쿼리를 한 또는 결과 집합을 반환 저장 프로 시저를 실행하는 경우 :

    술책 가져 오기는 세 개의 선택적 인수까지 걸릴 수있는 방법이다. 이 결과 집합에서 하나의 행을 가져옵니다. 기본적으로 키와 인덱스 결과로 열 이름을 포함하는 배열을 반환합니다. 우리의 예제 쿼리는 같은 것을 반환 할 수

    ID      EMAIL
    1       someone@example.com
    

    로이 반환됩니다 가져 오기 :

    Array
    (
        [ID] => 1
        [0] => 1
        [EMAIL] => someone@example.com
        [1] => someone@example.com
    )
    

    결과 세트의 모든 출력을 에코하려면 :

    while($row = $result->fetch())
    {
        echo $row['ID'];
        echo $row['EMAIL'];
    }
    

    당신이 여기에서 찾을 수있는 다른 옵션이 있습니다 fetch_style;

    fetchAll 단일 배열의 모든 행을 꺼냅니다. 가져 오기와 같은 기본 옵션을 사용하여.

    $rows = $result->fetchAll();
    

    당신은 당신이 영향을받는 행의 양을 검색하는 메소드를 rowCount를 사용할 수를 쿼리 삽입 또는 업데이트와 같은 결과를 반환하지 않은 쿼리를 사용합니다.

    class pdoConnection {
        public $isConnected;
    
        protected $connection;
    
        public function __construct($dsn, $username, $password, $options = array()) {
            $this->isConnected = true;
            try {
                $this->connection = new PDO($dsn, $username, $password, $options);
                $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $this->connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); //sets the default to return 'named' properties in array.
            } catch (PDOException $e) {
                $this->isConnected = false;
                throw new Exception($e->getMessage());
            }
        }
    
        public function disconnect() {
            $this->connection = null;
            $this->isConnected = false;
        }
    
        public function query($SQL) {
            try {
                $result = $this->connection->query($SQL);
                return $result;
            } catch (PDOException $e) {
                throw new PDOException($e->getMessage());
            }
        }
    
        public function prepare($SQL, $params = array()) {
            try {
                $result = $this->connection->prepare($SQL);
                $result->execute($params);
                return $result;
            } catch (PDOException $e) {
                throw new PDOException($e->getMessage());
            }
        }
    }
    

    사용하는 방법:

    $dsn = 'mysql:dbname=databasename;host=127.0.0.1';
    $user = 'dbuser';
    $password = 'dbpass';
    
    $db = new pdoConnection($dsn, $user, $password);
    
    $SQL = 'SELECT ID, EMAIL FROM users WHERE user = :username';
    $result = $db->prepare($SQL, array(":username" => 'someone'));
    
    while($row = $result->fetch())
    {
        echo $row['ID'];
        echo $row['EMAIL'];
    }   
    
  2. from https://stackoverflow.com/questions/28096054/how-to-replace-mysql-functions-with-pdo by cc-by-sa and MIT license