2011-08-23 70 views
1

MySQL的语句现在我做:准备在()函数

$params = array(1,2,3); 
$sql = 'select * from foo where bar in (%s)'; 

$sql = sprintf($sql, 
    implode(',', $params) 
); 

$params由用户提供的,因此显然是不安全的。 我该如何解决这个问题?我更喜欢使用像Zend这样的框架。

+0

[MySQL Prepared statement with a variable size variable list]可能的重复(http://stackoverflow.com/questions/327274/mysql-prepared-statements-with-a-variable-size-variable-list) – outis

回答

2

你可以使用prepared statementsPDO

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 
$params = array(1,2,3); 
$values = implode(',', array_fill(0, count($params), '?')); // ?,?,? 
$sql = "select * from foo where bar in ($values)"; 
$stmt = $dbh->prepare($sql); 

$stmt->execute($params); 

通过使用预准备语句,您可以避免需要转义数据。你仍然需要验证它。

0

你必须使每个数组入口安全。要么使用mysql_real_escape_string(),要么在你的情况下,只是通过强制转换为int。最通用的方法是如下:

function quoteString($string) { 
    return "'" . mysql_real_escape_string($string) . "'"; 
} 

$quotedParams = array_map("quoteString", $params); 

$sql = sprintf($sql, 
    implode(',', $quotedParams) 
); 

在你的情况,你可以强制转换为int,所以你可以做这样的:

$intParams = array_map("intval", $params); 

$sql = sprintf($sql, 
    implode(',', $intParams) 
);