Tomar una o más variables en select mysql

Por más que busco y re busco, no logro entender la manera de tomar una o más variables de un form para un select en mysql. Ya sé que esta pregunta la han hecho antes, pero precisamente he seguido todos los ejemplos y respuestas dadas aquí mismo y no me funciona nada.
Tengo un form con campos de selección tales como "barco", "puerto de embarque", "puerto de destino", etc. No hay campos de texto. Cada select del form toma una lista de una BD. Hasta ahí todo bien. Pero al pasar al script php no logro entender como hacer para que tome una sola variable o más a la vez como filtros para el select de la consulta Mysql, dependiendo de cuántos campos haya seleccionado el usuario. Hasta ahora he probado estas opciones dadas en respuestas en esta web:
Opción 1:
$sql_query="SELECT * FROM 'vehiculos' WHERE ";
$where_query="#";
$where_query .= (isset($_POST[Matricula]) && $_POST[Matricula] != "")?" AND `Matricula`= '$_POST[Matricula]'":"";
$where_query .= (isset($_POST[Marca]) && $_POST[Marca] != "")?", `Marca` = $_POST[Marca]":"";
$where_query .= (isset($_POST[Modelo]) && $_POST[Modelo] != "")?", `Modelo` = $_POST[Modelo]":"";
$where_query .= (isset($_POST[Precio]) && $_POST[Precio] != "")?", `Precio` = $_POST[Precio]":"";
$sql_query .= str_replace("# AND", "", $where_query);
$final=mysql_query($sql_query);
OPCION 2:
$criterio = '';
if ( isset($_GET['marca']) )
{
$criterio .= "AND marca LIKE '%{$_GET['marca']}%'";
}
if ( isset($_GET['modelo']) )
{
$criterio .= " AND modelo LIKE '%$_GET['modelo']}%' ";
}
luego al final creas una consulta sql asi:
$sql = "SELECT * FROM ordenadores WHERE TRUE $criterio";
En mi form estoy usando POST en method. En ambos ejemplos he cambiado los GET por POST, cuando corresponde. Además he intentado otras opciones particulares, y otras respuestas encontradas en la web, pero no me funciona nada. A lo más, elegir uno u otro filtro, pero no uno, o varios, o todos a la vez, como yo necesito.
1

1 Respuesta

18.475 pts.
Si colocas las dos páginas podría ayudarte un poco más...
¿No sé si sea necesario poner toda la página? Porque son once campos, y sería medio largo. Todos son iguales a estos 3 primeros que pongo de ejemplo:
<form action="?sec=admin_sistema/consolidacion.php&main=admin_sistema/consolidacion_resultadofiltro.php" method="post">
<table cellpadding="0" cellspacing="0" class="planilla">
<tr>
<td class="columna1">
<div class="campo">
 <label class="label">Motonave :</label>
 <select id="consolidacion_motonave" value="" name="consolidacion_motonave" class="input1"/>
  <option selected> -
<?php
$tabla = mysql_query("SELECT motonave FROM motonaves");
while ($registro = mysql_fetch_array($tabla)) {
?>
  <option value="<?php echo $registro['motonave']; ?>"><?php echo $registro['motonave']; ?>
<?php
}
mysql_free_result($tabla);
?>  
 </select>
 </div>
<div class="campo">
 <label class="label">Puerto de Embarque :</label>
 <select id="consolidacion_puertoembarque" value="" name="consolidacion_puertoembarque" class="input1"/>
  <option selected> -
<?php
$tabla = mysql_query("SELECT puerto_embarque FROM puertos_embarque");
while ($registro = mysql_fetch_array($tabla)) {
?>
  <option><?php echo $registro['puerto_embarque']; ?>
<?php
}
mysql_free_result($tabla);
?>
 </select>
 </div>
<div class="campo">
 <label class="label">Puerto de Destino :</label>
 <select id="consolidacion_puertodestino" value="" name="consolidacion_puertodestino" class="input1"/>
  <option selected> -
