본문 바로가기

PHP

[PHP] 쿼리 메소드 차이점 (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