2016-05-04 2 views
1

У меня есть разбиение на страницы на моей веб-странице. Поэтому я хочу, чтобы добавить строку в мой запрос, если у меня есть пост от пагинации:mysql is_numeric sql injection

$q=""; 
if(isset($_POST["inpi"])){ 
    $in = $_POST["inpi"]; 
    if(is_numeric($in)){ 
     $q = "and c.id < '$in'"; // add this to mysql 
    } 
    else{die("something is wrong!");} 
} 

Так что я не могу использовать подготовить statments здесь.

select k.user, c.id, c.from, c.sent, c.message, c.recd from chat c 
inner join cadastro k on c.from=k.id 
where `from`=? and `to`=? $q 

уведомления переменного $ д, это не будет иметь никакого значения, если пост пуст или и c.id < «$ в».

безопасно ли это?

+1

Если вы проверяете ввод с использованием is_numeric, тогда я думаю, что вам не нужно беспокоиться о SQL-инъекции в этом случае. Поскольку для SQL-инъекции должны быть задействованы некоторые кавычки и строки. –

+2

Вы абсолютно можете использовать подготовленные заявления здесь. Вы используете PDO? Вы можете добавить что-то в строку запроса, а 'array' использовать для хранения значений одновременно. – tadman

+0

@tadman Я использую mysqli –

ответ

2

Вы всегда можете накапливать аргументы, как вы идете, и построить его так:

$query = "SELECT ... WHERE `from`=? AND `to`=?"; 
$binds = array("ss", &$from, &$to); 

if (isset($_POST["inpi"])) { 
    $query .= " AND c.id < ?"; 

    $$binds[0] .= "i"; 
    $binds[] = &$_POST["inpi"]; 
} 

$stmt = $mysqli->prepare($query); 

call_user_func_array(array($stmt, 'bind_param'), $binds); 

Я не проверял, но он основан на this code и может потребовать некоторой корректировки работы.

PDO's execute() Функция принимает array прямо вверх, с ней проще работать.

+0

О, это потрясающе! большое спасибо за вашу помощь, друг! –