PDO 绑定不起作用

PDO Binding is not working

起初,我以为Eloquent/Query Builder 坏了。罪魁祸首是 PDO。我正在使用 MSSQL/SqlSrv

PHP版本:7.1

MSSQL 2016

我正在尝试 运行 这个查询:

$results = DB::connection('RF_USER')->select("SELECT username = CAST(id as varchar(255)), password = CAST(password as varchar(255)) FROM tbl_rfaccount WHERE id=CONVERT(binary, :username)", ["username" => $username]);

但它一直返回一个空数组,因为我的数据库中确实有数据。 id 是 BINARY 类型。密码也是二进制类型。我该如何解决这个问题?

调试后发现:

当我像这样明确说明用户名时,即 'HASSAN'

$results = DB::connection('RF_USER')->select("SELECT username = CAST(id as varchar(255)), password = CAST(password as varchar(255)) FROM tbl_rfaccount WHERE id=CONVERT(binary, 'HASSAN')");

它 returns 正确。

但是,当我尝试绑定用户名时,它不起作用。我确实调试了变量 $username 的值,它是完全正确的。

经过几个小时的调试,我决定使用纯 PDO,你猜怎么着? PDO 是罪魁祸首。

    $username = "HASSAN";

    $stmt = $this->db->prepare("SELECT username = CAST(id as varchar(255)), password = CAST(password as varchar(255)) FROM tbl_rfaccount WHERE id=CONVERT(binary, :username)");

    $stmt->bindValue(':username', $username, PDO::PARAM_STR);
    $stmt->execute();

    $results = $stmt->fetch();

上面的代码是正确的,但是不起作用。而且 by 不起作用,我的意思是,我得到的结果是空的。没有结果。但是,这样做:

    $stmt = $this->db->prepare("SELECT username = CAST(id as varchar(255)), password = CAST(password as varchar(255)) FROM tbl_rfaccount WHERE id=CONVERT(binary, 'HASSAN')");

    $stmt->execute();

    $results = $stmt->fetch();

使用 DB::raw() 作为您的 select 语句。

$results = DB::connection('RF_USER')->select(
               DB::raw(
                 "SELECT 
                     username = CAST(id as varchar(255)), 
                     password = CAST(password as varchar(255)) 
                  FROM tbl_rfaccount 
                  WHERE id=CONVERT(binary, :username)", 
                  ["username" => $username]
              )
           );

经过研究,我发现您不能在 SQL 查询的函数内对值使用绑定。 MSSQL.

不支持