[英]php PDO fetch zero results for SQL Server
我有以下代码可以从查询中获取结果。
$sql =
"
SELECT 1 AS bar
FROM outsource.prodgroup_division
WHERE
(
CASE
WHEN :division = 'ALL' THEN 1
WHEN prodgroup_division.division = :division THEN 1
ELSE 0
END
) = 1
";
$stmt = $dw_db->prepare($sql);
$stmt->bindParam(':division', $division, 2); // 2 for strings
$stmt->execute();
$rows = $stmt->fetchAll();
$stmt->closeCursor();
我的除法参数设置为“ALL”。 当我在“ALL”中没有参数和硬编码的情况下运行它时,它给了我 22 行。 为什么我的$rows
数组中的数据为零?
我不确定为什么,也许有人可以帮助我理解。 当我将语法从命名参数更改为以下时,它起作用了。
$sql =
"
SELECT 1 AS bar
FROM outsource.prodgroup_division
WHERE
(
CASE
WHEN 'ALL' LIKE ? THEN 1
WHEN prodgroup_division.division = ? THEN 1
ELSE 0
END
) = 1
";
$stmt = $dw_db->prepare($sql);
$stmt->bindValue(1, $division); // 2 for strings
$stmt->bindValue(2, $division); // 2 for strings
$stmt->execute();
$rows = $stmt->fetchAll();
$stmt->closeCursor();
我不确定为什么你得到零结果而不是错误(可能你将 PDO 设置为无用的错误模式?),但我相信问题是绑定参数只能使用一次,即使你使用命名参数语法.
您可以给每个人一个不同的名称,并将相同的值绑定到两者:
$sql =
"
SELECT 1 AS bar
FROM outsource.prodgroup_division
WHERE
(
CASE
WHEN :division1 = 'ALL' THEN 1
WHEN prodgroup_division.division = :division2 THEN 1
ELSE 0
END
) = 1
";
$stmt = $dw_db->prepare($sql);
$stmt->bindParam(':division1', $division, \PDO::PARAM_STR);
$stmt->bindParam(':division2', $division, \PDO::PARAM_STR);
(出于同样的原因切换到位置参数 - 您已将相同的值绑定到多个占位符,而不是尝试重用一个。)
或者您可以使用绑定参数来填充 Transact-SQL 变量,并在查询中使用它:
$sql =
"
DECLARE @division INT = :division
SELECT 1 AS bar
FROM outsource.prodgroup_division
WHERE
(
CASE
WHEN @division = 'ALL' THEN 1
WHEN prodgroup_division.division = @division THEN 1
ELSE 0
END
) = 1
";
$stmt = $dw_db->prepare($sql);
$stmt->bindParam(':division', $division, \PDO::PARAM_STR);
(旁注:我使用了提供的常量\PDO::PARAM_STR
而不是手册中推荐的幻数2
。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.