Foros del Web » Programando para Internet » PHP »

Ayuda con este código por favor

Estas en el tema de Ayuda con este código por favor en el foro de PHP en Foros del Web. Buenas, Recurro al foro porque estoy desesperado con un libro de visitas que me bajé y no consigo que funcione la paginación. Cuando lo ejecuto ...
  #1 (permalink)  
Antiguo 30/12/2004, 12:17
 
Fecha de Ingreso: diciembre-2004
Mensajes: 4
Antigüedad: 13 años
Puntos: 0
Ayuda con este código por favor

Buenas,

Recurro al foro porque estoy desesperado con un libro de visitas que me bajé y no consigo que funcione la paginación. Cuando lo ejecuto se muestran los últimos resultados, pero al pulsar sobre el link de "ver mas" da errores. Soy novato en esto y me estoy volviendo loco. ¿Podríais ayudarme?

Los errores son:

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource

y

Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource

Las líneas a las que hacen referencia los errores son respectivamente:

While (($damefila=mysql_fetch_object($resultid)) && ($num_filas<5))

y

mysql_free_result($resultid);

No tengo mucha idea de PHP, pero he jugado mucho con este código y en la línea :

$ssql .= " where id_librovisitas_php<=" . $vermas;

Si sustituyo la variable $vermas por un número veo los siguientes mensajes. No sé si estará el problema en esa párte del código o en el link.

A continuación os muestro el código original al completo por si podéis ver algún error:

<?
//conecto con la base de datos
$conn = mysql_connect("localhost","usuario","contraseña");
mysql_select_db("librovisitas",$conn);


if (!$HTTP_POST_VARS)
{
//si no recibo nada por el formulario de firma del libro, muestro las firmas del libro
//construyo la sentencia SQL
$ssql = "SELECT * FROM librovisitas_php";

//se mostrarán las últimas fimas, aunque habrá un enlace en la parte de abajo que se podrá pulsar para ver más firmas
if (isset($_GET["vermas"]))
$ssql .= " where id_librovisitas_php<=" . $vermas;

//ordeno la sentencia y limito el numero de resultados
$ssql .= " ORDER BY id_librovisitas_php desc limit 6";

//tomo el juego de resultados
$resultid = mysql_query($ssql,$conn);
?>

Aqu&iacute; puedes leer los mensajes de los visitantes y tambi&eacute;n puedes dejar el tuyo utilizando el formulario de abajo.
<br>
<br>
<span class=fuente8><b>Muchas gracias por tu participaci&oacute;n</b></span>
<br>
<br>
<?
//muestro los datos en un bucle
$num_filas = 0;
while (($damefila=mysql_fetch_object($resultid)) && ($num_filas<5))
{
?>
<table align="center" width="100%" cellspacing="2" cellpadding="0" border="0">
<tr>
<td valign="top" class=fuente8><b>
<? //si el visitante no introdujo nombre muestro como nombre "Anónimo"
if ($damefila->nombre == "-"){
echo "Anónimo";
}elseif ($damefila->email != "-") {
echo '<a href="mailto:' . $damefila->email . '">' . $damefila->nombre . '</a>';
}else{
echo $damefila->nombre;
}
?></b>:<br>
</td></tr>
<tr><td bgcolor=cccccc colspan="2"><img src="images/pixeltrans.gif" width=1 height=1 border="0"></td></tr>
<td class=fuente8 valign="top">
<?echo strip_tags($damefila->comentario)?>
<td valign="top" align="right" nowrap class=fuente8>
Valoracion: <?echo $damefila->valoracion?>
</td>
</tr>
</table>

<br>
<?
$num_filas++;
} //termina el bucle while

//si quedan más valoraciones en el conjunto de resultados, muestro el enlace de "Ver más"
if ($damefila)
echo "<div align=center><b><a href=\"index.php?vermas=$damefila->id_librovisitas_php\">Ver m&aacute;s mensajes</a></b></div><br>";

//libero el conjunto de resultados
mysql_free_result($resultid);

//incluyo el formulario para firmar
include ("formul_mensaje.html");
}
else
{
//estoy recibiendo datos del fomulario de firmas
//Formateamos un poco el formulario, por si acaso los datos son incorrectos

//eliminamos las etiquetas HTML y PHP de las cadenas de texto
$nombre = strip_tags($_POST["nombre"]);
$email = strip_tags($_POST["email"]);
$comentario = strip_tags($_POST["comentario"]);

//Cortamos las cadenas demasiado largas
$nombre=substr($nombre,0,150);
$email=substr($email,0,80);

//Comprobamos que el visitante se ha molestado en rellenar algo
if (strlen($nombre)==0 and strlen($email)==0 and strlen($comentario)==0)
{
?>
<div align="center"><b>Gracias por el envío</b>.<br><br>Te agradecer&iacute;amos, no obstante y si no resulta mucho esfuerzo, que rellenases alguno de los campos para dejar constancia de tu visita.</div>
<?
}else{
//si alguno de los campos falta prefiero colocar un guión o "sin comentarios"
if (!$nombre)$nombre="-";
if (!$email) $email="-";
if (!$comentario) $comentario="Sin comentarios";

//Generamos la ssql e insertamos el registro
$ssql = "INSERT INTO librovisitas_php (nombre,email,valoracion,comentario) VALUES ('" . $nombre . "','" . $email . "'," . $_POST["valoracion"] . ",'" . $comentario . "')";
//echo $ssql . "<p>";
mysql_query($ssql);
?>
<div align="center"><b>Muchas gracias por tu participaci&oacute;n</b></div>
<?
}
?>
<br>
<br>
<div align="center"><b><a href=".">Volver al libro de visitas</a></b></div>
<?
}

