Essayez ceci. D'après mes tests locaux (sans db), ça avait l'air correct.
$n_req = 0;
$_POST['usuario'] = 'test';
$_POST['resumo'] = 'test2';
$_POST['status'] = 'test3';
if (!empty($_POST['usuario'])) {
$req_usuario = $_POST['usuario'];
$where[] = " usuario = ? ";
$params[] = $req_usuario;
$n_req++;
}
if (!empty($_POST['resumo'])) {
$req_resumo = $_POST['resumo'];
$where[] = " resumo = ? ";
$params[] = $req_resumo;
$n_req++;
}
if (!empty($_POST['status'])) {
$req_status = $_POST['status'];
$where[] = " status = ? ";
$params[] = $req_status;
$n_req++;
}
$sql_where = !empty($where) ? ' where ' . implode(' and ', $where) : '';
echo $sql_where;
$tot = mysqli_prepare($con, "SELECT * FROM solicitacoes $sql_where");
if(!empty($params)) {
//foreach($params as $param) {
// mysqli_stmt_bind_param($tot, "s", $param);
//echo $param;
//}
$params = array_merge(array($tot),
array(str_repeat('s', count($params))),
array_values($params));
print_r($params);
call_user_func_array('mysqli_stmt_bind_param', $params);
// adapated from https://stackoverflow.com/questions/793471/use-one-bind-param-with-variable-number-of-input-vars and http://www.pontikis.net/blog/dynamically-bind_param-array-mysqli may need to be altered
}
echo "SELECT * FROM solicitacoes $sql_where";
mysqli_execute($tot);
Si les trois valeurs sont renseignées, votre requête doit être
Le ?
sont remplis avec les valeurs par le pilote plus tard dans le processus. Cela empêche le ou les utilisateurs d'ajouter du code malveillant pour manipuler le traitement SQL.
https://www.owasp.org/index.php /SQL_Injection_Prevention_Cheat_Sheet#Defense_Option_1 :_Prepared_Statements_.28Parameterized_Queries.29
Comment puis-je empêcher SQL injection en PHP ?
Je n'ai pas non plus vu où $funcao
a été défini..
Vous pouvez commenter le mysqli
fonctions et décommentez les lignes d'écho pour voir ce que fait le code. C'est ainsi que j'ai confirmé que les requêtes étaient construites comme prévu.