Me vais a perdonar que resucite este tema, pero es que la solución que se plantea aquí me viene de perlas, pero estoy intentando hacer algunos cambios, y no me deja. Quiero poner en la portada de mi web dos listas: una con los últimos temas publicados, y otra con los últimos mensajes. Con la segunda no hay problema, incluso la he modificado para que quede así:
Además, al pasar el ratón por encima del título del tema, se podrán leer los primeros 150 caracteres del mensaje, metiéndolo en TITLE="" (nota: hay un pequeño problema cuando en esos primeros 150 caracteres hay algo de BBcode, pero eso ya intentaré solucionarlo más adelante, de momento no me preocupa tanto; también me gustaría poner la fecha y la hora, pero ya habrá tiempo de hacer mejoras).
Con esta tabla no tengo problemas, el problema es con la siguiente. Quiero que tenga más o menos los mismos elementos, pero con la diferencia que no mostrará los últimos mensajes, sino los últimos temas:
Y tengo un código que me saca exactamente eso... excepto el principio del texto del primer mensaje de cada tema. Os pongo el código al completo, y os voy comentando línea a línea, a ver si alguien me puede explicar qué error estoy cometiendo:
Código PHP:
<?
// Últimos temas publicados en foros phpBB2.
// Creado por XeRGiO y modificado por Defero.tk para que muestre los temas
// <a href="visitar.php?http://www.xergio.net" target="_blank">www.xergio.net</a>
//
// Edita lo que viene a continuación. Cambia solo lo que hay entre comillas "":
$directorio = "./forum"; //Carpeta donde esta situadoel foro.
$mostrar = "6"; //Número de mensajes a mostrar.
// $caracteres = "150"; //Caracteres que se mostrarán de cada línea.
// Lo que viene ahora no lo toques para nada!!! a no ser que sepas de qué va el tema...
include("$directorio/config.php");
$conexion = mysql_connect($dbhost,$dbuser,$dbpasswd);
mysql_select_db($dbname,$conexion);
$consulta = "select * from ".$table_prefix. "topics WHERE (forum_id!='9' AND forum_id!='8') order by topic_id desc" ;
$resultado = mysql_query($consulta);
$i = 0;
while ($rows = mysql_fetch_array($resultado)) {
if ($i <= $mostrar) {
$consulta1 = "select * from ".$table_prefix."forums where forum_id='$rows[forum_id]'";
$resultado1 = mysql_query($consulta1);
$datosf = mysql_fetch_array($resultado1);
$consulta2 = "select * from ".$table_prefix."users where user_id='$rows[topic_poster]'";
$resultado2 = mysql_query($consulta2);
$datosu = mysql_fetch_array($resultado2);
// Esto es mío, para sacar los datos del mensaje
$consulta4 = "select * from ".$table_prefix."posts where post_id='$rows[first_post_id]'";
$resultado4 = mysql_query($consulta4);
$datosx = mysql_fetch_array($resultado4);
// Esto es mío, para sacar el texto del mensaje
$consulta5 = "select * from ".$table_prefix."posts_text where post_id='$rows[post_id]'";
$resultado5 = mysql_query($consulta5);
$datosy = mysql_fetch_array($resultado5);
// if (strlen($datost[topic_title]) > $caracteres) {
// $datost[topic_title] = substr($datost[topic_title],0,20)."...";
// }
// Esto es mío
{
$datosy[post_text] = substr($datosy[post_text],0,150)."...";
}
echo "<li><a href=\"./forum/profile.php?mode=viewprofile&u=$datosu[topic_poster]\">$datosu[username]</a> ha publicado el tema \"<a href=\"$directorio/viewtopic.php?t=$rows[topic_id]\" title=\"$datosy[post_text]\">$rows[topic_title]</a>\" en el subforo <a href=\"./forum/viewforum.php?f=$datosf[forum_id]\">$datosf[forum_name]</a></li>";
$i++;
}
}
mysql_free_result($resultado);
mysql_close($conexion);
?>
Bien, vamos allá:
Código PHP:
$directorio = "./forum";
$mostrar = "6";
Establece la ruta del directorio del foro y el número de temas a mostrar. Sin problemas.
Código PHP:
include("$directorio/config.php");
$conexion = mysql_connect($dbhost,$dbuser,$dbpasswd);
mysql_select_db($dbname,$conexion);
Se "incluye" el archivo de configuración del foro, y se realiza conexión con la base de datos. Sin problemas.
Código PHP:
$consulta = "select * from ".$table_prefix. "topics WHERE (forum_id!='9' AND forum_id!='8') order by topic_id desc" ;
$resultado = mysql_query($consulta);
$i = 0;
Consulta en la tabla TOPICS todos los temas que no tengan FORUM_ID 8 o 9 (subforos ocultos), y los ordena de manera descendente según el TOPIC_ID, es decir, de más reciente a más antiguo. Aquí es donde he realizado el primer cambio, ya que en vez de consultar en la tabla POSTS lo hago en la tabla TOPICS, para tener los últimos temas en vez de los últimos mensajes. Sin problemas.
Código PHP:
while ($rows = mysql_fetch_array($resultado)) {
if ($i <= $mostrar) {
$consulta1 = "select * from ".$table_prefix."forums where forum_id='$rows[forum_id]'";
$resultado1 = mysql_query($consulta1);
$datosf = mysql_fetch_array($resultado1);
Esto no lo entiendo del todo, pero sé que ha reducido la lista a seis elementos, y después está consultando en la tabla FORUMS los datos correspondientes a los subforos a los que corresponden los temas extraídos de la tabla TOPICS, usando para ello como referencia su FORUM_ID. Sin problemas.
Código PHP:
$consulta2 = "select * from ".$table_prefix."users where user_id='$rows[topic_poster]'";
$resultado2 = mysql_query($consulta2);
$datosu = mysql_fetch_array($resultado2);
Aquí comprueba en la tabla USERS los datos del usuario que ha publicado el tema, comparando su USER_ID con el TOPIC_POSTER que aparece en la tabla TOPICS. Sin problemas
He borrado la $consulta3 porque si no me equivoco, no necesito extraer los datos de la tabla TOPICS, ya que es la tabla con la que he empezado. El código original metía esa consulta porque empieza por la tabla POSTS.
Código PHP:
$consulta4 = "select * from ".$table_prefix."posts where post_id='$rows[first_post_id]'";
$resultado4 = mysql_query($consulta4);
$datosx = mysql_fetch_array($resultado4);
Esto no viene en el código original. Como no he hecho todavía referencia a la tabla POSTS, necesito hacerlo ahora. Necesito extraer la información de los POSTS en los que su POST_ID sea igual al FIRST_POST_ID de la tabla TOPICS. Creo que lo he hecho bien, pero no sabría asegurarlo.
Código PHP:
$consulta5 = "select * from ".$table_prefix."posts_text where post_id='$rows[post_id]'";
$resultado5 = mysql_query($consulta5);
$datosy = mysql_fetch_array($resultado5);
Creo que el error está aquí. Si no me equivoco, tengo que extraer de la tabla POSTS_TEXT las entradas cuyo POST_ID sea igual al POST_ID que hemos obtenido en la anterior consulta.
Supongo que de haber un error, estaría en lo de post_id='$rows[post_id]. He probado a sustituir ROWS por DATOSX, y también por RESULTADO4, pero no funciona. Mi lógica rudimentaria me dice que la forma correcta sería usar DATOSX, pero como digo, no funciona.
Código PHP:
{
$datosy[post_text] = substr($datosy[post_text],0,150)."...";
}
Con esto controlo que el tamaño del texto no sea superior a 150 caracteres. Funciona sin problemas.
Código PHP:
echo "<li><a href=\"./forum/profile.php?mode=viewprofile&u=$datosu[topic_poster]\">$datosu[username]</a> ha publicado el tema \"<a href=\"$directorio/viewtopic.php?t=$rows[topic_id]\" title=\"$datosy[post_text]\">$rows[topic_title]</a>\" en el subforo <a href=\"./forum/viewforum.php?f=$datosf[forum_id]\">$datosf[forum_name]</a></li>";
$i++;
Esto utiliza los datos que ha extraído antes para montar el documento HTML, que funciona a la perfección excepto por lo que hay dentro de TITLE, es decir, lo de $datosy[post_text]
Código PHP:
mysql_free_result($resultado);
mysql_close($conexion);
?>
Terminamos y cerramos
A ver si alguien me puede ayudar, que estoy muy perdido. Me ha costado mucho entender la parte que he llegado a entender y meter algunos cambios, pero a partir de aquí me siento totalmente incapaz de continuar yo solo.