$query = $db->simple_select("users", "uid");
while($user = $db->fetch_array($query))
{
$users[$user['uid']] = $user;
}
foreach($users as $user)
{
$query = $db->simple_select("threads", "COUNT(tid) AS threads", "uid = '".$user['uid']."'");
$threads_count = intval($db->fetch_field($query, "threads"));
$db->update_query("users", array("pip_threads" => $threads_count), "uid = '".$user['uid']."'");
}
$plugins->add_hook("datahandler_post_insert_thread", "pip_insert_thread_count_threads");
function pip_insert_thread_count_threads($thread)
{
global $mybb, $db;
if(!$thread->data['uid'])
{
return false;
}
if($thread->data['uid'] == $mybb->user['uid'])
{
$uid = $mybb->user['uid'];
$value = $mybb->user['pip_threads'];
}
else
{
$query = $db->simple_select('users', 'pip_threads', 'uid = ' . $thread['username'], array('limit' => 1));
$value = $db->fetch_field('pip_threads', $query);
$uid = $thread->data['uid'];
}
$new_value = ++$value;
$db->update_query('users', array('pip_threads' => $new_value), 'uid = ' . $uid);
}
$plugins->add_hook("class_moderation_delete_thread_start", "pip_delete_thread_count");
function pip_delete_thread_count($tid)
{
global $mybb, $db, $thread;
$query = $db->query('SELECT t.uid, u.pip_threads FROM ' . TABLE_PREFIX . 'threads t JOIN ' . TABLE_PREFIX . 'users u ON t.uid = u.uid WHERE t.tid = ' . $tid . ' LIMIT 1');
$result = $db->fetch_array($query);
if(!$result['uid'])
{
return false;
}
$pip_threads = $result['pip_threads'] - 1;
$uid = $result['uid'];
$db->update_query('users', array('pip_threads' => $pip_threads), 'uid = ' . $uid);
}
(16 Jul, 2011, 12:23 pm)Edson Ordaz escribió: vi tu code y es sencillo jeje es igual que el de dragon fever y noe me gusta mucho la idea de hacer consulta en cada post..
Como consejo mira yo en mi plugin PIP tambien cuenta los temas y lo hice de la siguiente manera y no realiza NINGUNA consulta en los post..
primero en el activate le puse a todos los usuarios sus numero de temas creados
$query = $db->simple_select("users", "uid"); while($user = $db->fetch_array($query)) { $users[$user['uid']] = $user; } foreach($users as $user) { $query = $db->simple_select("threads", "COUNT(tid) AS threads", "uid = '".$user['uid']."'"); $threads_count = intval($db->fetch_field($query, "threads")); $db->update_query("users", array("pip_threads" => $threads_count), "uid = '".$user['uid']."'"); }
y ya de ahi cuando alguien crea un tema se el agrega uno mas desde el siguente hook
$plugins->add_hook("datahandler_post_insert_thread", "pip_insert_thread_count_threads"); function pip_insert_thread_count_threads($thread) { global $mybb, $db; if(!$thread->data['uid']) { return false; } if($thread->data['uid'] == $mybb->user['uid']) { $uid = $mybb->user['uid']; $value = $mybb->user['pip_threads']; } else { $query = $db->simple_select('users', 'pip_threads', 'uid = ' . $thread['username'], array('limit' => 1)); $value = $db->fetch_field('pip_threads', $query); $uid = $thread->data['uid']; } $new_value = ++$value; $db->update_query('users', array('pip_threads' => $new_value), 'uid = ' . $uid); }
y al eliminar un tema se loq uito asi
$plugins->add_hook("class_moderation_delete_thread_start", "pip_delete_thread_count"); function pip_delete_thread_count($tid) { global $mybb, $db, $thread; $query = $db->query('SELECT t.uid, u.pip_threads FROM ' . TABLE_PREFIX . 'threads t JOIN ' . TABLE_PREFIX . 'users u ON t.uid = u.uid WHERE t.tid = ' . $tid . ' LIMIT 1'); $result = $db->fetch_array($query); if(!$result['uid']) { return false; } $pip_threads = $result['pip_threads'] - 1; $uid = $result['uid']; $db->update_query('users', array('pip_threads' => $pip_threads), 'uid = ' . $uid); }
y en el postbit se puede poner {$post['pip_threads']} y los muestra y como veras no realiza NINGUNA consulta en el tema es por ello que es mucho mejor!!
Santiago creo uno que si no me equivo tampoco realiza NINGUNA consulta pero esta mejor el suyo xq pone en el perfil el numero de temas creador y el porcetahe de temas por dias
http://mods.mybb.com/view/thread-count-pro
espero no te enojes ya que es una critica constructiva pero en lo personnal esta mal tu plug por la cantidad de consultas que realizaria.....
Perdon no habia visto que ya habias puesto lo de santiago jaja pero bueno yo prefiero una tabla ya que eso no afecta nada ya que las consultas si cuentan mucho y se estaria realizando con el tuyo una por post imaginate un thread con 200 post???
una cosa mas ya encontre el plug de DragonFever miralo para que veas es igual solo que tu pones remplazar la plantilla y dragonfever no pone eso porq deja que los usuarios lo hagan manual xD
PD: Este es exesivamente viejo lo saco para 1.4x
(16 Jul, 2011, 12:38 pm)Santiago escribió: No iba a escribir este post, pero la frase "mucho más fácil y no hace falta una tabla de sobra" me hizo cambiar de opinión.¿Yeahhh!! Good for you!, Yeahh!! Query avoided!?
Mucho mas fácil? Si.
Mucho mejor? No.
Una tabla de sobra? No, no y no.
Tuve una razón (muy muy buena razón) para hacer el plugin de la manera en que lo hice: Optimización/rendimiento.
Funcionamiento de mi plugin:
- Crea un nuevo campo en la base de datos. Ponele que agregue 2 o 3 MBs de espacio máximo en un foro con miles de usuarios.
- Realiza 1 (una) consulta a la base de datos cuando el usuario crea o elimina un nuevo thread.
- No realiza ninguna consulta cuando estás viendo un thread, ya que MyBB obtiene el valor de la base de datos automaticamente.
Funcionamiento de tu plugin:
- No crea ningún campo en la base de datos. (Yeahhh!! Good for you!)
- No realiza ninguna consulta a la base de datos cuando el usuario crea o elimina un nuevo thread. (Yeahh!! Query avoided!)
- Cuando visitas un thread, realiza 1 (una) consulta a la base de datos por cada post que estés viendo. (Ouch! My bad...)
Pero eso no es todo, tu plugin no le ordena a la base de datos que cuente la cantidad de threads, si no que le ordena que extraiga todos y cada uno de los threads hechos por el usuario, y luego que los cuente.
Resultado:
En mi foro en localhost (donde el servidor tiene el 100% de los recursos disponibles), al ver un thread conteniendo 7 posts (todos hechos por el mismo usuario), los resultados son los siguientes:
Con tu plugin activado: 29
Con mi plugin activado: 22
Sin ningun plugin activado: 22
Screen de las consultas extra que hace tu plugin:
[Imagen: 2zsqgw8.jpg]
En un foro chico (MUY chico) y con un servidor decente (que no esté sobrevendido y bien configurado, con cache), no habría problemas.
Eso sí, en cuanto le agregas cientos/miles de visitas, el hosting te va a sacar a patadas :p
Las recomendaciones que te daría para el plugin:
- Utiliza la funcion COUNT de mysql.
- Crea un array global con la cantidad de threads hecho por el usuario X. Luego, antes de hacer la consulta a la base de datos, comprueba si ya la ha hecho anteriormente.
Aún así, con estas optimizaciones, el rendimiento en un foro mediano/grande no va a ser para nada bueno.
Ahora ya conoces las ventajas y desventajas que el método que estás utilizando tiene.
Suerte con el plugin
PD: Estuve 30 minutos escribiendo esto y.... bueno, tenía que salir hace 25 minutos. Adios!
Edit: Ups, parece que Edson posteo antes algo parecido. Luego lo leere, que ahora me tengo que ir.
Edit 2: Ufa, no me resistí a leer. Lo único que me queda para decir: Edson, mi código es libre, pero está liberado bajo la GPL. Recuerdalo...
Ahora si, chao!
(16 Jul, 2011, 12:47 pm)Edson Ordaz escribió: Por supuesto es casi justo lo que le indicaba q no realiza consultas de mas y por supuesto que mejor con el count y puede usarlo con el simple_select de MyBB como lo e hecho yo la verdad tampoco pensaba postear porque siempre que lo hago se enoja y me reclama pero tambien lo ise solo porque dice que una tabla de sobra lo cual veo mal de su parte y mucho menos que dice que es mas facil jeje!