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