使用PDO和MSSQL数据库使用名为“index”的列进行查询始终不返回任何内容

时间:2014-08-20 16:34:24

标签: php sql-server database pdo

我有一个包含2个名为data.MonthlyNormalDatadev.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]部分时,它会返回值。

2 个答案:

答案 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