Ver Mensaje Individual
  #40 (permalink)  
Antiguo 15/12/2013, 11:48
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Cambiar contenido de una variable mediante if

"...Algun motivo concreto para no usarlo..."

Cuando una misma cosa (en este caso un texto) vas a usarlo en varias partes de un codigo tienes que declarar algo que referencie a esa cosa de forma que cuando quieras usarla (para mostrarlo, para comprararlo, para lo que sea) usarás la referencia y no codigo picado hardcoded. Que ventajas tiene? La mas importante es que si quieres modificarlo por lo que sea solo con modificar la declaracion se modificará automaticamente todas las referencias que tengas en todo el codigo.

Ahora el array:

Código PHP:
Ver original
  1. $opciones = array(
  2.         "Todos los artículos",
  3.         "Hombre - Ropa",
  4.         "xxxxxx",
  5.         "xxxxx",
  6.         "etc"
  7.         );

Dependiendo de como tengas la tabla en la base de datos no es necesaria esta comprovacion, aunque si la haces te ahorras tiempo de trabajo en la base de datos, es decir que está bien. La comprovacion quieres hacerla para el contenido del array, no contra el array como objecto:

Código PHP:
Ver original
  1. if(in_array($selectapar, $opciones)) {
  2.     //ejecutas la busqueda en la bdd
  3. }
  4. else {
  5.     //no hay resultados
  6. }

Esto va junto con lo de arriba: la lista $opciones solo la tienes declarada una vez, es la que usaras para esta comprovacion y tambien la que usaras para popular el select html:

Código PHP:
Ver original
  1. <select name="selectapar">
  2. <?php
  3. foreach($opciones as $opcion) {
  4.     echo "<option value=\"".$opcion."\">".$opcion."</option>";
  5. }?>
  6. </select>

En cualquier otro sitio donde uses estas opciones has de trebajar tambien sobre el array $opciones; de esta forma ante cualquier cambio solo tienes que tocar el objeto $opciones.

Hasta aqui ok?

Ahora los tipos definidos en las tablas: si, me refiero a las tablas de la base de datos. Creas una tabla que se llame 'filtros' (es un ejemplo que me invento, puedes poner lo que quieras). Ahi tienes dos campos: id int, text varchar(50). El id es el identificador de tipo, el text es lo que se muestra al usuario (puedes poner tambien otro campo para una descripcion de cada tipo). Añades algunos tipos:

Código PHP:
Ver original
  1. 1, 'Todos los artículos'
  2. 2, 'Hombre - Ropa'
  3. 3, 'xxxxxxx'
  4. 4, 'etc'

La parte php de tu pagina quedaría sería algo asi:

Código PHP:
Ver original
  1. <?php
  2. //descargas todo lo que necesitas
  3. //en este caso solo quieres los filtros
  4. $mysqli = mysqli_connect("host", "user", "pass", "dbnm");
  5. $result = $mysqli->query("SELECT * FROM filtros");
  6.  
  7. //lo conviertes a algo de facil manejo, un array
  8. $filtros = array();
  9. while($row = mysqli_fetch_array($result)) {
  10.     $filtros[] = array('id'=>$row['id'], 'text'=>$row['text']);
  11. }
  12. $result->close();
  13.  
  14. //selectapar por defecto
  15. $default_selectapar = $filtros[0]['id'];
  16.  
  17. //recuperas selectapar
  18. if(($selectapar = (isset($_POST['selectapar']))? $_POST['selectapar'] : NULL) === NULL) {
  19.     if(($selectapar = (isset($_GET['selectapar']))? $_GET['selectapar'] : NULL) === NULL) {
  20.         $selectapar = $default_selectapar;
  21.         $pagina = 0;
  22.     }
  23.     else {
  24.         $pagina = $_GET["num"];
  25.     }
  26. }
  27. else {
  28.     $pagina = 0;
  29. }
  30.  
  31. //no hace falta que compruebes si existe algo o no
  32. //buscas resultados
  33. $query = sprintf("SELECT * FROM articulos etc etc");
  34. $resultados = $mysqli->query($query);
  35. //aqui transormaria el objeto mysqli_result a array para que sea mas manejable
  36. //finalizo el trabajo con la bdd
  37. $mysqli->close();
  38. ?>
  39. <html>
  40. <body>
  41.     <form method="POST">
  42.     <select name="selectapar">
  43.     <?php
  44.     foreach($filtros as $filtro) {
  45.         echo "<option value=\"".$filtro['id']."\">".$filtro['text']."</option>";
  46.     }
  47.     ?>
  48.     </select>
  49.     </form>
  50. </body>
  51. </html>

Falta lo del mapa de paginas, solo es para que veas lo basico. Como ves solo estoy picando a mano los nombres de los campos, ningun texto, ni ningun filtro ni nada. Todo está en la bdd, si quiero añadir o quitar filtros, voy a la bdd y lo hago allí, luego esta pagina solo trabajará con lo que reciba de la bdd. El valor de $seletapar será el indice del tipo de filtro, es decir que tal como describimos la tabla de ejemplo para 'Todos los articulos' el selectapar será 1, para 'Hombre ropa' será 2, etc... Luego cuando contruyas el mapa de paginas en los links tendras selectapar=1 o selectapar=3 o el que corresponda con la seleccion que inicio el usuario. De la misma forma en el select html los value de las opciones son indices que terminaran siendo el valor del selectapar.

Luego en la tabla de articulos de la bdd tendras algo del tipo id int, articulo varchar(100), descripcion varchar(255), precio float, selectapar int; si obtienes un selectapar = 1 haces la consulta completa (sin WHERE), si recibes un selectapar > 1 usas el WHERE para filtrar por ese dato. Aqui es donde vas a tener en cuenta que selectapar puede no ser un valor esperado, por eso haces algunas comprovaciones: sabes que tiene que ser un entero pues puedes usar alguna funcion de php que valide el selectapar como entero. Como no será de tipo texto no es necesario escapar los caracteres porque los convertiras a entero:

Código PHP:
Ver original
  1. if(!is_int($selectapar)) {
  2.     //algo pasa
  3. }
  4. else {
  5.     $query = sprintf("SELECT * FROM articulos WHERE selectapar=%d", $selectapar);
  6. }

Puede que te parezca mas complejo, pero a la larga te será mas facil implementar opciones y corregir errores.

Saludos
vosk