使用 PHP 和 MSSQL 准备好的语句
Prepared statement with PHP and MSSQL
我对 pdo 有一个奇怪的看法。使用准备好的语句,我从数据库中得到 0 个结果。但是硬编码我得到了正常的结果。这是针对 mssql(< 2012)的 sql 查询,以获得有限的结果。
Prepared Statement(只是不要怀疑 top 和 offset 变量。我在函数中设置它们只是为了测试目的。另外 $conn 是为 Whosebug 编辑的。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();
}
}
有了这个我得到了正确的结果。
这怎么可能?准备好的陈述有什么问题?我有很多prepared statements,之前用的很好
感谢您的回答。
@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();
}
}
不允许在 PDO 中为 SELECT 和 sql 查询的一部分使用参数绑定。
我用另一个不需要设置 TOP
的查询替换了整个查询
我对 pdo 有一个奇怪的看法。使用准备好的语句,我从数据库中得到 0 个结果。但是硬编码我得到了正常的结果。这是针对 mssql(< 2012)的 sql 查询,以获得有限的结果。
Prepared Statement(只是不要怀疑 top 和 offset 变量。我在函数中设置它们只是为了测试目的。另外 $conn 是为 Whosebug 编辑的。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();
}
}
有了这个我得到了正确的结果。
这怎么可能?准备好的陈述有什么问题?我有很多prepared statements,之前用的很好
感谢您的回答。
@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();
}
}
不允许在 PDO 中为 SELECT 和 sql 查询的一部分使用参数绑定。
我用另一个不需要设置 TOP
的查询替换了整个查询