News:

Want to get involved in developing SMF, then why not lend a hand on our github!

Main Menu

[Duda] Consulta y reflejo de la DB al display.template

Started by Jotade29, December 01, 2021, 09:32:53 PM

Previous topic - Next topic

Jotade29

Buenas. En primer lugar agradecer el soporte que brindáis. No soy programador, y de hecho estoy aprendiendo PHP sobre la marcha, a base de mirar modificaciones, y trastear en los archivos. Dicho esto, en base a este fragmento de código, me gustaría que mostrase la id_group de la tabla members, en el display.template, es decir, que cada usuario que postea un mensaje en un tema, se le muestre la id_group (no busquéis sentido a mostrar este dato, porque no lo tiene, es simplemente un dato que uso de referencia para aprender):

// Inventory in Post - By JTX3 (USO ESTE FRAGMENTO COMO REFERENCIA; AGRADECIMIENTOS A JTX3)
   if (($modSettings['mostrar_enable'])) {
   global $db_prefix, $smcFunc, $boardurl, $modSettings;
   $request = $smcFunc['db_query']('','
      SELECT it.id_group
      FROM {db_prefix}members AS it
      WHERE it.id_group = it.id_member
   );
   if ($smcFunc['db_num_rows']($request))
   {

       echo '
            <fieldset style="border: 1px double rgb(210, 105, 0);"><legend align="center" style="border: 1px double rgb(210, 105, 0); background-color: rgb(234, 117, 0);"><span class="enable">'.$txt['enable'].'</span></legend>';
    while ($row = $smcFunc['db_fetch_assoc']($request))
     {
      echo '$row['id_group']';
     }
     $smcFunc['db_free_result']($request);
       echo ' </fieldset>
            ';
   }
   }

El primer condicional que nos encontramos, vamos a suponer, que en la sección de modificaciones del panel admin tenemos la 'v' puesta en el cuadradito que sería el de mostrar_enable, por tanto, dando el okey para que se muestre.

Después, la consulta no sé muy bien cómo hacerla, es decir:

$request = $smcFunc['db_query']('','
      SELECT it.id_group
      FROM {db_prefix}members AS it
      WHERE it.id_group = ¿it.id_member?
   );

Como he dicho, me gustaría que se me mostrase la id_group en el display.template de cada usuario que publique un mensaje en un tema (incluido el autor)... No tengo idea de cómo hacer ese WHERE, es decir entiendo que it.id_group sea = a algo que identifique a cada mensaje, ¿podría ser id_member? No sé si eso tiene sentido...

Después, para mostrar la consulta está el fragmento siguiente:

if ($smcFunc['db_num_rows']($request))
   {

       echo '
            <fieldset style="border: 1px double rgb(210, 105, 0);"><legend align="center" style="border: 1px double rgb(210, 105, 0); background-color: rgb(234, 117, 0);"><span class="enable">'.$txt['enable'].'</span></legend>';
    while ($row = $smcFunc['db_fetch_assoc']($request))
     {
      echo '$row['id_group']';
     }
     $smcFunc['db_free_result']($request);
       echo ' </fieldset>
            ';
   }

Interpreto que esta parte $smcFunc['db_num_rows']($request) sirve para mostrarme las filas de la consulta (smcFunc entiendo que sea una variable global)... La del While no tengo ni idea... Si alguien me lo pudiese aclarar, por favor...

while ($row = $smcFunc['db_fetch_assoc']($request))
     {
      echo '$row['id_group']';
     }
     $smcFunc['db_free_result']($request);
       echo ' </fieldset>
            ';
   }

Esta es la parte que no entiendo. Lo que entiendo es que el Eco $row me muestra la id_group...

Cuando ejecuto el código completo, en el display template, me salta este error:

syntax error, unexpected 'db_num_rows' (T_STRING), expecting ')'

Entiendo que esto me salte porque esperaba un paréntesis cerrado en la consulta, pero según he revisado están todos bien puestos... No entiendo más allá de lo dicho.

Como es posible que tenga varios fallos en la sintaxis, y tengo conocimientos con cuentagotas que he ido aprendiendo por mi cuenta, me gustaría, a ser posible, que alguien entendid de esto me comente los errores que va viendo para lograr que ese código muestre en cada mensaje posteado de un tema la id_group de cada usuario que postea.

Muchas gracias.
Quote from: Diego Andrés on August 12, 2023, 02:20:18 AMI'm afraid convincing Jotade to upgrade to SMF 2.1 will require bigger effort than your work sanitizing Unicode characters  :laugh:

Diego Andrés

Quote from: Ivan. on December 01, 2021, 09:32:53 PM¿podría ser id_member? No sé si eso tiene sentido...

Sí, id_member = {int:userid} y en abajo 'userid' => $message['member']['id']

Aunque tampoco explicaste muy bien el objetivo de todo esto, solamente mostrar la id?
Igualmente podrías modificar la query que ya está enviando la información del usuario y mensaje para agregar eso desde ahí.

SMF Tricks - Free & Premium Responsive Themes for SMF.

-Rock Lee-

Quote from: Ivan. on December 01, 2021, 09:32:53 PMComo he dicho, me gustaría que se me mostrase la id_group en el display.template de cada usuario que publique un mensaje en un tema (incluido el autor)... No tengo idea de cómo hacer ese WHERE, es decir entiendo que it.id_group sea = a algo que identifique a cada mensaje, ¿podría ser id_member? No sé si eso tiene sentido...

No llego a comprender del todo a que quieres llegar... pero sino entendi mal quieres mostrar el rango tiene (cosa lo hace por defecto ya SMF) sea contador de mensajes como rangos puntuales, existe modificaciones para mostrar mas rangos. Ademas ocultar estos datos en algun recuadro o similar y cuando el usuario de un click se despliegue para mostrar los datos ocultos... ¿Entendi correctamente? o ¿Podrias explicar un poco mas que buscar hacer?


Saludos!
¡Regresando como cual Fenix! ~ Bomber Code
Ayudas - Aportes - Tutoriales - Y mucho mas!!!

Jotade29

@-Rock Lee- @Diego Andrés busco aprender a reflejar de la base de datos al display template, porque hay campos que me interesan que se muestren en el display. Como comenté en el mensaje principal, el id_group es por mostrar algo... No tiene sentido mostrarlo, pero es el dato con el que estaba trabajando para que me lo reflejase.

Si intento eso, es para lograr que en el display.template se me muestren los temas que tiene un usuario... que creo que eso es más complejo, pues tendría que hacer un group by, e imagino que un inner join, para unir la tabla member con la de topic, o el nombre que sea que tiene la tabla de almacenamiento de los temas.

Más que instalar un mod, que igual hasta lo hay, quiero aprender esto, porque creo que es básico para hacer retoques en el foro.

@Diego Andrés ¿así sería?

$request = $smcFunc['db_query']('','
      SELECT it.id_group
      FROM {db_prefix}members AS it
      WHERE id_member = {int:userid}
      'userid' => $message['member']['id']
   );

¿Me puedes explicar qué significa {int:userid}, ¿por qué ha de ir entre corchetes? Imagino que eso significa que crea una variable de tipo entero que se llama userid, y se va a almacenar el dato que se indica más abajo, ¿puede ser?

Gracias por la ayuda :)
Quote from: Diego Andrés on August 12, 2023, 02:20:18 AMI'm afraid convincing Jotade to upgrade to SMF 2.1 will require bigger effort than your work sanitizing Unicode characters  :laugh:

Diego Andrés

Es una forma más limpia y entendible de insertar tus valores en las consultas, ya que así también lo harías cuando insertas/actualizas valores.

Puedes hacerlo directamente en la query

$request = $smcFunc['db_query']('','
      SELECT it.id_group
      FROM {db_prefix}members AS it
      WHERE id_member =' . $message['member']['id']
   );

O enviándolo como un valor

$request = $smcFunc['db_query']('','
      SELECT it.id_group
      FROM {db_prefix}members AS it
      WHERE id_member = {int:userid}',
      array(
            'userid' => $message['member']['id']
      )
   );

Es exactamente lo mismo, pero uno es más fácil de modificar si fuera una query más compleja y además te acostumbras a hacerlo así cuando también haces insert, update, delete, etc.

Aquí puedes ver más información https://wiki.simplemachines.org/smf/$smcFunc#db_query

SMF Tricks - Free & Premium Responsive Themes for SMF.

Jotade29

#5
Muchas gracias @Diego Andrés

Modifico el mensaje anterior, que ya conseguí que se muestre.

Ahora el problema está en la lógica de la consulta:

$request = $smcFunc['db_query']('','
      Select COUNT(it.id_member_started)
      FROM {db_prefix}topics AS it
      WHERE id_member_started = {int:userid}',
      array(
            'userid' => $message['member']['id']
      )
   );

La lógica que le he aplicado es que la id del usuario que ha empezado el tema, sea igual al que ha publicado el mensaje, pero no me muestra nada... Así que entiendo que id_member_started NO es llave foránea de user_id de la tabla members. Entonces, para que me lo muestre correctamente, ¿tendría que concatenar INNER JOINS hasta relacionar la tabla topics con la tabla members? De ser así, ¿dónde puedo visualizar las tablas y las relaciones de llaves en phpmyadmin?

Gracias de nuevo.
Quote from: Diego Andrés on August 12, 2023, 02:20:18 AMI'm afraid convincing Jotade to upgrade to SMF 2.1 will require bigger effort than your work sanitizing Unicode characters  :laugh:

Jotade29

Perdón por el doble post, pero es que no puedo modificar más el mensaje de arriba... Otra duda que me asola es la siguiente:

Con el Select COUNT(X), no conseguía que se me muestre la consulta... Así que opté por poner un alias a ese CountX as p, y en el echo mostrarlo por $Row['p']... y así sí que me lo muestra... No entiendo el porqué sin el alias no se me muestra el Count, así que me duda es si es necesario SIEMPRE que haga un count poner un alias para que se me muestre, de no ser así, ¿cómo podría visualizarlo sin necesidad de alias?

Gracias de nuevo
Quote from: Diego Andrés on August 12, 2023, 02:20:18 AMI'm afraid convincing Jotade to upgrade to SMF 2.1 will require bigger effort than your work sanitizing Unicode characters  :laugh:

Diego Andrés

Eso depende de la función que utilices para los resultados, puede ser db_fetch_assoc o db_fetch_row
Lo de las consultas como tal sería cuestión de que investigues más sobre sql si esa es la pregunta.

En la wiki también tienes ejemplos de como utilizar db_fetch_assoc y db_fetch_row, aunque tal como dice en las descripciones, están basadas en funciones de PHP por lo que eso también lo puedes revisar para aprender más. O quizás no entendí bien tu pregunta.

SMF Tricks - Free & Premium Responsive Themes for SMF.

Jotade29

Gracias de nuevo por tu ayuda, @Diego Andrés . Ya he conseguido que se me muestren los temas de los usuarios, pero ahora que lo he conseguido quiero un poco más  :P , te comento. Estaría genial que al igual que en un foro si está marcada la opción de que no cuenten los post, que imagino que corresponde a la tabla count_post de la tabla boards (creo que es un bool, ¿no?). Me gustaría estudiar la función PHP que hace que si está marcada la opción de 'no contar posts' en un foro, no cuente los posts, y al modificarla quiero que TAMPOCO CUENTE LOS TEMAS. Lo que ya no sé es dónde está esa función, ¿sabrías decírmelo?

Por último, por favor, ¿podrías responderme a este mensaje?

Quote from: Ivan. on December 02, 2021, 11:32:46 PMPerdón por el doble post, pero es que no puedo modificar más el mensaje de arriba... Otra duda que me asola es la siguiente:

Con el Select COUNT(X), no conseguía que se me muestre la consulta... Así que opté por poner un alias a ese CountX as p, y en el echo mostrarlo por $Row['p']... y así sí que me lo muestra... No entiendo el porqué sin el alias no se me muestra el Count, así que me duda es si es necesario SIEMPRE que haga un count poner un alias para que se me muestre, de no ser así, ¿cómo podría visualizarlo sin necesidad de alias?

Gracias de nuevo


Muchas gracias.

Quote from: Diego Andrés on August 12, 2023, 02:20:18 AMI'm afraid convincing Jotade to upgrade to SMF 2.1 will require bigger effort than your work sanitizing Unicode characters  :laugh:

Advertisement: