php 다중 쿼리 select 사용해서 배열에 넣는법
조회수 2175회
테이블이
barcode(barcode, food_code, company_code)
food(food_code, food_name)
company(company_code, company_name)
이렇게 있는데 처음엔 join을 써서 하려니까 시간이 너무 걸리더라구요...
그래서 select를 3번 써서 빠르게 하려는데 php에서 다중 쿼리 select 쓰는 방법 검색해서 해보는데 원하는 결과가 안 나옵니다...
첫번째 쿼리문은 바코드를 입력하면 barcode.food_code
를 거쳐 food.food_name
을 가져오려고 합니다.
두번째 쿼리문은 바코드만 가져옵니다.
세번째 쿼리문은 바코드를 입력하면 barcode.company_code
를 거쳐 company.company_name
을 가져옵니다.
최종적으로 제가 원하는 결과는 url에 바코드를 하나 입력하면 그 바코드에 맞는 정보들을 가져와 배열에 넣는겁니다. 다중 쿼리 select 어떻게 써야 배열에 들어가나요?
밑에는 제가 짰던 php문입니다.
<?php
require_once 'conn.php';
if (isset($_GET['barcode'])) {
$barcode = $_GET['barcode'];
$query = "select FOOD_NAME FROM food WHERE FOOD_CODE=(select FOOD_CODE FROM barcode WHERE BARCODE=(select BARCODE FROM barcode WHERE BARCODE='$barcode')); ";
$query .= "select BARCODE FROM barcode WHERE BARCODE='$barcode'; ";
$query .= "select COMPANY_NAME FROM company WHERE COMPANY_CODE=(select COMPANY_CODE FROM barcode WHERE BARCODE=(select BARCODE FROM barcode WHERE BARCODE='$barcode'));";
$response = [];
if (mysqli_multi_query($conn, $query)) {
do {
if ($result = mysqli_store_result($conn)) {
while ($row = mysqli_fetch_row($result)) {
array_push(
$response, [
'barcode' => $row['BARCODE'],
'food_name' => $row['FOOD_NAME'],
'company_name' => $row['COMPANY_NAME']
]
);
}
mysqli_free_result($result);
}
} while (mysqli_next_result($conn));
}
echo json_encode($response);
}
mysqli_close($conn);
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
1 답변
-
뭐 대충 찾아보니 mysqli_multi_query()라는 게 있기는 한데 이걸 쓰시는 순간 다음과 같은 간단한 자료 조회 질의 작업이 산으로 갈 공산이 큽니다.
SELECT b.barcode, f.food_name, c.company_name FROM barcode b JOIN food f ON f.food_code = b.food_code JOIN company c ON c.company_code = b.company_code WHERE b.barcode = '바코드값' GROUP BY b.barcode, f.food_name, c.company_name
이 간단한 쿼리가 느리게 돈다는 부분이 오히려 문제라고 생각됩니다. 각 테이블별 PK, 테이블 간의 FK가 어떻게 되어 있나요? 그 인덱싱만 잘 돼 있으면 다음과 같은 간단한 PHP 코드로 쭉 뽑아오실 수 있습니다.
$barcode = $_GET['barcode']; $query = "SELECT b.barcode, f.food_name, c.company_name FROM barcode b JOIN food f ON f.food_code = b.food_code JOIN company c ON c.company_code = b.company_code WHERE b.barcode = ? GROUP BY b.barcode, f.food_name, c.company_name"; // mysqli_* 함수보다는 PDO를 쓰시는 편이 좋습니다. $dsn = "mysql:host=localhost;port=3306;dbname=testdb;charset=utf8"; $db = new PDO($dsn, "testuser", "testpassword"); // 쿼리문 안의 물음표 자리에 입력값(바코드값)을 바인딩해 실행합니다. // 지금처럼 $query 변수 안에 사용자 입력값을 주입하시면 SQL인젝션 이라는 해킹공격 을 당하실 수 있습니다. $stmt = $db->prepare($query); $stmt->execute([$barcode]); // 이게 끝입니다. $result = $stmt->fetchAll(PDO::FETCH_OBJ); var_dump($result);
세 테이블의 DDL을 올려주시면 다른 고수분들이 보시고 도와주실지도 모릅니다.
- 응답이 늦어 죄송합니다. 신입사원이라 너무 정신이 없네요. PDO라는게 있군요! 한 번 찾아봐야겠습니다. 정말 감사합니다!! 알 수 없는 사용자 2020.8.26 17:25
댓글 입력