variable valor una recibir por pasar juntos imprimir formularios formulario enviar ejemplos datos codigo php search parameters isset

php - valor - Formulario de búsqueda con uno o más(múltiples) parámetros



pasar variable php a html (2)

Construya la cláusula WHERE dinámicamente. Mi enfoque recomendado es insertar cada condición en una matriz, y luego usar implode() para concatenar todas las condiciones, conectándolas con AND u OR según su preferencia.

$wheres = array(); $params = array(); if (!empty($_GET[''id''])) { $wheres[] = ''a.uid = :uid''; $params['':uid''] = $_GET[''id'']; } if (!empty($_GET[''major''])) { $wheres[] = ''a.major = :major''; $params['':major''] = $_GET[''major'']; } if (!empty($_GET[''name''])) { $wheres[] = ''b.name LIKE :name''; $params['':name''] = ''%''.$_GET[''name''].''%''; } // And so on for all parameters $sql = "SELECT * FROM user_details AS a JOIN user AS b ON a.uid = b.id"; if (!empty($wheres)) { $sql .= " WHERE " . implode('' AND '', $wheres); } $stmt = $db->prepare($sql); $stmt->execute($params);

Luego muestre los resultados como en su código original.

while ($student = $stmt->fetch()) { ... }

He entendido lo básico, donde he creado dos archivos, el formulario de búsqueda donde un usuario ingresa los parámetros de búsqueda y el archivo de resultados que produce los elementos ingresados. En aras de la simplicidad, designaremos el archivo del formulario de búsqueda como search.php y la página de resultados como results.php.

EDITAR: etiqueta de etiqueta limpia para una lectura más suave.

search.php

<?php if(!empty($_POST[''id'']) && isset($_POST[''id''])) { header("Location: ?m=search.results&id=".$_POST[''id''].""); } elseif(!empty($_POST[''major'']) && isset($_POST[''major''])) { header("Location: ?m=search.results&major=".$_POST[''major''].""); } elseif(!empty($_POST[''college'']) && isset($_POST[''major''])) { header("Location: ?m=search.results&college=".$_POST[''college''].""); } elseif (!empty($_POST[''name'']) && isset($_POST[''name''])) { header("Location: ?m=search.results&name=".$_POST[''name''].""); } elseif (!empty($_POST[''id'']) && !empty($_POST[''college'']) && !empty($_POST[''major'']) && isset($_POST[''submit'']) && !empty($_POST[''name''])) { echo "<div class=''alert alert-danger''>No students found. Please try different parameters.</div>"; } ?> <h4>Search</h4> <form method="POST"> <table width="100%"> <tr><td>ID:</td><td> <input type="text" name="id" class="form-control"></textarea></td></tr> <tr><td>Name:</td><td> <input type="text" name="name" class="form-control"></textarea></td></tr> <tr><td>Major:</td><td><select name="major" class="form-control"><option></option><?php echo majorSelect(); ?></select></td></tr> <tr><td>College:</td><td><select name="college" class="form-control"><option></option><?php echo collegeSelect(); ?></select></td></tr> <tr><td colspan="2"><input type="submit" name="submit" value="Search" class="btn btn-lrg btn-primary" style="margin-top:10px;"></td></tr> </table> </form>

resultados.php

<?php if(isset($_GET[''id''])){ $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND a.uid = ''".$_GET[''id'']."''"); while($student = $students->fetch()) { echo '' <tr> <td>''.$student[''uid''].''</td> <td>''.$student[''name''].''</td> <td>''.$student[''major''].''</td> <td>''.$student[''college''].''</td> <td><a href="?m=profile&id=''.$student[''id''].''" style="display:block">View</a></td> </tr>''; } } elseif(isset($_GET[''major''])){ $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND a.major = ''".$_GET[''major'']."''"); while($student = $students->fetch()) { echo '' <tr> <td>''.$student[''uid''].''</td> <td>''.$student[''name''].''</td> <td>''.$student[''major''].''</td> <td>''.$student[''college''].''</td> <td><a href="?m=profile&id=''.$student[''id''].''" style="display:block">View</a></td> </tr>''; } } elseif(isset($_GET[''college''])){ $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND a.college = ''".$_GET[''college'']."''"); while($student = $students->fetch()) { echo '' <tr> <td>''.$student[''uid''].''</td> <td>''.$student[''name''].''</td> <td>''.$student[''major''].''</td> <td>''.$student[''college''].''</td> <td><a href="?m=profile&id=''.$student[''id''].''" style="display:block">View</a></td> </tr>''; } } elseif(isset($_GET[''name''])){ $name = $_GET[''name'']; $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND b.name LIKE ''%". $name . "%''"); while($student = $students->fetch()) { echo '' <tr> <td>''.$student[''uid''].''</td> <td>''.$student[''name''].''</td> <td>''.$student[''major''].''</td> <td>''.$student[''college''].''</td> <td><a href="?m=profile&id=''.$student[''id''].''" style="display:block">View</a></td> </tr>''; } } ?>

Entonces, esencialmente me gustaría volver a escribir lo anterior, mientras que un usuario puede ingresar uno o más parámetros, y se devuelve el resultado deseado (por ejemplo, nombre y universidad - & name = x & college = y O todos los elementos si es necesario). Estoy pensando que tendré que repensar la lógica en ambos archivos, ¡pero estoy abierto a cualquier idea o sugerencia que usted, esta maravillosa comunidad, pueda tener! Cualquier consejo / guía sería muy apreciado.


Si no va a cambiar nada en la base de datos, solo está seleccionando, continúe y use GET en lugar de POST. La ventaja de esto es que le permitirá guardar la URL como su cadena de búsqueda. También puede actualizar la búsqueda sin recibir la alerta de reenvío posterior. Solo desea asegurarse de parametrizar sus valores antes de enviarlos a la base de datos. Normalmente enviaría esos valores a través de las funciones de desinfección, como una expresión regular que se asegura de que solo tenga letras si espera letras, o números si espera números.

En la misma página (todas las búsquedas): (Solo voy a describir esto para usted).

<form action="<?= $_SERVER["REQUEST_URI"]; ?>" method="GET"> <input name="major" value="<?= $_GET["major"]; ?>" /> <select name="college"> <option value="1" <?PHP if( $_GET["college"] == 1 ) echo ''selected="true"''; ?>>Business</option> </select> </form> <?PHP if( ! empty( $_GET ) ){ if (isset($_GET[''major''])) { $wheres[] = ''a.major = :major''; $params['':major''] = $_GET[''major'']; } if (isset($_GET[''name''])) { $wheres[] = ''b.name LIKE :name''; $params['':name''] = ''%''.$_GET[''name''].''%''; } // And so on for all parameters $sql = "SELECT * FROM user_details AS a JOIN user AS b ON a.uid = b.id"; if (!empty($wheres)) { $sql .= " WHERE " . implode('' AND '', $wheres); } $stmt = $db->prepare($sql); $stmt->execute($params); } ?>

Ahora puede mostrar sus datos.

editar: escribí la otra mitad de la respuesta, y luego él escribió la segunda mitad, así que la incorporé ...

Además, el siguiente nivel de sofisticación en esto sería eliminar el PHP del archivo de búsqueda y colocarlo en otro archivo. Cuando presiona el botón de búsqueda en su formulario, usaría AJAX para llamar a los elementos PHP. Luego, el archivo PHP devolvería los resultados a través de Ajax. Puede devolver el HTML preformateado o JSON y dejar que algo como JQuery lo muestre por usted.