Foros del Web » Programando para Internet » PHP »

Problema con una consulta a la BD

Estas en el tema de Problema con una consulta a la BD en el foro de PHP en Foros del Web. Hola, mi problema es que al tratar de ver la informacion que obtengo de la base de datos me genera este error: Warning: odbc_fetch_object(): supplied ...
  #1 (permalink)  
Antiguo 25/04/2006, 18:52
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Problema con una consulta a la BD

Hola, mi problema es que al tratar de ver la informacion que obtengo de la base de datos me genera este error:

Warning: odbc_fetch_object(): supplied argument is not a valid ODBC result resource in C:\Inetpub\wwwroot\phpysqlserver\bienvenida.php on line 44

Mi código es el siguiente:
Código PHP:
  <?
  $sql
="SELECT se.Falta fecha, us.Nombre nombre, pri.Prioridad pri, se.Observsistemas obvs, co.Soporte sop,
  se.Observsistemas2 obvs2
  FROM Usuarios us 
  INNER JOIN Servicios se ON (us.Id_usu=se.Id_usu) 
  INNER JOIN Colores co ON (se.Id_col=co.Id_col) 
  INNER JOIN Prioridad pri ON (se.Id_prio=pri.Id_prioridad) 
  WHERE us.Id_usu='"
.$_SESSION['usuario_password']."'";
  
  
$separa explode("_"$_SERVER['PHP_SELF']);
  
$redir $separa[0]."_error";
  
$usuario_consulta odbc_exec($conn,$sql)or die(header ("Location:  $redir?error_login=1"));
  
   if (
odbc_num_rows($usuario_consulta) != 0) {
        
$usuario_datos odbc_fetch_array($usuario_consulta);
        
odbc_free_result($usuario_consulta);
        
odbc_close($conn);    
    
  
?>
    <td><div align="center">Fecha y Hora</div></td>
    <td><div align="center">Usuario</div></td>
    <td><div align="center">Prioridad </div></td>
    <td><div align="center">Descripci&oacute;n del Servicio</div></td>
    <td><div align="center">Estatus</div></td>
    <td><div align="center">Solución</div></td>
  </tr>
  <? while($row odbc_fetch_object($usuario_datos)){ ?>//ES AQUI DONDE ME MARCA EL ERROR.
  <tr>
    <td><? echo $row['fecha']; ?></td>
    <td><? echo "<a href='calificar.php'>".$row['nombre']."</a>"?></td>
    <td><? echo $row['pri']; ?></td>
    <td><? echo $row['obvs']; ?></td>
    <td><? echo $row['sop']; ?></td>
    <td><? echo $row['obvs2']; ?></td>
  </tr>
  <? } } ?>

Salu2
  #2 (permalink)  
Antiguo 25/04/2006, 20:09
Avatar de jmn2k1  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires...
Mensajes: 489
Antigüedad: 16 años, 1 mes
Puntos: 2
La funcion espera un resultado de la base, deberias pasar como parametro $usuario_consulta, no $usuario_datos..

saludos
__________________
JmN
  #3 (permalink)  
Antiguo 25/04/2006, 20:47
Avatar de bistoco  
Fecha de Ingreso: marzo-2006
Mensajes: 141
Antigüedad: 11 años, 9 meses
Puntos: 0
la consulta esta mal estructurada, el mensaje de error indica ke el "resulset" no es valido por ke la consulta no deduvelve nada, ke es diferente a ke reciba un resulset sin registros

saludos
__________________
Share what you know...learn what you don't :si:
  #4 (permalink)  
Antiguo 25/04/2006, 22:58
Avatar de edi87  
Fecha de Ingreso: mayo-2004
Ubicación: Argentina
Mensajes: 113
Antigüedad: 13 años, 7 meses
Puntos: 0
probando...

Proba dejando siempre un espacio al final de cada renglon de la consulta, cuando la escribis en varias lineas, a veces la une y quedan dos renglones pegados y devuelve error.

select *
from tabla
where cosa=1

saludos
__________________
IntoXicadoS -- Rock Argentina
"Cuando estes triste ponete a pensar, la solucion en vos esta..."

edi!
  #5 (permalink)  
Antiguo 26/04/2006, 10:02
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
También...

Cita:
Iniciado por jmn2k1
La funcion espera un resultado de la base, deberias pasar como parametro $usuario_consulta, no $usuario_datos..

saludos
Hola, también yo habia pensado esto pero al probar me genera el mismo error:
Warning: odbc_fetch_object(): 5 is not a valid ODBC result resource in C:\Inetpub\wwwroot\phpysqlserver\bienvenida.php on line 42

Y es que $usuario_datos contiene lo mismo que $usuario_consulta.

Salu2
  #6 (permalink)  
Antiguo 26/04/2006, 10:24
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
mmm...

Cita:
Iniciado por bistoco
la consulta esta mal estructurada, el mensaje de error indica ke el "resulset" no es valido por ke la consulta no deduvelve nada, ke es diferente a ke reciba un resulset sin registros

saludos
La consulta si esta bien porque sin utilizar while($row = odbc_fetch_object($usuario_datos)){ si me imprime datos correctos aunque claro nomas el primer registro. El problema se da a la hora querer imprimir varios recorriendo el vector $usuario_datos

Código PHP:
  <? while($row odbc_fetch_object($usuario_datos)){ ?>
  <tr>
    <td><? echo $row['fecha']; ?></td>
    <td><? echo "<a href='calificar.php'>".$row['nombre']."</a>"?></td>
    <td><? echo $row['pri']; ?></td>
    <td><? echo $row['obvs']; ?></td>
    <td><? echo $row['sop']; ?></td>
    <td><? echo $row['obvs2']; ?></td>
  </tr>
  <? } } ?>
