使用IN()函数准备MySQL语句

时间:2011-08-23 08:19:15

标签: php mysql zend-framework

现在我做了:

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以prepared statements使用PDO

$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 );

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

答案 1 :(得分: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)
);