2016-06-11 2 views
-1

PHP 스크립트에서 SELECT 문으로 해결할 수없는 문제가 있습니다. 이 쿼리는 작업을 수행하고 있지만 특정 열의 값도 가져와야합니다.MySQL SELECT 문에 PHP 변수를 포함하는 방법

`다시

`

$r = DBi::$conn->query(' 
     SELECT 
      a.pKey, 
      a.Name, 
      a.`Pic-Name`, 
      a.GTIN, 
      a.Type, 
      a.Avail, 
      (SELECT Price FROM preise WHERE Art_pKey = a.pKey ORDER BY From_date DESC LIMIT 1) Price, 
      (AVG((b.Preice/b.Art_Num) * -1.00)) Mid_price, 
      a.Created 
     FROM art a LEFT 
     JOIN kasse b ON a.pKey = b.Art_pKey 
    WHERE Aktiv = "Y" AND Avail = "Y" AND Visible = "Y" 
    GROUP BY a.pKey 
    ORDER BY Avail DESC, Name ASC 
    ') or trigger_error('Query Failed! SQL: ' . $r . ' - Error: ' . mysqli_error(DBi::$conn), E_USER_ERROR); 

는,이 쿼리는 일을하고있다. 하지만 지금은 SELECT Price FROM... 부분을 변수로 대체하려고합니다. 내가 이런 식으로 일을 해요로, 즉시

`

if ($_SESSION['user']['Organisation'] == 'DEPT1'){ 
     $varPriceCol = 'PriceDEPT1'; 
    } 
    elseif ($_SESSION['user']['Organisation'] == 'DEPT2'){ 
     $varPriceCol = 'PriceDEPT2'; 
    } 
    else{ 
     $varPriceCol = 'Price';` 

:하지만

나는이 이전에 쿼리를 넣어 (SELECT "$varPriceCol" FROM preise WHERE Art_pKey = a.pKey ORDER BY From_date DESC LIMIT 1) Price를 쿼리가 작동을 멈 춥니 다. 변수 대신 "PriceDEPT1"또는 "PriceDEPT2"또는 "Price"를 배치하면 쿼리는 3 개의 열 이름 중 하나에서 작동하기 시작합니다.

내가 뭘 잘못하고 있니?

답변

1

쿼리가 큰 따옴표로 변경되도록하십시오. PHP가 쿼리가 단일 쿼리 인 경우 변수로 문자열을 대체하지 않으므로 큰 따옴표로 변경하십시오. 또한 쿼리 내에서 문자열 리터럴을 작은 따옴표로 변경해야하므로 SQL 구문을 준수합니다. 그런

뭔가 :

$r = DBi::$conn->query(" -- <<< note double quote 
     SELECT 
      a.pKey, 
      a.Name, 
      a.`Pic-Name`, 
      a.GTIN, 
      a.Type, 
      a.Avail, 
      (SELECT $varPriceCol FROM preise WHERE Art_pKey = a.pKey ORDER BY From_date DESC LIMIT 1) Price, 
      (AVG((b.Preice/b.Art_Num) * -1.00)) Mid_price, 
      a.Created 
     FROM art a LEFT 
     JOIN kasse b ON a.pKey = b.Art_pKey 
    WHERE Aktiv = 'Y' AND Avail = 'Y' AND Visible = 'Y' -- <<< note single quotes 
    GROUP BY a.pKey 
    ORDER BY Avail DESC, Name ASC 
    ") or trigger_error('Query Failed! SQL: ' . $r . ' - Error: ' . mysqli_error(DBi::$conn), E_USER_ERROR); 
+0

많은 감사! 이로 인해 문제가 해결되었습니다. 애정! – 0xbadc0de

2

것은 그들을 구분하는 방법은 역 따옴표를 사용할 필요가 열을 선택할 때 :

SELECT `$varPriceCol` FROM ... 

는 또한이 변수는 알려진 좋은 값을 포함하는 것이 매우 특정 로 할 것입니다. 귀하의 if 체인이의 좋은 예입니다,하지만 당신은 조회 배열을 사용하여 하나의 더 나은을 할 수있는 : 올바르게 사용 경우 if 성명에서 쓰레기의 양을 최소화

$columnMap = array('DEPT1' => 'PriceDEPT1', 'DEPT2' => 'PriceDEPT2'); 
$columnMapDefault = 'Price'; 

. 이런 식의 코드를 작성할 때 끝없는 반복을 피하려고하면 실수가 발생합니다.

당신이 할 수있는 다른 일은 SELECT *이며 결과 세트에서 원하는 열을 선택하면됩니다.

+0

미안 해요, 난 역 따옴표이 경우 작동하지 않는 것을 언급하는 것을 잊었다. 그리고 나는 이유를 모른다. – 0xbadc0de

+1

@ 0xbadc0de "작동하지 않음"은 의미가없는 문구입니다. 오류가 있습니까? 쿼리가 잘못된 결과를 반환합니까? 더 구체적으로 말하십시오. 작은 따옴표 나 큰 따옴표를 사용하는 것은 단지 틀린 것이며, 이는 열의 값이 아닌 상수 문자열을 반환합니다. – tadman

+0

백틱을 사용하면 쿼리에서 아무 것도 반환하지 않습니다. 내가 $ r 공동 콘솔을 인쇄하려고하면 "false"라는 문구가 출력됩니다. 동일한 기존의 열을 선택하려고하는 경우에도 마찬가지입니다. – 0xbadc0de

관련 문제