MySQL 연결

Sangyeong Je·2022년 10월 20일
0

프로그래밍

목록 보기
9/11

MySQLi 와 PDO

PHP 에서 데이터베이스에 연결하기 위한 API

  1. MySQLi
  • php5의 새로운 mysql 확장, 절차지향적, 객체지향적으로 사용가능
  1. PDO(PHP Data Objects)
  • 데이터베이스를 보다 기능적으로 인터페이스화 시켜서 데이터베이스 종류가 어떻든 공통 인터페이스의 형태로 쿼리를 전송하고 소통할수있다.

PDO

<?php 

    $dbHost = "localhost";    // 호스트 주소(localhost, 120.0.0.1)
    $dbName = "je_test";      // 데이타 베이스(DataBase) 이름
    $dbUser = "????";       // DB 아이디
    $dbPass = "????";       // DB 패스워드
    $dbChar = "utf8";         // 문자 인코딩

    try
    {
       	$pdo = new PDO("mysql:host={$dbHost};dbname={$dbName};charset={$dbChar}", $dbUser, $dbPass);
       	$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 			
       	echo "서버와의 연결 성공!<br>";

    	$stmt = $pdo->prepare("SELECT * FROM test_table WHERE name = :name");
    	$stmt->bindValue(":name", "사람");
    	$stmt->execute();
    	$row = $stmt->fetch();

    	echo "<pre>";
    	print_r($row);
    	echo "</pre>";


    }
    catch(PDOException $ex)
    {
        echo "서버와의 연결 실패! : ".$ex->getMessage()."<br>";
    }
 ?>

1. try-catch

PHP가 실행되는 동안 발생하는 오류를 핸들링하기 위한 구문
지정된(예외적인) 에러 조건이 발생하면 코드 실행의 통상적인 흐름을 변경하는데 사용됨
이 조건을 예외(exception)이라 부름

try 
{
    //... 예외처리가 발생할 수 있는 소스코드 ...
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $ex) 
{
    //... 예외 발생시의 처리 ...
    echo "서버와의 연결 실패! : ".$ex->getMessage()."<br>";
}
  1. try 블록을 만나면, PHP는 try 블록에 있는 코드들을 한 라인씩 실행
  2. 이 과정 중 예외가 발생하면 try 블록내 다음 코드들을 모두 건너뛰고 catch 블록으로 진입
  3. try 블록을 끝까지 실행했음에도 예외처리가 발생하지않으면 catch 블록을 건너뜀

2. PDO 객체 생성

$변수 = new PDO("데이터베이스 종류:host=호스트;port=포트dbname=데이터베이스;charset=인코딩", 계정, 암호);

이 이후 이 객체에서 필요한 메소를 호출함.

3. 테이블 제어하기

3-1. 쿼리를 준비하고 실행 (execute)

  1. 쿼리를 준비한다.
$stmt = $pdo->prepare("SELECT * FROM test_table WHERE name = :name");

prepare로 준비하는 SQL구문은 파라미터를 가질 수 있다.
파라미터는 이름을 붙여주거나 물음표로 표시할 수 있다.

  1. 쿼리 파라미터 값 지정
$name = '사람';
$stmt->bindValue(":name", $name);
$stmt2->bindParam(":name", $name);
$name = '코끼리';
//$stmt = // WHERE name = "사람"으로 실행된다.
//$stmt2 = // WHERE name = "코끼리"로 실행된다.

binValue 는 값 자체를 대입한다. 그래서 변수에 새로운 값을 넣어도 반영되지 않는다.
bindParam 은 변수를 대입한것이기 때문에 대입한 이후에 값을 변경할 수 있다.

  1. 준비된 쿼리 실행
$stmt->execute();

ㅇㄴㅇㅁㄴㅇㄴㅁㅇㅁㄴ

3-2. 쿼리 바로 실행 (query)

그래서 무엇을 사용하여야 할까?

결론적으로는 execute()를 사용하는것이 가장 권장된다.

이유는 보안 때문이며 execute()만으로도 모든 기능들을 수행할 수 있기 때문이다.

하지만 사용자가 값을 입력하지 않는 쿼리의 경우 exec()를 사용할 수 있다.

쿼리를 실행시키기 위해 prepare() 메소드까지 준비해주어야 하는 execute()보다 비교적 코드도 간소하며 동작도 더 효율적이기 때문이다.

하지만 SELECT문 같은 경우는 반환값을 받아야 하므로 PDO객체를 반환하는 query()문을 사용할 수 있을 것이다.

0개의 댓글