mysql_close($conn);
?>


Os agradecería muchísimo que me ayudáseis.

Gracias de antemano.
Un saludo

Última edición por BarBar0; 30/12/2004 a las 12:19
  #2 (permalink)  
Antiguo 30/12/2004, 12:31
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Hola,

En este mensaje doy una explicacion: http://www.forosdelweb.com/f18/foro-php-sql-257918/

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 30/12/2004, 12:39
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Esto de aquí:
while (($damefila=mysql_fetch_object($resultid)) && ($num_filas<5))

no deberías hacerlo así .. sino limitando vía SQL los registros que quieres mostar.

De hecho ya lo haces en:
//ordeno la sentencia y limito el numero de resultados
$ssql .= " ORDER BY id_librovisitas_php desc limit 6";

Por otro lado:

Código PHP:
if (isset($_GET["vermas"])){
$ssql .= " where id_librovisitas_php='".$vermas."'";
} else {
//ordeno la sentencia y limito el numero de resultados
$ssql .= " ORDER BY id_librovisitas_php desc limit 6";

si tu le pasas un "ID" de un registro (que es único) a una consulta condicional (bajo el WHRE) .. .lo que pretendes es ver ese único registro .. así que <= no correspondería .. no tiene sendido para ese caso .. lo mismo que ordenar o limitar los resultado (he de ahí el else) .. sólo vas a obtener un resultado (registro) o bien ningúno (caso de que ese ID no exista).

Tu opción "damemas" supongo que pretenderás ver desplegado otros registros que no muestras en tu resumen y listado inicial ..?

Si es así .. debes hacer otra consulta SQL bajo el if (isset($_GET["vermas"])) donde hagas la consulta SQL que ya compones ahí mismo .. la ejecutes y presentes sus registros de la forma que tengas que hacerlo ..

Sobre los problemas que tienes .. cuando haces una consulta SQL ... lo ideal es contar los resultados que has obtenido antes de "atacar" tu mysql_fetch_xxx() .. así no tendrás problemas y podrás mostrar un mensaje tipo "no hay mensajes en el libro de visitas" .. o "mensaje no existe"...

Código PHP:
// etc ...

// cuentas los registros que arrojó tu consulta ejecutada.
if (mysql_num_rows($resultid)>0){

// si hay resultados .. entonces los recorres ...
while ($damefila=mysql_fetch_object($resultid)) {

// etc ...

//cierras el if 
(realmente está muyyyy lioso el código .. organizalo mejor, te recomiendo usar estructuras condicionales switch() se vería más claro y organizado tu código además que más rápido para ampliar "funcionalidades" a tu aplicacion.)

Un saludo,

Última edición por Cluster; 30/12/2004 a las 12:43
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 11:18.