Salu2
  #7 (permalink)  
Antiguo 26/04/2006, 10:37
Avatar de jmn2k1  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires...
Mensajes: 489
Antigüedad: 16 años, 1 mes
Puntos: 2
Si cambiaste $usuario_datos por $usuario_consulta y no sacaste el $odbc_free_result te va a dar ese error...

y no, no contiene lo mismo, al pasarlo por odbc_fetch_array lo transformas en un array, antes era un objeto con los resultados... que es lo que espera fetch_object

Ademas, fetch_object se usa para acceder a los datos como un objeto, de la forma $row->columna para acceder como array asociativo tenes que usar fetch_array.

Saludos!
__________________
JmN
  #8 (permalink)  
Antiguo 26/04/2006, 11:17
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Si...

Cita:
Iniciado por jmn2k1
Si cambiaste $usuario_datos por $usuario_consulta y no sacaste el $odbc_free_result te va a dar ese error...

Ademas, fetch_object se usa para acceder a los datos como un objeto, de la forma $row->columna para acceder como array asociativo tenes que usar fetch_array.
Si quite la linea en la que liberaba la consulta $odbc_free_result.

Voy a intentar esa forma que me dices que se utiliza para recorrer un objeto. Yo aviso que pasó.

Salu2
  #9 (permalink)  
Antiguo 26/04/2006, 13:32
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Ya...casi...

Cita:
Iniciado por jmn2k1
Ademas, fetch_object se usa para acceder a los datos como un objeto, de la forma $row->columna para acceder como array asociativo tenes que usar fetch_array.
Saludos!
Tienes mucha razón. La solución es esta:
Código PHP:
  <?
  $sql
="SELECT se.Falta fecha, us.Nombre nombre, pri.Prioridad pri, se.Observsistemas obvs, co.Soporte sop, se.Observsistemas2 obvs2 FROM Usuarios us 
  INNER JOIN Servicios se ON (us.Id_usu=se.Id_usu) 
  INNER JOIN Colores co ON (se.Id_col=co.Id_col) 
  INNER JOIN Prioridad pri ON (se.Id_prio=pri.Id_prioridad)"
;
  
  
$separa explode("_"$_SERVER['PHP_SELF']);
  
$redir $separa[0]."_error";
  
$usuario_consulta odbc_exec($conn,$sql)or die(header ("Location:  $redir?error_login=1"));
  
   if (
odbc_num_rows($usuario_consulta) != 0) {    
  
?>
    <td><div align="center">Fecha y Hora</div></td>
    <td><div align="center">Usuario</div></td>
    <td><div align="center">Prioridad </div></td>
    <td><div align="center">Descripci&oacute;n del Servicio</div></td>
    <td><div align="center">Estatus</div></td>
    <td><div align="center">Solución</div></td>
  </tr>
  <? while($usuario_datos odbc_fetch_array($usuario_consulta)){ ?>//SOLUCION
  <tr>
    <td><? echo $usuario_datos['fecha']; ?></td>
    <td><? echo "<a href='calificar.php'>".$usuario_datos['nombre']."</a>"?></td>
    <td><? echo $usuario_datos['pri']; ?></td>
    <td><? echo $usuario_datos['obvs']; ?></td>
    <td><? echo $usuario_datos['sop']; ?></td>
    <td><? echo $usuario_datos['obvs2']; ?></td>
  </tr>
  <? }
          
odbc_free_result($usuario_consulta);
    
odbc_close($conn);
   }
  
?>
El único problema que ahora tengo es que en mi base de datos tengo 3 registros y solo puedo ver los primeros 2.

Salu2
  #10 (permalink)  
Antiguo 26/04/2006, 15:23
Avatar de jmn2k1  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires...
Mensajes: 489
Antigüedad: 16 años, 1 mes
Puntos: 2
Si las funciones odbc_ se comportan como las mysql_ deberia mostrarte los tres, a menos que hallas accedido al resulset antes (pero eso no lo veo en el codigo...) probaria hacer un var_dump o un print_r a $usuario_consulta para ver si tienen todo lo que esperas que tengan... (aunque no se si esas funciones funcionan con objetos..).

Saludos.
__________________
JmN
  #11 (permalink)  
Antiguo 26/04/2006, 16:35
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Solucionado!

Ahora si, solucionado.

El problema estaba en que el tercer registro tenia un campo con NULL y por esa razón la consulta nomas me regresaba los 2 primeros registros. Se solucionó utilizando LEFT JOIN en lugar de INNER JOIN. Quedó así:

$sql="SELECT se.Falta fecha, us.Nombre nombre, pri.Prioridad pri, se.Observsistemas obvs, co.Soporte sop, se.Observsistemas2 obvs2 FROM Usuarios us
LEFT JOIN Servicios se ON (us.Id_usu=se.Id_usu) AND (us.borrado=0)
LEFT JOIN Colores co ON (se.Id_col=co.Id_col)
LEFT JOIN Prioridad pri ON (se.Id_prio=pri.Id_prioridad)";


Gracias!!
  #12 (permalink)  
Antiguo 26/04/2006, 16:54
Avatar de jmn2k1  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires...
Mensajes: 489
Antigüedad: 16 años, 1 mes
Puntos: 2
Un consejo util seria siempre armar las consultas en un front end de mysql, y una vez que esta lista llevarla a la aplicacion...

Saludos.
__________________
JmN
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 14:00.