MSSQL参数化查询

时间:2017-03-09 05:13:44

标签: php sql-server database

通过MySQLi我会这样做:

$sql = $connect->prepare("INSERT INTO Table (a, b) VALUES (?, ?)");
$sql->bind_param('ss', $a, $b);
$sql->execute();
$sql->close();

现在的问题是,我如何使用mssql为SQL Server而不是MySQL做同样的事情?

我知道我能做到:

$sql = sqlsrv_query($connect, "INSERT INTO Table (a, b) VALUES (?, ?)", array($a, $b));

但是,这需要特定于Windows的SQL驱动程序,我无法在Linux平台上使用(实际上我的网站是托管的)。

我的服务器安装了mssql库,即使它已被弃用,但它仍然适用于PHP 5.6

我在查询参数化方面遇到了麻烦,我所能做的就是:

$sql = "INSERT INTO Table (a, b) VALUES ('$a', '$b')";
mssql_query($sql, $connect);

但当然我不想直接插入值,所以如何在mssql上参数化该查询?

1 个答案:

答案 0 :(得分:0)

似乎这不是最简单的事情。无论如何,绝对准备好的陈述将在PDO

中发生

来自原始的PHP文档:

  

如果无法使用SqlSrv,则可以使用PDO_ODBC驱动程序   连接到Microsoft SQL Server和Sybase数据库,作为本机   Windows DB-LIB是古老的,线程不安全,不再受支持   微软。

您可以针对您的案例阅读 UNIX系统上的PDO_ODBC 部分。不要忘记阅读评论,它们可能对您了解应该如何发生有用。

您可以参考this堆栈溢出问题。

这就是你用PDO进行参数化查询的方法:

$sql = 'SELECT name, colour, calories FROM fruit
    WHERE calories < :calories AND colour = :colour';
// where $dbh is PDO object
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
$sth->execute(array(':calories' => 175, ':colour' => 'yellow'));
$yellow = $sth->fetchAll();

请参阅official docs上的其他示例。

祝你好运的朋友,不要忘记分享你的经验。