2016-06-11 5 views
-1

Ich habe ein nicht lösbares Problem mit einer SELECT-Anweisung in einem PHP-Skript. Diese Abfrage macht ihren Job, aber ich muss sie auch erweitern, um die Werte aus einer bestimmten Spalte zu erhalten.Wie man eine PHP-Variable in eine MySQL SELECT-Anweisung einfügt

`

$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); 

`

Auch diese Abfrage tut seine Arbeit. Aber jetzt versuche ich den SELECT Price FROM... Teil durch eine Variable zu ersetzen.

Ich habe diese vor der Abfrage:

`

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

Aber sobald, wie ich es so mache: (SELECT "$varPriceCol" FROM preise WHERE Art_pKey = a.pKey ORDER BY From_date DESC LIMIT 1) Price die Abfrage nicht mehr funktioniert. Wenn ich "PriceDEPT1" oder "PriceDEPT2" oder "Price" anstelle einer Variablen platziere, beginnt die Abfrage für jeden der 3 Spaltennamen zu arbeiten.

Was mache ich falsch?

Antwort

1

Versuchen Sie, die Anführungszeichen Ihrer Abfrage in Anführungszeichen zu setzen, da PHP Zeichenfolgen nicht durch Variablen ersetzen wird, wenn die Abfrage einfach-qouted ist. Innerhalb Ihrer Abfrage müssen Sie String-Literale in einfache Anführungszeichen ändern, damit sie der SQL-Syntax entsprechen.

So etwas:

$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

Vielen Dank! Dies hat das Problem gelöst. Liebe! – 0xbadc0de

2

Wenn Spalten auswählen, die Sie benötigen Backticks verwenden, um sie zu begrenzen:

SELECT `$varPriceCol` FROM ... 

Sie wollen auch extrem sicher, dass diese Variable enthält nur bekannt-gute Werte. Ihre if Kette ist ein gutes Beispiel dafür, aber man kann man besser durch einen Lookup-Array mit:

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

dass die Menge an Müll in Ihrer if Aussage minimiert, wenn richtig eingesetzt. Wenn Sie Code wie diesen schreiben und endlose Wiederholungen vermeiden, werden Fehler gemacht.

Die andere Sache, die Sie tun können, ist SELECT * und wählen Sie einfach die gewünschte Spalte aus dem Ergebnissatz.

+0

Sorry, vergaß zu erwähnen, dass ich Backticks sind in diesem Fall nicht funktioniert. Und ich weiß nicht warum. – 0xbadc0de

+1

@ 0xbadc0de "Not working" ist eine bedeutungslose Phrase. Erhalten Sie einen Fehler? Gibt die Abfrage die falschen Ergebnisse zurück? Genauer gesagt, bitte. Die Verwendung von einfachen oder doppelten Anführungszeichen ist einfach falsch, das liefert eine konstante Zeichenkette, die kein Wert aus der Spalte ist. – tadman

+0

Die Abfrage gibt nichts zurück, wenn Backticks verwendet werden. Wenn ich versuche, die $ r co-Konsole nach der Anweisung zu drucken, bekomme ich nur ein "falsches" ausgedruckt. Derselbe Fall, wenn ich versuche, eine nicht vorhandene Spalte auszuwählen. – 0xbadc0de

Verwandte Themen