[PHP] PDO객체의 쿼리 실행 메소드 차이점 (exec, execute, query)

[PHP] PDO객체의 쿼리 실행 메소드 차이점 (exec, execute, query)

728x90

w3school이나 TCP School의 PHP강좌를 보면 쿼리실행 메소드로 exec()와 execute(), query()를 사용하고 있다.

exec(): insert와 delete

execute(): update

query(): select

위와 같이 사용하고 있는데 각 메소드에 어떤 차이가 있는지 설명은 나와있지 않았다.

$sql = "INSERT INTO php(name, age) values('test2', 20)"; $sql = "DELETE FROM php WHERE name = 'test4'"; $sql = "SELECT * FROM php"; $sql = "UPDATE php SET name = 'update1' WHERE name ='test2'"; #메소드 exec() $connect->exec($sql); echo "성공"; #메소드 execute() $statement = $connect->prepare($sql); $statement -> execute(); echo $statement -> rowCount(); #메소드 query() $connect -> query($sql); #select foreach ($connect->execute($sql) as $field) { echo $field['name']; echo $field['age']; } foreach ($connect->query($sql) as $field) { echo $field['name']; echo $field['age']; }

직접 DB를 돌려가면서 위 소스에 필요없는 부분을 주석처리하며 세 메소드가 어떤 식으로 구성하는지 살펴봤다.

결과를 말하자면 셋 다 동일한 동작을 한다. (쿼리를 실행시킴) 하지만 분명 차이가 있으며 그 차이는 아래에 작성되어 있다.

1. exec()

https://www.php.net/manual/en/function.exec.php

쿼리문에서의 별도 반환하는 값이 없으며 실패 시 false를 반환한다.

쿼리뿐만 아니라 다른 파일들을 실행시킬 때도 사용한다.

$connect->exec($sql);

위와 같이 사용한다.

2. execute()

https://www.php.net/manual/en/pdostatement.execute.php

PDOStatement 클래스의 메소드이며 보안상 가장 안전한 방법이고 제일 권장되는 방법이다.

그 이유는 execute() 메소드는 다른 메소드와 다르게 사용자가 입력한 값(쿼리문)을 DB서버에 요청하지 않고

prepare객체에 담아서 요청하기 때문이다.

반환 값으로 질의 수행한 결과문을 받을 수 있다.

$statement = $connect->prepare($sql); $statement->execute();

prepare() 메소드와 함께 위와 같이 사용한다.

3. query()

https://www.php.net/manual/en/pdo.query.php

PDO 클래스의 메소드이며 preapre 없이 SQL문을 실행시킬 수 있다.

반환 값으로 PDOStatement 객체를 받는다.

$connect -> query($sql);

위와 같이 사용한다.

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

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

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

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

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

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

이러한 차이점이 있으니 용도에 맞게 사용하면 좋을 것이다.

참고

https://stackoverflow.com/questions/49641775/when-to-use-pdo-exec-vs-execute-vs-query/49642011

from http://jong99.tistory.com/141 by ccl(A) rewrite - 2021-09-10 14:26:19