我在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个列名称中的任何一个开始工作。
我做错了什么?
答案 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);