我有一个包含2个名为data.MonthlyNormalData
和dev.Station
的表的数据库,其中我想使用INNER JOIN
的查询。在该查询中,特别是在WHERE
子句中,我对index
表中名为data.MonthlyNormalData
的列使用了条件。当然,在sql server中,index
是一个保留字,我可以通过编写以下代码来逃避它:WHERE [index] = 'foo'
。
现在我的问题是,当我使用PDO在我的PHP脚本中进行查询时,我没有收到任何数据,但在sql server中,使用相同的查询,我确实看到从查询返回的数据。我认为那是因为在sql server中我转义了index
关键字,而在我的脚本中我没有。这真的是怎么回事?如果是这样,我该如何解决这个问题?
供参考,这是我的PHP脚本中的查询:
$db = ConnectionFactory::getFactory()->getConnection();
$stmt = $db->prepare("SELECT MND.value, MND.normal_code FROM data.MonthlyNormalData AS MND INNER JOIN dev.Station AS S ON MND.station_id = S.station_id WHERE MND.element_id = $indice[1][0] AND MND.index = $indice[1][1] AND MND.threshold = $indice[1][2] AND MND.month = $monthNum AND S.station_id = $slt_idStations ORDER BY MND.last_updated DESC");
$stmt->execute();
if ($row = $stmt->fetch())
{
array_push($queryResults, $row['value']);
}
else
{
echo "NO DATA :'( !!!!! </br>";
}
其中$ indices [1] [x],$ monthNum和$ slt_idStations是整数。我已经echo
检查了他们是否拥有正确的价值观,他们确实这样做了。 ConnectionFactory
类为PDO连接设置了所有连接配置和选项,我在整个代码中都使用了它,没有任何问题。
这是我在sql server上使用的查询,它有效(我在查询中用实际值替换了PHP变量):
SELECT MND.value, MND.normal_code
FROM [criacc_bd].[data].[MonthlyNormalData] AS MND
INNER JOIN [criacc_bd].[dev].[Station] AS S
ON MND.station_id = S.station_id
WHERE MND.element_id = '54'
AND MND.[index] = '0'
AND MND.threshold = '0'
AND MND.month = '12'
AND S.station_id = '6047'
ORDER BY MND.last_updated DESC
编辑:刚收到确认index
列是问题,因为当我删除PHP查询的AND MND.index = $indice[1][1]
部分时,它会返回值。
答案 0 :(得分:1)
您的格式化查询:
SELECT MND.value, MND.normal_code
FROM data.MonthlyNormalData AS MND INNER JOIN dev.Station AS S
ON MND.station_id = S.station_id
WHERE
MND.element_id = $indice[1][0] AND
MND.index = $indice[1][1] AND
MND.threshold = $indice[1][2] AND
MND.month = $monthNum AND
S.station_id = $slt_idStations
ORDER BY MND.last_updated DESC
您无法在引用的字符串中扩展数组值,它必须是:
SELECT MND.value, MND.normal_code
FROM data.MonthlyNormalData AS MND INNER JOIN dev.Station AS S
ON MND.station_id = S.station_id
WHERE
MND.element_id = {$indice[1][0]} AND
MND.index = {$indice[1][1]} AND
MND.threshold = {$indice[1][2]} AND
MND.month = $monthNum AND
S.station_id = $slt_idStations
ORDER BY MND.last_updated DESC
或者更好的是,使用参数,因为您显然已经在使用支持预准备语句的引擎。
答案 1 :(得分:0)
问题在于index
专栏和Sammitch在答案中提到的内容。解决方法是采取Sammitch的答案,并在index
函数中使用[]
转义prepare()
,如下所示:
SELECT MND.value, MND.normal_code
FROM data.MonthlyNormalData AS MND
INNER JOIN dev.Station AS S
ON MND.station_id = S.station_id
WHERE MND.element_id = {$indice[1][0]}
AND MND.[index] = {$indice[1][1]}
AND MND.threshold = {$indice[1][2]}
AND MND.month = $monthNum
AND S.station_id = $slt_idStations
ORDER BY MND.last_updated DESC
通过阅读以下答案我发现了括号逃脱:Unable to quote table name in PDO with MSSQL