
마지막 result를 구조분해할당을 안해서 항상 값이 크게 나왔군!!
[result]로 고쳐줍니다.

---

query 대신 execute 를 사용ㅎ나다(메뉴얼에 글케 나와있어요)
밑에는 오류 생길 가능성이 있어서 그대로 query를 사용해요
execute는 멀까요??? (아래에 작성했읍니다)
+ 님들아 execute랑 query랑 같이 쓰니까 먼가 어리둥절함
엥 근데 난 됨 송아쌤은 안됨
MySQL 데이터 삭제하는 방법
1) DELETE
DELETE FROM 테이블명 (WHERE 조건);
: 조건이 있으면 조건에 맞는 행만 삭제
: 조건이 없으면 모든 행이 삭제
(테이블이 남아있어요!!)
2) DROP(안돼~)
DROP TABLE 테이블명;
: 테이블을 통째로 삭제
3) TRUNCATE ✨
TRUNCATE 테이블명;
DELETE 와 TRUNCATE의 차이점은??
DELETE: 값만 건드려서 AUTO_INCREMENT 그대로 감 ex)11
TRUNCATE: 공장 초기화해서 AUTO_INCREMENT 다시 1부터 << 짱조타
그래서 삭제 가능한가요?
foreign키 가지고 있는 애들 놀라지 않게 역순으로 지워주자~~
=> 그래도 초기화 못해 ㅜ 제약조건 걸려있어서 값이 잇뜬없든 못혀
어케해결해요?
말해줄수잇서
SET FOREIGN_KEY_CHECKS =0; --false
체크하지말자
TRUNCATE 테이블명;
그 다음에 삭제하고
SET FOREIGN_KEY_CHECK=1; --true
다시 복귀해놔요~
주문완뇨하면 cartItems에서는 해당 항목이 사라져야해요!
DELETE FROM cartItems WHERE id IN (?,?,?);
오늘 많이 겪은 오류


query에 넣을 때 items를 []로 감싸주지 않으면
1행만 들어가는 오류가 있었다.!!!
그거는 왜냐면
items: [1,2,3]인데
저 물음표 안에 들어가야 할 값은 1,2,3이다
근데 그냥 items를 넣음녀 [1,2,3]으로 들어가지 않고 1로 들어가게된다 (SQL이 내부에서 펼쳐서 처리하기 때문에)
그래서 뭉탱이로 넣어줘야한다~는거~ 알아~ 두라구~
왜 그러한가 (간단한 원리)
- conn.query(sql, params)에서 params는 “각 ?에 대응하는 값들의 목록”입니다.,
- SQL에 ? 가 하나라면 params는 길이 1인 배열이어야 합니다. 그 하나의 값이 또 배열이라면 드라이버가 IN (?) 문맥에서 그 내부 배열을 펼쳐서 처리합니다.,
- 반대로 params로 items(배열)를 바로 넘기면 드라이버는 “각 ?에 하나씩 대응시킬 값들”이라고 보고, 쿼리 내 ? 개수와 파라미터 개수가 맞지 않아 오류가 나거나 엉뚱하게 동작할 수 있습니다.

근데 여기에는 params로 들어와서 값이 하나 밖에 없는데
왜? [orderId]를 또 가둬서 넣을까요???
제가 둘 다 해보니까 나오는 값이 똑같지만요
안정성을 위해 그러는 것 같습니다~ 아마도요
https://jong99.tistory.com/141
[PHP] 쿼리 메소드 차이점 (exec, execute, query의 차이점)
w3school이나 TCP School의 PHP강좌를 보면 쿼리실행 메소드로 exec()와 execute(), query()를 사용하고 있다. exec(): insert와 delete execute(): update query(): select 위와 같이 사용하고 있는데 각 메소드에 어떤 차이
jong99.tistory.com
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()문을 사용할 수 있을 것이다.
이러한 차이점이 있으니 용도에 맞게 사용하면 좋을 것이다.
'PROJECT > [ 도서쇼핑몰 ]' 카테고리의 다른 글
| authorization (0) | 2025.11.03 |
|---|---|
| JWT authorization try~catch (0) | 2025.10.29 |
| 주문하기 flow 오류 Await Async로 잡자~(근데 난 원래 쓰고있었어서 오류가 안나는) (0) | 2025.10.27 |
| 주문 API 구현 (0) | 2025.10.25 |
| 장바구니 API 구현 (0) | 2025.10.24 |