Теперь я делаю:
$params = array(1,2,3); $sql = 'select * from foo where bar in (%s)'; $sql = sprintf($sql, implode(',', $params) );
$params
предоставляется пользователем, поэтому он явно небезопасен. Как я могу это исправить? Я бы предпочел использовать структуру, такую как Zend.
Вы можете использовать подготовленные инструкции с 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 );
Используя подготовленные инструкции, вы избегаете необходимости избегать ваших данных. Однако вам все равно придется проверять его.
Вы должны сделать каждую запись массива безопасной. Либо использование 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) );