【发布时间】:2018-08-13 15:17:33
【问题描述】:
我有一个关于 pdos 的奇怪场景。使用准备好的语句,我从数据库中得到 0 个结果。但是硬编码我得到了正常的结果。这是对 mssql (
Prepared 语句(只是不要怀疑 top 和 offset 变量。我在函数中设置它们只是为了测试目的。还为 stackoverflow 编辑了 $conn。prepare 函数可以从函数中访问,所以有没问题):
public function myFunction($top, $offset) {
try {
$top = 20;
$offset = 1;
$sql = "SELECT TOP :top * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS t1
FROM myTable) AS nU WHERE t1 >= :offset";
$statement = $conn->prepare($sql);
$statement->execute(array(':top' => $top, ':offset' => $offset));
return $statement->fetchAll();
} catch (Exception $e) {
echo $e->getMessage();
}
}
结果是一个包含 0 个元素的数组。
但是有了这个,它就可以完美地工作了:
public function myFunction($top, $offset) {
try {
$top = 20;
$offset = 1;
$sql = "SELECT TOP 20 * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS t1
FROM myTable) AS nU WHERE t1 >= 1";
$statement = $conn->prepare($sql);
$statement->execute();
return $statement->fetchAll();
} catch (Exception $e) {
echo $e->getMessage();
}
}
这样我得到了正确的结果。
这怎么可能?准备好的陈述有什么问题?我有很多准备好的语句,之前效果很好。
感谢您的回答。
@EDIT - 更新代码 - 仍然不工作:
public function myFunction($top, $offset) {
try {
$top = 20;
$offset = 1;
$sql = "SELECT TOP :top * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS t1
FROM myTable) AS nU WHERE t1 >= :offset";
$statement = $conn->prepare($sql);
$statement->bindParam(':top', $top, PDO::PARAM_INT);
$statement->bindParam(':offset', $offset, PDO::PARAM_INT);
$statement->execute();
return $statement->fetchAll();
} catch (Exception $e) {
echo $e->getMessage();
}
}
【问题讨论】:
-
我认为
TOP需要一个 int 并且您正在向它传递一个字符串(使用准备好的语句)。var_dump($statement->execute());prolly 输出错误 -
尝试打印sql查询。
-
This link 可能会有所帮助。
-
@bassxzero:是的,它输出错误。但是 $statement->bindValue(':top', (int) $top, PDO::PARAM_INT); $statement->bindValue(':offset', (int) $offset, PDO::PARAM_INT);也不行
-
用
'.$top.'替换:top在这里没有帮助吗?还是我很傻
标签: php sql-server pdo prepared-statement