【发布时间】:2014-10-14 00:02:26
【问题描述】:
有点被这个难住了。我已经开发了大约一个星期,也许两个,所以这可能是一个菜鸟的错误,但这是我所拥有的:
<?php
$msDB = new PDO('odbc:Driver={SQL Server Native Client 11.0};Server=SOMESERVER;Trusted_Connection=yes;');
try{
//set values for query
$s="4";
$d1="'2014-10-01 00:00:00'";
$d2="'2014-10-31 23:59:59'";
//create query variable
$q1 = "SELECT ID FROM SURVEY_QUESTION_RESPONSE AS t1 WHERE EXISTS
(SELECT * FROM SURVEY_RESPONSE AS tN
WHERE (tN.ID = t1.SURVEY_RESPONSE_ID)
AND (t1.SELECTION = :s)
AND (tN.RESPONSE_DATE BETWEEN :d1 AND :d2))";
//run prepare and bindParam
$tbe = $msDB->prepare($q1);
$tbe->bindParam(':s',$s, PDO::PARAM_INT);
$tbe->bindParam(':d1',$d1, PDO::PARAM_STR);
$tbe->bindParam(':d2',$d2, PDO::PARAM_STR);
//execute query
$tbe->execute();
//fetch resulting data
$res = $tbe->fetchAll(PDO::FETCH_ASSOC);}
//error handling
catch (PDOException $e) {
throw new pdoDbException($e);
}
//print the resulting array
print_r($res);
//set initial count
$cnt=0;
//loop through and increment count
foreach($res as $key=>$value){
foreach($value as $v2 ){
$cnt++;
}
}
//return count value
echo "Total:<br/>".$cnt."<br/>";
?>
我希望这会返回数字 3 的结果集。当我手动指定查询中的值时,一切都按预期工作并返回数字 3。
但是,如果我使用 bindParam 方法,它不会返回任何内容,也不会引发任何类型的错误。它只是返回一个空数组。
我还可以分解 $q1 中的查询集并将值连接到其中,它也可以完美地工作。我之前并没有真正使用过 bindParam,但据我所知,我使用它是正确的。
作品:
//create query variable
$q1 = "SELECT ID FROM SURVEY_QUESTION_RESPONSE AS t1 WHERE EXISTS
(SELECT * FROM SURVEY_RESPONSE AS tN
WHERE (tN.ID = t1.SURVEY_RESPONSE_ID)
AND (t1.SELECTION = ".$s.")
AND (tN.RESPONSE_DATE BETWEEN ".$d1." AND ".$d2."))";
当我在 MSSQL Server Management Studio 中运行查询时,它也会返回我期望的结果集。
谁能告诉我我做错了什么?
【问题讨论】:
-
也许这个link 会帮助你
-
@khrisna-gunanasurya 谢谢。在阅读了该帖子并进行了一些广泛的测试之后,似乎 ODBC 驱动程序正在将日期格式字符串转换为 MSSQL 服务器不期望的内容。使用变量而不是绑定参数似乎是唯一可行的解决方案。再次感谢。
标签: php sql-server pdo