Página 1 de 2

consulta mysql

Publicado: 16 Dic 2012, 10:51
por rafaxplayer
Hola amigos ,primero decir que esta pregunta es sobre mysql y no se si este es el sitio adecuado pero ni he visto ninguno mas acorde, si no es así lo siento.

Me gustaría saber según el sistema de base de datos del foro ... como seria la consulta para saber los últimos post publicados desde ultima visita de un usuario que todavía el no haya leído.

Estoy utilizando esta pero solo me da los post nuevos desde su ultima visita:

Código: Seleccionar todo

mysql_select_db($dbname,mysql_connect($dbhost,$dbuser,$dbpasswd));
$userdata = mysql_fetch_array(mysql_query("SELECT user_lastvisit FROM phpbb_users WHERE username_clean='".mysql_real_escape_string(strtolower($_GET['id']))."' LIMIT 1"));

$FI=0;
if ($userdata!=false) {
	$query = mysql_query("select * from phpbb_posts where post_time > '".$userdata[0]."' ORDER BY post_time DESC LIMIT 50");
	while ($data=mysql_fetch_array($query)) {	
		
		$FI++;
	}
	
} 
echo $FI;
Datos:
URL: http://amsspecialist.com
Versión phpBB: phpBB3 (3.0.11-PL1)
MODs Instalados:
- SyntaxHighlighter 1.0.12
- Very Simple Guest Hide BBCode MOD 1.0.1
Plantilla(s) usada(s): iridium
Servidor: Gratuito
Actualización desde otra versión: No
Conversión desde otro sistema de foros: No

Re: consulta mysql

Publicado: 17 Dic 2012, 14:19
por Rainwod

Por favor mover tema a foro oportuno.


Re: consulta mysql

Publicado: 17 Dic 2012, 18:10
por ThE KuKa
 ! 
Mensaje del Equipo por: ThE KuKa
Tema Movido.
Creo que puedes descargar este MOD y comparar código para ver que código usa el autor para que aparezcan los últimos mensajes. :wink:
http://www.phpbb-es.com/foro/descarga-m ... 27713.html

Re: consulta mysql

Publicado: 17 Dic 2012, 20:01
por rafaxplayer
ThE KuKa escribió: Creo que puedes descargar este MOD y comparar código para ver que código usa el autor para que aparezcan los últimos mensajes.
mmm le echado un vistazo pero no me acabo de aclarar con tanto código, ademas parece que este da últimos topics en general y lo mio es mas especifico "mensaje sin leer desde ultima visita de un usuario" , como veis mi consulta usa como base el username_clean en la busqueda , todo bien pero solo me faltaría completar eso ...que aparte de los mensajes desde ultima visita (que ya lo hace) fueran los NO vistos por el usuario, si conoceis algun script que lo haga seria de mucha ayuda. gracias

Re: consulta mysql

Publicado: 01 Ene 2013, 08:34
por rafaxplayer
Bien ya lo tengo seria usar la funcion get_unreadPost de phpbb , solo que necesito esa funcion pero sin usar sessiones , solo a partir de una id de un usuario , ya he probado a traducirla a mysql sin sessiones pero no acabo de entender el codigo php y me he vuelto loco...XD

El codigo que tengo hasta ahora es esto :

Código: Seleccionar todo

include("config.php");
mysql_select_db($dbname,mysql_connect($dbhost,$dbuser,$dbpasswd));
$userdata = mysql_fetch_array(mysql_query("SELECT * FROM phpbb_users WHERE username_clean='".mysql_real_escape_string(strtolower($_GET['id']))."' LIMIT 1"));

if ($userdata!=false) {
    $fi=0;
	$query = mysql_query("select * from phpbb_topics where topic_last_post_time > '".$userdata['user_lastvisit']."' AND topic_last_post_time > '".$userdata['user_lastmark']."' ORDER BY topic_last_post_time DESC LIMIT 10");
	while ($data=mysql_fetch_array($query)) {	
		
		$query2=mysql_query("SELECT * FROM phpbb_posts WHERE topic_id='".$data["topic_id"]."' AND post_time > '".$userdata['user_lastvisit']."'");
		
		while ($data2=mysql_fetch_array($query2)) {
			$fi++;
            $posts[$data2["post_id"]]=$data2["post_text"];
		}
		
	}
} 
echo $fi."\r\n";
echo var_dump($posts);
Este código se ejecuta en un interval de 5 seg y con el consigo que me de los post que desde ultima visita y que no ha marcados como leidos , solo me faltaría saber como obtener los mismos pero no leidos aunque no se marken en el viculo de markar leidos , no se que datos de la base de datos regitran cuando lees un post o como hacer la consulta , ayuda por favor :wink:

Re: consulta mysql

Publicado: 02 Ene 2013, 22:46
por Alorse
No entiendo, quieres leídos y no leídos por aparte o todos juntos?

Re: consulta mysql

Publicado: 03 Ene 2013, 08:32
por rafaxplayer
Alorse escribió:No entiendo, quieres leídos y no leídos por aparte o todos juntos?
A partir de un nombre de ususario , los mensajes desde última visita no leídos.

Re: consulta mysql  Tema Solucionado

Publicado: 03 Ene 2013, 16:48
por Alorse
Intenta con lo siguiente, deja solo la consulta de $userdata y reemplaza las otras 2 por esta:

Código: Seleccionar todo

"SELECT t.topic_id, t.topic_last_post_time, tt.mark_time as topic_mark_time, ft.mark_time as forum_mark_time 
    FROM (phpbb_topics t) LEFT JOIN phpbb_topics_track tt 
    ON (tt.user_id = " . $userdata['user_id'] . " 
        AND t.topic_id = tt.topic_id) LEFT JOIN phpbb_forums_track ft 
        ON (ft.user_id =  " . $userdata['user_id'] . " 
            AND t.forum_id = ft.forum_id) WHERE t.topic_last_post_time > " . $userdata['user_lastvisit'] ." 
                AND( 
                (tt.mark_time IS NOT NULL AND t.topic_last_post_time > tt.mark_time) OR 
                (tt.mark_time IS NULL AND ft.mark_time IS NOT NULL AND t.topic_last_post_time > ft.mark_time) OR 
                (tt.mark_time IS NULL AND ft.mark_time IS NULL) 
                ) 
                AND t.topic_moved_id = 0 
                ORDER BY t.topic_last_post_time DESC 
                LIMIT 10"

Re: consulta mysql

Publicado: 03 Ene 2013, 18:31
por rafaxplayer
Perfecto! por lo que he probado hasta ahora funciona a la perfección , es una consulta complicada para mis conocimientos no la hubiera sacado en fácilmente , gracias por todo ;)

Re: consulta mysql

Publicado: 03 Ene 2013, 19:08
por Alorse
Si, es una consulta un poco pesada, además que no se maneja la sintaxis de phpBB que lo hace mediante array para los LEFT y JOIN, además que no estabas teniendo en cuenta la tabla de topics_track que es la que almacena los temas leídos en caché, pero lo que importa es que ya te ha funcionado.

Re: consulta mysql

Publicado: 03 Ene 2013, 21:44
por rafaxplayer
Si después de estudiarlo ya he aprendido algunas cosas mas , solo tiene un defectillo y es que no me detecta cuando hay mas de un post nuevo dentro del mismo topic , yo uso el código así para hacer el contador de post nuevos sin leer:

Código: Seleccionar todo