<?php
$tabla = mysql_query("SELECT puerto_destino FROM puertos_destino");
while ($registro = mysql_fetch_array($tabla)) {
?>
................
Y la página que recibe el form:
<?php
  $filtros='';
  foreach($_POST as $indice => $valor) {
    if ($valor!='') $filtros .="$indice='$valor' AND ";
  }
  if ($filtros!='') {
    $filtros=substr($filtros,0,strlen($filtros)-5);
    $tabla = mysql_query("SELECT * FROM consolidacion WHERE $filtros") or die ('No se han encontrado resultados porque no se ha seleccionado un criterio de búsqueda
<p> Realizar una nueva
<a href="?sec=admin_sistema/consolidacion.php&main=admin_sistema/consolidacion_buscar.php">Búsqueda</a>'.mysql_error());
echo 'Su consulta ha arrojado los siguiente resultados:
<p>';
}
?>
.............
Y la fila que muestra el resultado, en la misma página que el script php de arriba:
<?php
while ($registro = mysql_fetch_array($tabla)) {
$dia = $registro['consolidacion_dia'];
$m = strtr($registro['consolidacion_mes'],$mes);
$ano = $registro['consolidacion_ano'];
$fecha = $dia.' / '.$m.' / '.$ano;
$fechaconsolidacion = $registro['consolidacion_dia'].'_'.strtr($registro['consolidacion_mes'],$mes).'_'.$registro['consolidacion_ano'];
?>
<tr>
<td class="listas" align="right"><? echo $registro['id']; ?></td>
<td class="listas" align="left"><? echo $registro['consolidacion_numero']; ?></td>
<td class="listas" align="left">
<?
$exportador=$registro['consolidacion_exportador'];
$exportadores = mysql_query("SELECT exportador_nombre,exportador_razonsocial FROM exportadores WHERE exportador_razonsocial='$exportador' ");
$exportadornombre = mysql_fetch_array($exportadores);
echo $exportadornombre['exportador_nombre'];
mysql_free_result($exportadores);
?>
</td>
<td class="listas" align="left"><? echo $registro['consolidacion_contenedor']; ?></td>
<td class="listas" align="left"><? echo $registro['consolidacion_motonave']; ?></td>
<td class="listas" align="left"><? echo $fecha; ?></td>
<td class="listas" align="left"><? echo $registro['consolidacion_frigorifico']; ?></td>
<td class="listas" align="left"><? echo $registro['consolidacion_especie']; ?></td>
</tr>
Disculpa si soy muy desordenado. Recién estoy aprendiendo PHP y MySQL, y no soy ni programador ni nada (como me imgaino somos muchos que trabajamos por necesidad en este rubro).
Una vez más, gracias por tu disposición.
Prueba esto a ver:
$sql_query= 'SELECT * FROM tu_tabla';
$tag = false
if(isset($_POST['campo1']) && trim($_POST['campo1']) != ''){
   $sql_query .= 'WHERE campo1= "' . $_POST['campo1'] . '"';
   $tag = true;
}
if(isset($_POST['campo2']) && trim($_POST['campo2']) != ''){
   if(!$tag){
   $sql_query .= 'WHERE campo2= "' . $_POST['campo2'] . '"';
   $tag = true;
   }else{
   $sql_query .= 'campo2= "' . $_POST['campo2'] . '"';
   }
}
if(isset($_POST['campoN']) && trim($_POST['campoN']) != ''){
   if(!$tag){
   $sql_query .= 'WHERE campoN= "' . $_POST['campoN'] . '"';
   $tag = true;
   }else{
   $sql_query .= 'campoN= "' . $_POST['campoN'] . '"';
   }
}
echo 'QUERY = ' $sql_query;
A ver si te sirve.
Cambia los nombres 'campo1' etc... por los nombres de los campos de tu formulario.
Saludos...
P.D. Por favor cerrar y valorar las respuesta para que más personas como tu puedan hacer sus preguntas por aquí.
O soy muy matado de duro para entender, o tengo mala pata. Primero copié tal cual tu código y sólo reemplacé los nombres de los campos... y nada.
Me mostró un primer error después de $tag=false ... ¿se supone que debería haber un ; para cerrar la declaración? Lo puse y ahí siguió sin problemas.
Luego ¿no se supone que después del
}else{
   $sql_query .= '
Debería ir un AND, ¿para sumar las variables?. A lo mejor meto la pata, pero lo puse y al menos ahí no me arrojó error, pero sólo lee las variables si están todas juntas, y no de a una sola.
Ya sé que las respuestas son sólo de buena voluntad, así que si te aproblema responder, cierro definitivamente la pregunta.
Tranquilo... si disculpa faltaba todo lo que dices ahí
El ';' y los AND quedari así:
$sql_query= 'SELECT * FROM tu_tabla';
$tag = false;
if(isset($_POST['campo1']) && trim($_POST['campo1']) != ''){
   $sql_query .= 'WHERE campo1= "' . $_POST['campo1'] . '"';
   $tag = true;
}
if(isset($_POST['campo2']) && trim($_POST['campo2']) != ''){
   if(!$tag){
   $sql_query .= 'WHERE campo2= "' . $_POST['campo2'] . '"';
   $tag = true;
   }else{
   $sql_query .= 'AND campo2= "' . $_POST['campo2'] . '"';
   }
}
if(isset($_POST['campoN']) && trim($_POST['campoN']) != ''){
   if(!$tag){
   $sql_query .= 'WHERE campoN= "' . $_POST['campoN'] . '"';
   $tag = true;
   }else{
   $sql_query .= 'AND campoN= "' . $_POST['campoN'] . '"';
   }
}
Cualquier otra duda aquí estamos.
P.D. Por favor cerrar y valorar las respuesta para que más personas como tu puedan hacer sus preguntas por aquí.
No quiero extender más la pregunta. Parece que no tiene vuelta el caso, o yo hago algo mal. Siempre me permite la consulta sólo incluyendo todos los campos.
No puedo poner que me ha sido de gran utilidad, porque no he podido solucionar el problema, pero el experto ha puesto interés y ha demostrado gran disposición a ayudarme.
Muchas gracias por tu tiempo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas