Foros del Web » Programando para Internet » PHP »

Tabla vacía en resultados de BD

Estas en el tema de Tabla vacía en resultados de BD en el foro de PHP en Foros del Web. Hace unos años modifiqué un código php para buscar en una tabla mysql. Ahora he intentado recuperarlo pero no me funciona. Os pongo el código: ...
  #1 (permalink)  
Antiguo 30/11/2014, 06:19
 
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 127
Antigüedad: 12 años, 8 meses
Puntos: 2
Tabla vacía en resultados de BD

Hace unos años modifiqué un código php para buscar en una tabla mysql. Ahora he intentado recuperarlo pero no me funciona.

Os pongo el código:

Código PHP:
<?
$categoria 
$_POST['categoria'];



if (
$categoria == TRUE){

$buscar $_GET['submit'];

$con=mysql_connect("servidor","usuario","clave");
mysql_select_db("bd"$con); 

$result mysql_query("SELECT * FROM TABLE3 WHERE Categoría like '$categoria'"$con); 

$total mysql_num_rows($result);


echo 
"Resultados para: $categoria";
echo 
"<table border=1 cellspacing=5 cellpadding=10 bordercolor='E49E56'>";
echo 
"<tr align='center' bgcolor='E7AE18'><td>Número</td><td>Categoría</td><td>Nombre</td></tr>";
 { 


?>
<tr bgcolor="#fdfdbf" align='center'><td><?=$row['Número'];?></td><td><?=$row['Categoría'];?></td><td><?=$row['Nombre'];?></td></tr>
<?
}
echo 
"</table>";
}



else
{
        
        echo 
'Incorrect.';
        
    }    
?>
El valor de categoría lo coge de un select en html. Al principio me daba error en el mysql_num_rows, pero ahora se muestra la tabla sin ningún resultado. Algún error en llamar a la bd pero no logro solucionarlo.

Gracias
  #2 (permalink)  
Antiguo 30/11/2014, 07:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Tabla vacía en resultados de BD

Dada la sintaxis que usas en la consulta a la base, es decir ateniéndonos al SQL puro, hay algo que tienes que tener en cuenta...
Código MySQL:
Ver original
  1. SELECT * FROM TABLE3
  2. WHERE Categoría LIKE '$categoria'

LIKE se usa en SQL para buscar patrones dentro de un texto cualquiera, pero la búsqueda de un patrón significa que lo que contiene la columna debe ser parecido o contener algo dado, pero para eso se deben usar caracteres de comodín:
Código MySQL:
Ver original
  1. SELECT * FROM TABLE3
  2. WHERE Categoría LIKE '%$categoria%'
Sin ellos esto:
Código SQL:
Ver original
  1. Categoría LIKE '$categoria'
es semánticamente idéntico a esto:
Código SQL:
Ver original
  1. Categoría = '$categoria'
lo que quiere decir que en tu consulta, el contenido a devolver debe ser estrictamente igual a lo que recibes por formulario.

¿Se entiende?
¿Lo has tomado en cuenta?

Prueba con los comodines y veamos si el error anda por allí.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 30/11/2014, 12:22
 
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 127
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: Tabla vacía en resultados de BD

Entiendo, aunque en este caso el select ya tiene la palabra exacta que está en la tabla. Igualmente he probado lo que me has dicho y sigue saliendo vacía.

No se, es que es raro... he probado incluso a especificarle lo que tiene que buscar en el WHERE (sin que la tenga que coger de la variable $categoria) y sigue en blanco.
  #4 (permalink)  
Antiguo 30/11/2014, 13:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Tabla vacía en resultados de BD

¿Y al menos has comprobado esto?:
Código PHP:
<?php
$con 
mysql_connect("servidor""usuario""clave") or die("Error al conectar a MySQL: " mysql_error());
mysql_select_db("bd"$con) or die("Error al seleccionar la base: " mysql_error());

// Aseguramos que la comparacion sea correcta, unificando los uppercase
$sql "SELECT * FROM TABLE3 WHERE UPPER(Categoría) like UPPER('$$categoria%')";

// Comprobamos lo que hay en la query
echo $sql;

$result mysql_query($sql$con) or die("Error al realizar la consulta: " mysql_error());

if (
$result) {
// verificamos lo que se obtuvo
    
if (mysql_num_rows($result) == 0) {
        echo 
"No se obtuvieron registros, o la tabla está vacía";
        exit;
    }
    
$total mysql_num_rows($result);
    echo 
"Resultados para: $categoria";
    echo 
"<table border=1 cellspacing=5 cellpadding=10 bordercolor='E49E56'>";
    echo 
"<tr align='center' bgcolor='E7AE18'><td>Número</td><td>Categoría</td><td>Nombre</td></tr>"; {
?>
        <tr bgcolor="#fdfdbf" align='center'><td><?= $row['Número']; ?></td><td><?= $row['Categoría']; ?></td><td><?= $row['Nombre']; ?></td></tr>
<?
    
}
    echo 
"</table>";
} else {
    echo 
'Incorrect.';
}
?>
Tengamos claras algunas cosas:
1) Una consulta sólo puede devolver cero registros si a) No hay datos que puedan cumplir las condiciones solicitadas en el WHERE, y b) la tabla está vacía (sin registros).
2) Que una tabla devuelva cero registros no dispara errores de sintaxis, por lo que la ausencia de datos devuelve los encabezados de las columnas, pero con datos nulos, lo que puede disparar errores de PHP.
3) Una condicion aparentemente correcta en el where puede no devolver datos si está mal expresada, o aplicada incorrectamente conforme los tipos de datos en MySQL. Que se vena iguales no necesariamente quiere decir que sean iguales, en determinados contextos.
Esto último se puede dar, por ejemplo, por la prsencia de espacios en blanco en la cadena de comparación:
Código MySQL:
Ver original
  1. mysql> select ('uno' = 'uno') sinEspacios, (' uno' = 'uno') conspacio;
  2. +-------------+-----------+
  3. | sinEspacios | conspacio |
  4. +-------------+-----------+
  5. |           1 |         0 |
  6. +-------------+-----------+
  7. 1 row in set (0.00 sec)
Como podrás ver, si hay un espacio precedente puede generarse algún tipo de error indetectable.

A lo que voy es que hay que verificar u asegurar que lo que entra por formulario sea correcto y elimina cualquier posibilidad de defectos formales. Eso sólo podremos comprarlo si nos muestras la query una vez armada y antes de ejecutarse.

Por otro lado, siempre debes validar lo que MySQL devuelve. No se puede suponer que está funcionando bien. Siempre existe un error probable por cosas formales.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 30/11/2014 a las 13:14
  #5 (permalink)  
Antiguo 30/11/2014, 13:50
 
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 127
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: Tabla vacía en resultados de BD

Gracias por la explicación. He probado como el código que me has dicho y me da error al realizar la consulta (error de sintaxis) en la línea del WHERE. Leyendo lo que has explicado he probado a cambiar Categoría y ponerla sin acento y entonces no me da error pero sigue saliendo vacía y me imprime la línea del select en la parte superior
  #6 (permalink)  
Antiguo 30/11/2014, 14:12
 
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 127
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: Tabla vacía en resultados de BD

He vuelto a recomponer el código con otro que tenía y ahora sí aparecen los resultados, lo único que cada fila está separada, no lo muestra como una única tabla. Algo en la parte del echo donde se forma la tabla falla. Como podría solucionarlo?

Código PHP:
<?
$categoria 
$_POST['categoria'];


mysql_connect("servidor","usuario","clave") ; 
   
mysql_select_db("db");

$result=mysql_query("SELECT * FROM TABLE3 WHERE (Categoria = '$categoria')");

while (
$row=mysql_fetch_array($result))
{

echo 
"Resultados para: $categoria";
echo 
"<table border=1 cellspacing=5 cellpadding=10 bordercolor='E49E56'>";
echo 
"<tr align='center' bgcolor='E7AE18'><td>Número</td><td>Categoría</td><td>Nombre</td></tr>"; {
?>
        <tr bgcolor="#fdfdbf" align='center'><td><?=$row['Número'];?></td><td><?=$row['Categoría'];?></td><td><?=$row['Nombre'];?></td></tr>
<?
    
}
    echo 
"</table>";
}
mysql_free_result($result);
?>
  #7 (permalink)  
Antiguo 30/11/2014, 16:47
Avatar de solmedina87  
Fecha de Ingreso: noviembre-2014
Mensajes: 68
Antigüedad: 9 años, 5 meses
Puntos: 4
Respuesta: Tabla vacía en resultados de BD

Creo que el problema debe ser que tenés la tabla adentro del While...
Fijate que la etiqueta <table> quede fuera del while, y que solo las filas, columnas (td, tr) queden dentro del While..
  #8 (permalink)  
Antiguo 01/12/2014, 09:43
 
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 127
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: Tabla vacía en resultados de BD

Vale lo he solucionado variando esto último que me habéis comentado.

Ahora el problema viene que quiero hacer que si el usuario selecciona la primera opción del select (la vacía, en blanco) muestre todos los resultados de la tabla.
Simplemente he puesto un if delante del código anterior: si la variable está vacía, muestra todos los resultados de la tabla, y si la variable no está vacía, muestra la variable que está seleccionada. Pero da error, he ido probando diferentes opciones y el error lo suele dar en el elseif (o cambiándolo por else también da error)


Código PHP:
<?
$categoria 
$_POST['categoria'];

if (
$categoria == ""){
mysql_connect("servidor","usuario","clave") ; 
   
mysql_select_db("db");

$result=mysql_query("SELECT * FROM TABLE3 WHERE Categoria like '%%'");

echo 
"Resultados para: $categoria";
echo 
"<table border=1 cellspacing=5 cellpadding=10 bordercolor='E49E56'>";
echo 
"<tr align='center' bgcolor='E7AE18'><td>Número</td><td>Categoría</td><td>Nombre</td></tr>"; {
while (
$row=mysql_fetch_array($result))
{
?>
        <tr bgcolor="#fdfdbf" align='center'><td><?=$row['Número'];?></td><td><?=$row['Categoría'];?></td><td><?=$row['Nombre'];?></td></tr>
<?
    
}
    echo 
"</table>";
}
mysql_free_result($result);

elseif (
$categoria != ""){
mysql_connect("servidor","usuario","clave") ; 
   
mysql_select_db("db");

$result=mysql_query("SELECT * FROM TABLE3 WHERE (Categoria = '$categoria')");

echo 
"Resultados para: $categoria";
echo 
"<table border=1 cellspacing=5 cellpadding=10 bordercolor='E49E56'>";
echo 
"<tr align='center' bgcolor='E7AE18'><td>Número</td><td>Categoría</td><td>Nombre</td></tr>"; {
while (
$row=mysql_fetch_array($result))
{
?>
        <tr bgcolor="#fdfdbf" align='center'><td><?=$row['Número'];?></td><td><?=$row['Categoría'];?></td><td><?=$row['Nombre'];?></td></tr>
<?
    
}
    echo 
"</table>";
}
mysql_free_result($result);

Etiquetas: bd, mysql, resultados, select, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:29.