Uso php-nuke, y en mi portada tengo un bloque con las últimas respuestas en los temas del foro. La cosa está en que pensé en hacerme una opción de actualizar los últimos posts pero sin tener que recargar la página entera (porque la portada es un poco pesada), cosa que se puede hacer con AJAX solamente, según tengo entendido.
Así, me hice dos archivos:
block-Foros.php:
Código PHP:
<?php
if ( !defined('BLOCK_FILE') ) {
Header("Location: ../index.php");
die();
}
global $prefix, $user_prefix, $db;
// Función AJAX para actualizar los últimos posts
$content .= "
<script language=\"javascript\" type=\"text/javascript\">
function getPage(Last_New_Topics){
var xmlhttp=false; //Clear our fetching variable
try {
xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e) {
try {
xmlhttp = new
ActiveXObject('Microsoft.XMLHTTP');
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
var file = 'blocks/text.php?Last_New_Topics=' + Last_New_Topics;
xmlhttp.open('GET', file, true);
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4) {
var content = xmlhttp.responseText;
if( content ){
document.getElementById('content').innerHTML = content;
}
}
}
xmlhttp.send(null)
return;
}
</script>";
// n = numero de posts visualizados
$n = $_GET['n'];
$i=false; // para cambiar el color de cada celda
$Last_New_Topics = 25;
$mensaje = "";
if(is_numeric($n) ){
if($n>100){
$Last_New_Topics = 100;
$mensaje .= "Sólo te podemos mostrar los últimos 100 mensajes<br />";
}elseif($n>0){
$Last_New_Topics=$n;
}
}elseif(!is_numeric($n) && $n!=""){
$mensaje .= "¡No has introducido un número!<br />";
}
// contenido variable
$content.= "
<center><font class=\"revista\">$mensaje Mostrando los últimos $Last_New_Topics mensajes</font></center>
<div id=\"content\">
<script language=\"javascript\" type=\"text/javascript\">getPage('$Last_New_Topics')</script>
</div>
";
// contenido estático
$content .= "
<form method=\"get\" id=\"searchform\" action=\"enlace\">
<center>
<font class=\"revista\">Mostrar los últimos
<input name=\"n\" type=\"text\" style=\"background-color:#000000; border-color:#660000; border-width:1\" id=\"n\" value=\"\" size=\"3\" maxlength=\"3\">mensajes</font>
</center>
</form>
<center>
<b>
<a href=\"modules.php?name=Forums\">[Acceder a los foros]</a> |
<a href=\"modules.php?name=Forums&file=viewonline\">[Quién está en los foros]</a> |
<a href=\"modules.php?name=Forums&file=search\">[Buscar]</a> |
<a href=\"javascript:getPage('$Last_New_Topics')\">[Actualizar]</a>
</b>
</center>
";
?>
Código PHP:
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("lq");
$Last_New_Topics = $_GET["Last_New_Topics"];
$Topic_Buffer = "";
$result = mysql_query("SELECT t.topic_id, t.topic_first_post_id, t.forum_id, t.topic_last_post_id,
t.topic_title, t.topic_poster, t.topic_views, t.topic_replies, t.topic_moved_id, p.poster_id,
p.post_time, u.username, l.username, u.user_id, tx.post_text, p.post_username, f.post_username
FROM nuke_bbtopics AS t
LEFT JOIN nuke_bbposts AS p ON (p.post_id = t.topic_last_post_id)
LEFT JOIN nuke_bbposts AS f ON (f.post_id = t.topic_first_post_id)
LEFT JOIN nuke_bbposts_text AS tx ON (p.post_id = tx.post_id)
LEFT JOIN nuke_users AS u ON (u.user_id=p.poster_id)
LEFT JOIN nuke_users AS l ON (l.user_id=t.topic_poster)
WHERE t.topic_moved_id=0
ORDER BY t.topic_last_post_id DESC LIMIT 0, $Last_New_Topics
");
while( list( $topic_id, $postf_id, $forum_id, $topic_last_post_id, $topic_title, $topic_poster, $topic_views, $topic_replies, $topic_moved_id, $poster_id, $post_time, $post1, $post2, $user_id, $post_text, $guest_name, $guest_name2) = $row = mysql_fetch_row($result))
{
$post_text = preg_replace("!(\[(.*?)\])!ise","", $post_text);
$post_text = substr($post_text,0,200);
if ($user_id!=1){
$LastPoster = "$post1";
}else{
$LastPoster = "Anónimo";
}
if ($topic_poster!=1){
$OrigPoster = "$post2";
}else{
$OrigPoster = "Anónimo";
}
$titulo = "".htmlspecialchars($post_text)."";
$TopicTitleShow = "<a class=\"block2\" href=\"modules.php?name=Forums&file=viewtopic&p=$topic_last_post_id#$topic_last_post_id\" style=\"text-decoration: none\" title=\"$titulo\">$topic_title</a>";
$i=!$i;
if($i==true){
$colorcelda = "#000000";
}else{$colorcelda = "#110000";}
$Topic_Buffer .= "
<tr bgcolor=\"$colorcelda\" onmouseover=\"this.style.background='#440000'\" onmouseout=\"this.style.background='$colorcelda'\">
<td> $TopicTitleShow</td>
<td><center><font class=\"block\">$topic_views</font></center></td>
<td><center><font class=\"block\">$topic_replies</font></center></td>
<td><center><font class=block>$OrigPoster</font></center></td>
<td><center><font class=\"block\">$LastPoster</font></center></td>
</tr>";
}
$contenido = "
<table width=\"100%\" style=\"background-color: #660000; border: 1px solid #FF0000;\" cellspacing=\"1\" cellpadding=\"1\">
<tr bgcolor=\"#330000\">
<td align=\"center\" height=\"18\"><font color=\"#FFFFFF\"><b>Tema</b></font></td>
<td align=\"center\" ><font color=\"#FFFFFF\"><b>Visual.</b></font></td>
<td align=\"center\"><font color=\"#FFFFFF\"><b>Resp.</b></font></td>
<td align=\"center\"><font color=\"#FFFFFF\"><b>Autor</b></font></td>
<td align=\"center\" width=\"20%\"><font color=\"#FFFFFF\"><b>Autor (última respuesta)</b></font></td>
</tr>
$Topic_Buffer
</table><br/>";
$fecha = date('H:i:s', time() );
echo "$contenido <center><small>[Actualizado a las $fecha]</small></center><br />";
?>
El problema lo tengo en la conexión a la BD MySQL que tengo que hacer en el 2º archivo, algún hacker no creo que tenga problemas para ver esa conexión.
Las conexiones en el nuke se hacen a través de la variable $db, pero al intentar pasarla al 2º archivo por el método GET, el script no se ejecuta. En cambio, si trato de pasarle otras variables globales, no tengo ningún problema.
Vosotros sabéis cómo debo hacerlo???
Joe, llevo ya varios días así y nada. Estoy cada vez peor.