<?php 
header("Expires: Sun, 19 Nov 1978 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

include("config.php");
mysql_select_db($dbname,mysql_connect($dbhost,$dbuser,$dbpasswd));
$userdata = mysql_fetch_array(mysql_query("SELECT * FROM phpbb_users WHERE username_clean='".mysql_real_escape_string(strtolower($_GET['id']))."' LIMIT 1"));

if ($userdata!=false) {
    $fi=0;
	$query = mysql_query("SELECT t.topic_id, t.topic_last_post_time, tt.mark_time as topic_mark_time, ft.mark_time as forum_mark_time 
    FROM (phpbb_topics t) LEFT JOIN phpbb_topics_track tt 
    ON (tt.user_id = " . $userdata['user_id'] . " 
        AND t.topic_id = tt.topic_id) LEFT JOIN phpbb_forums_track ft 
        ON (ft.user_id =  " . $userdata['user_id'] . " 
            AND t.forum_id = ft.forum_id) WHERE t.topic_last_post_time > " . $userdata['user_lastvisit'] ." 
                AND( 
                (tt.mark_time IS NOT NULL AND t.topic_last_post_time > tt.mark_time) OR 
                (tt.mark_time IS NULL AND ft.mark_time IS NOT NULL AND t.topic_last_post_time > ft.mark_time) OR 
                (tt.mark_time IS NULL AND ft.mark_time IS NULL) 
                ) 
                AND t.topic_moved_id = 0 ");
	while ($data=mysql_fetch_array($query)) {	
		
		$fi++;
		
	}
} 
echo $fi;

?>
creo que falta algo referente a la tabla de post, podría ser?

Re: consulta mysql

Publicado: 04 Ene 2013, 05:29
por Alorse
rafaxplayer escribió:no me detecta cuando hay mas de un post nuevo dentro del mismo topic
Tienes razón, pero lastimosamente no sé como hacerlo y llevo un buen tiempo intentándolo tengo un MOD con lo que quiero hacer algo parecido, pero hasta ahora no he encontrado ninguna manera de hacerlo, al menos en phpBB, porque en otras plataformas si llevan dicho detalle.

Re: consulta mysql

Publicado: 04 Ene 2013, 08:58
por rafaxplayer
Alorse escribió:
rafaxplayer escribió:no me detecta cuando hay mas de un post nuevo dentro del mismo topic
Tienes razón, pero lastimosamente no sé como hacerlo y llevo un buen tiempo intentándolo tengo un MOD con lo que quiero hacer algo parecido, pero hasta ahora no he encontrado ninguna manera de hacerlo, al menos en phpBB, porque en otras plataformas si llevan dicho detalle.
Bueno yo al final si lo he conseguido adaptando esto a mi proyecto , la consulta la hago asi:

Código: Seleccionar todo

include("config.php");
mysql_select_db($dbname,mysql_connect($dbhost,$dbuser,$dbpasswd));
$userdata = mysql_fetch_array(mysql_query("SELECT * FROM phpbb_users WHERE username_clean='".mysql_real_escape_string(strtolower($_GET['id']))."' LIMIT 1"));

if ($userdata!=false) {
    
	$query = mysql_query("SELECT t.topic_id, t.topic_last_post_time, tt.mark_time as topic_mark_time, ft.mark_time as forum_mark_time 
    FROM (phpbb_topics t) LEFT JOIN phpbb_topics_track tt 
    ON (tt.user_id = " . $userdata['user_id'] . " 
        AND t.topic_id = tt.topic_id) LEFT JOIN phpbb_forums_track ft 
        ON (ft.user_id =  " . $userdata['user_id'] . " 
            AND t.forum_id = ft.forum_id) WHERE t.topic_last_post_time > " . $userdata['user_lastvisit'] ." 
                AND( 
                (tt.mark_time IS NOT NULL AND t.topic_last_post_time > tt.mark_time) OR 
                (tt.mark_time IS NULL AND ft.mark_time IS NOT NULL AND t.topic_last_post_time > ft.mark_time) OR 
                (tt.mark_time IS NULL AND ft.mark_time IS NULL) 
                ) 
                AND t.topic_moved_id = 0 ");
                $fi=0;
	while ($data=mysql_fetch_array($query)) {
	   $query2=mysql_query("SELECT post_id FROM phpbb_posts WHERE topic_id='".$data["topic_id"]."' AND post_time > '".$userdata['user_lastvisit']."'");
		
		while ($data2=mysql_fetch_array($query2)) {
		$fi++;
		}
		
		
		
	}
} 
echo $fi;
Esto me cuenta los post (no solo topics) no leidos desde ultima visita de el usuario X


Ahora tengo otra duda que consultarte , lo hago aquí porque tiene que ver con la construcción de mi html desde la consulta...
La pregunta es como construir la url para que el navegador muestre un post? no el inicio del topic , por ejemplo si el post esta en la pagina 12 del topic redireccione directamente ahí no a la pagina 1 que es lo que tengo con esto:

Código: Seleccionar todo

<a href='http://www.xxx.com/viewtopic.php?f=".$data["forum_id"]."&t=".$data["topic_id"]."' target='_blank'><b>".$data["topic_title"]."</b></a>
He provado de la siguiente manera porque viewtopic.php admite la variable p:

Código: Seleccionar todo

$post_id	= request_var('p', 0);

Código: Seleccionar todo

<a href='http://www.amsspecialist.com/viewtopic.php?f=".$data["forum_id"]."&t=".$data["topic_id"]."&p=".$data["topic_last_post_time"]."' target='_blank'><b>".$data["topic_title"]."</b></a>
pero no funciona siempre redirecciona al principio del topic.

Es posible lo que quiero lograr?

Re: consulta mysql

Publicado: 04 Ene 2013, 16:58
por Alorse
Claro que es posible, pero lo estas haciendo mal, primero que todo no es solamente &p= sino también #p=, así que debería quedar algo así:

Código: Seleccionar todo

<a href='http://www.amsspecialist.com/viewtopic.php?f=".$data["forum_id"]."&t=".$data["topic_id"] . "&p=" . $data["topic_last_post_time"] . "#p=" . $data["topic_last_post_time"] . "' target='_blank'><b>".$data["topic_title"]."</b></a>
Creo que así debería funcionar.

Re: consulta mysql

Publicado: 04 Ene 2013, 18:02
por towen
Creo que en vez de ser $data["topic_last_post_time"] debería ser $data["topic_last_post_id"], y también tendrías que seleccionar en la consulta a t.topic_last_post_id