使用PHP PDO和MSSQL无法将参数绑定到SQL语句

时间:2016-04-04 14:09:04

标签: php sql-server pdo

背景

开发环境:

在Windows 10 x64上使用Apache 2.4.16的PHP 7.0.4

SQL Server 2014标准

使用ODBC SQL Server驱动程序

通过PHP PDO将SQL语句执行到SQL服务器

问题

执行查询包含子查询时无法获取任何结果

除了以下示例之外,所有其他查询都包含子查询失败,并且某些查询需要处理来自用户的直接输入,因此需要卫生以避免SQL注入。

假设成功代码

$dblink = new PDO("odbc:Driver={SQL Server};Server=$server;Database=$db",  $user, $password);
$stmt = $dblink->prepare("SELECT * , ( SELECT RTRIM([Permission]) FROM [StaffLogin] WHERE [Staff].[StaffID] = [StaffLogin].[StaffID] ) AS [Permission] FROM [Staff] WHERE [StaffID] = ?");
$stmt->bindValue( 1 , "00522" , PDO::PARAM_INT);
$stmt->execute();
$stmt->fetchAll(PDO::FETCH_ASSOC);

但上面的代码没有返回任何结果。

解决代码问题

$dblink = new PDO("odbc:Driver={SQL Server};Server=$server;Database=$db", $user, $password);
$stmt = $dblink->prepare("SELECT * , ( SELECT RTRIM([Permission]) FROM [StaffLogin] WHERE [Staff].[StaffID] = [StaffLogin].[StaffID] ) AS [Permission] FROM [Staff] WHERE [StaffID] = '00522'");
$stmt->execute();
$stmt->fetchAll(PDO::FETCH_ASSOC);

此代码返回一行记录。

修改

以下两项都尝试了

$stmt->bindValue( 1 , "00522" , PDO::PARAM_INT); // No result
$stmt->bindValue( 1 , "00522" , PDO::PARAM_STR); // No result

1 个答案:

答案 0 :(得分:0)

当您想要绑定字符串时,您正在绑定整数:

$stmt->bindValue( 1 , "00522" , PDO::PARAM_STR);