如何在MySQL SELECT语句中包含PHP变量

时间:2016-06-11 20:21:25

标签: php mysql

我在PHP脚本中遇到了一个不可解决的SELECT语句问题。 这个查询正在完成它的工作,但是我需要扩展它以获取特定列的值。

`

$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"或"价格"而不是变量,查询开始为3个列名称中的任何一个开始工作。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

选择列时,您需要使用反引号来分隔它们:

SELECT `$varPriceCol` FROM ...

您还希望非常确定此变量仅包含已知良好的值。你的if链就是一个很好的例子,但你可以通过使用查找数组做得更好:

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

如果使用正确,最小化if语句中的垃圾量。在编写这样的代码时,尽量避免无休止的重复,这就是错误的产生方式。

您可以做的另一件事是SELECT *,只需从结果集中选择您想要的列。

答案 1 :(得分: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);