繁体   English   中英

php PDO 为 SQL 服务器获取零结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM