<?php
$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']."'");
}
<?php
$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);
}
<?php
$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
Código PHP:<?php
$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']."'");
}
<?php
$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);
}
<?php
$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: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:
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!