2012-09-21 2 views
0

제품 ID를 저장하는 장바구니 클래스가 있습니다. 사용자는 카트를 열 수있는 버튼을 통해 카트를 열 수 있으므로 카트 내용이 모든 페이지에로드되어야합니다.PHP SQL 다중 쿼리. 큰일 이냐?

크기 제한 때문에 제품의 ID 만 저장할 수 있지만 제품 이름을 최종 사용자에게 표시하려고하므로 각 요소에 대해 쿼리를 만들고 데이터베이스에서 제품 데이터를 가져와야합니다. .

이렇게하면 어떤 큰 단점이 있습니까? 아니면 더 나은 해결책이 있습니까?

추신 : 나는 장바구니에있는 모든 제품의 ID를 얻은 다음 필요한 제품의 데이터를 가져 오는 단일 쿼리를 수행 할 수 있습니다. 클래스의 일부를 다시 작성해야하므로이 방법을 사용하지 마십시오. 이전 솔루션과 실제 차이가 있습니까?

PPS : 어떤 경우에도 SQL 쿼리의 총 수가 너무 높아서는 안됩니다. 당연히 나는 꺼리지 않을 것이다, 그러나 나는 강력하게 사용자가 1 개의 클립에 다른 제품의 수백을 구매할 것이라는 점을 의심한다.

+0

처음에는 모든 관련 제품에 대한 데이터를 얻고 해당 단일 쿼리를 기반으로 제품 레코드를 작성하려면 하나의 쿼리를 실행해야하는 것처럼 들립니다. 각 제품에 대한 하나의 쿼리는 제품과 관련된 다차원 데이터가 없으면 필요하지 않습니다. 그렇다고하더라도 모든 쿼리를 하나의 쿼리로 가져 오는 방법은 있습니다. – DaveRandom

+0

세션에 제품 이름을 저장하는 것이 메모리 문제라고 생각합니까? 나는 그것을 ... 당신이 테스트했는지 의심 스럽습니까? – knittl

+0

메모리 문제가있는 경우 어디에서 ID를 저장합니까? 1 또는 2 개의 쿼리가있는 솔루션은 괜찮습니다. 1 + n은 아닙니다. 이 문제를 해결할 수있는 방법은 여러 가지가 있지만 이해하기 어렵 기 때문에 충분한 정보가 없습니다. –

답변

2

난 단지 당신의 질문에서 한 문장을 강조하고자 :

는 각각의 요소에 대해 나는 쿼리를 만들고 데이터베이스에서 제품 데이터를 얻을 필요가있다.

귀하의 문제입니다. 당신은 그렇게 할 필요가 없습니다. 단일 쿼리로 데이터베이스를 쿼리하고 ID 목록에있는 모든 제품을 요청할 수 있습니다.

SQL 언어의 유용한 부분은 IN(....) 절입니다.

$ids = [123, 884, 7848, 2882, 3232]; // let's say that is your input 
$idList = implode(',', array_map('intval', $ids)); 
$sql = sprintf(
    "SELECT field1, field2, field3 FROM products WHERE products.ID IN(%s)", 
    $idList 
); 

이것은 제품 ID 목록에 대한 단일 쿼리입니다. 당신이 ID를 기반으로 데이터를 "가져 오기"할 수 있도록 데이터베이스에서 데이터를 가져올 때 비행에 인 - 메모리 데이터베이스를 생성 (일명 해시 테이블) :

foreach($ids as $id) 
{ 
    $concreteProduct = $rows[$id]; 
    ... 
} 

또한 그것을 알고 array으로, 데이터베이스에서 리턴 된 ID 값으로 키순으로 입력됩니다. ID는 고유하므로이 값은 tm입니다.

희망이 있으면 도움이됩니다. 일부는 조기 최적화를 호출 할 수도 있지만 대부분의 경우에 사용할 수 있기 때문에 개념을 알고 있어야합니다.