2011-07-19 80 views
2

给定以下查询(在代码中,不是存储过程);我如何向查询添加参数,而不是直接在查询中包含条件值?换句话说:我如何使这个数据库调用安全?将参数添加到PHP mssql查询


$dbhandle = mssql_connect($myServer, $myUser, $myPass); 
$selected = mssql_select_db($myDB, $dbhandle); 

$query = "SELECT lastname, firstname, address, phone, email "; 
$query .= " FROM person"; 
$query .= " WHERE lastname LIKE '" . $lastName . "'"; 

$result = mssql_query($query); 

while($row = mssql_fetch_array($result)) { 
... etc. 
+0

为什么不用%LIKE就可以使用= –

+0

@劳伦斯LIKE会做一个不区分大小写的匹配。 –

回答

0

你需要的是一个准备好的声明(或只是一个DAL,让您进行参数的查询!)..一个选项是使用PDO,特别是与PDO_SQLSRV司机..

执行此操作时您可以在参数化的形式准备的查询,并通过他们在查询的时候,例如..

$conn = new PDO("sqlsrv:Server=$myServer;Database=$myDB", $myUser, $myPass); 
$stmt = $conn->prepare('SELECT lastname,firstname,address,phone,email FROM person WHERE lastname LIKE ?'); 
$stmt->execute(array($lastname)); 
$result = $stmt->fetchAll(); 
foreach ($result as $row) { 
    ... 

(注意上面的代码应该是就地更换,但是这是未经测试!)

如果你在某些时候在你的查询了很多的参数,它可能是最好使用命名的参数以便您可以更好地跟踪它们。

1

首先抛弃过时的推广和使用,而不是sqlsrv

这些功能允许您访问MS SQL Server数据库。

此扩展在Windows上不可用,PHP 5.3或 稍后。

SQLSRV是MS SQL的替代驱动程序,可从Microsoft获得: »http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx

之后,你得到suppport准备语句:

$dbh = sqlsrv_connect ($serverName, $credentials); 
$stmt = sqlsrv_prepare($dbh, 'SELECT lastname,firstname,address,phone,email FROM person WHERE lastname LIKE ?', array(&$lastName)); 


if(sqlsrv_execute($stmt)) 
{ 
    while(false !== ($row = sqlsrv_fetch_array($stmt)){ 
    // do stuff with $row 
    } 
} 

当然,如果我是你,我只想用PDO正如其他人用礼物建议相同的接口给所有DB支持的扩展。

如果由于某种原因使用mssql卡住了,那么我相信你也会陷入手动转义所有查询参数。