una tiempo real rango por insertar hacer guardar formulario fechas extraer desde datos con como busqueda buscar buscador avanzado php mysql select

php - tiempo - Filtrar consulta MYSQL con opciones de formulario



hacer una busqueda por fechas en php (2)

Tengo un formulario con múltiples entradas que son mis filtros. Este es mi código (no todo, solo la parte que quiero arreglar):

$req_resumo = ''''; $req_status = ''''; $req_usuario = ''''; $n_req = 0; $parametros = ""; // Checks which fields are filled and increases the number of filters for future usage if (isset($_POST[''usuario'']) && $_POST[''usuario''] != "") { $req_usuario = $_POST[''usuario'']; $n_req++; } if (isset($_POST[''resumo'']) && $_POST[''resumo''] != "") { $req_resumo = $_POST[''resumo'']; $n_req++; } if (isset($_POST[''status'']) && $_POST[''status''] != "") { $req_status = $_POST[''status'']; $n_req++; } // Then (there is some code between these parts) if ($n_req > 0 && $funcao != ''usuario'') $parametros.= " where "; if ($req_usuario != "") { $parametros.= " usuario = ''$req_usuario'' "; if ($n_req > 1) $parametros.= " and "; } if ($req_resumo != "") { $parametros.= " resumo = ''$req_resumo'' "; if ($n_req > 1 && ($req_status != "") || ($req_data_inicial != "")) $parametros.= " and "; } if ($req_status != "") { $parametros.= " status = ''$req_status'' "; } // This will create the query and add the parameters string at the end. $tot = mysqli_query($con, "SELECT * FROM solicitacoes $parametros");

Este código parece feo, e incluso para mí (principiante), no se siente bien, no suena como la forma de codificación.

Entonces, ¿hay alguna manera mejor y más fácil de construir este código?


Dale una oportunidad. De mi prueba localmente (sin db) se veía bien.

$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://.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 se rellenan los tres valores, su consulta debe ser

SELECCIONAR * FROM soliccoes donde usuario =? y resumo =? y estado =?

El ? se completan con los valores por el controlador más adelante en el proceso. Esto evita que los usuarios agreguen código malicioso para manipular el procesamiento de SQL.

https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet#Defense_Option_1:_Prepared_Statements_.28Parameterized_Queries.29
¿Cómo puedo prevenir la inyección SQL en PHP?

Tampoco vi dónde se estableció $funcao ..

Puede comentar las funciones mysqli y descomponer las líneas de eco para ver qué hace el código. Así es como las consultas confirmadas se estaban construyendo como se esperaba.


$predicates = array(); if ($_POST[''usuario''] != "") { $predicates[] = "usuario = ''{$_POST["usuario"]}''"; } if ($_POST[''resumo''] != "") { $predicates[] = "resumo = ''{$_POST["resumo"]}''" } if ($_POST[''status''] != "") { $predicates[] = "status = ''{$_POST["status"]}''" } if (count($predicates) == 0) { // handle case when nothing specified in POST } else { $tot = mysqli_query($con, "SELECT * FROM solicitacoes WHERE " . implode(" and ", $predicates) ); }

Puede que no tenga toda su lógica exactamente como se requiere ... pero las ideas están ahí. Utilice implode() para insertar and entre los predicados de su cláusula WHERE (deducirá cuántos se necesitan, si hay alguno). Además, dado que es el formulario HTML el que envía el POST, puede estar seguro de que se pasa al menos algún valor para cada variable POST (por lo que isset() no es obligatorio).