Подготовьте инструкцию MySQL с помощью функции IN ()

Теперь я делаю:

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

$params предоставляется пользователем, поэтому он явно небезопасен. Как я могу это исправить? Я бы предпочел использовать структуру, такую ​​как Zend.

Solutions Collecting From Web of "Подготовьте инструкцию MySQL с помощью функции IN ()"

Вы можете использовать подготовленные инструкции с 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) );