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.
不支持
起初,我以为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.
不支持