Seleccionar idioma:
Realizar Donación - Mods Premium - Portfolio



Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.
* Base de datos (Consultas Anidadas)
  Leído 2356 veces
* Viendo el foro
 0 Usuarios y 1 Visitante están viendo este foro.


*
Autor: ^HeRaCLeS^
Ago 03 2016
En este décimo tutorial sobre el desarrollo para smf hablaremos un poco sobre Bases de datos (Consultas Anidadas).



Base de datos (Consultas Anidadas)

Autor: ^HeRaCLeS^



En este décimo tutorial sobre el desarrollo para smf hablaremos un poco sobre:
Bases de datos (Consultas Anidadas)

Este sera el último tutorial hablando sobre base de datos y completaria la información del tutorial anterior.

Nota: Para poder hacer uso de todo esto deberemos globalizar las variables $smcFunc y $scripturl



Como ya mencionamos en el tutorial Variables globales la variable $smcFunc es del tipo array y tiene un conjunto de funciones generales, entre ellas las funciones que necesitamos para trabajar con la base de datos.
La variable $scripturl nos devuelve la url del sitio. Ej: tu_sitio.com/index.php

Para explicar esto vamos a trabajar sobre las tablas, columnas y datos existentes en smf, asi evitaremos repetir todos los pasos anteriores..
En este ejemplo veremos los ultimos 10 temas y la información del autor de cada tema.

Tablas: topics, messages y members
Columnas: id_topic, subject, member_name y id_member
Valor 1: Link del topic
Valor 2: Link del autor




Consultar datos:

Código: [Seleccionar]
<?php
// Lo primero que hacemos es globalizar las variables $smcFunc y $scripturl.
global $smcFunc$scripturl;

// Iniciamos la consulta
$sql $smcFunc['db_query']('','
SELECT t.id_topic,
m.subject,
u.member_name, u.id_member
FROM {db_prefix}topics AS t
LEFT JOIN {db_prefix}members AS u ON (u.id_member = t.id_member_started)
LEFT JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_first_msg)
ORDER BY t.id_topic DESC LIMIT {int:limit} '
,
array(
'limit' => 10,
)
);
$datos = array();
while ($row $smcFunc['db_fetch_assoc']($sql)) {
$datos[] = array(
'topic' => '<a href="'.$scripturl.'?topic='.$row['id_topic'].'.0" title="'.$row['subject'].'" target="_blank">'.$row['subject'].'</a>',
'autor' => '<a href="'.$scripturl.'?action=profile;u='.$row['id_member'].'" title="'.$row['member_name'].'" target="_blank">'.$row['member_name'].'</a>',
);
}

foreach($datos AS $data)
echo 'Tema: '.$data['topic'].'<br />Autor: '.$data['autor'].'<br /><br />';

?>


Ahora vamos a explicar un poco que fue lo que hicimos.

$sql = Aca estariamos dandole a la variable $sql el valor de toda la consulta.
SELECT Con esto le decimos que lea las columnas especificas de las tablas seleccionadas. (t.id_topic, m.subject, u.member_name, u.id_member)
FROM {db_prefix}topics AS t Con esto le decimos que lea la tabla topics y ahora sera t.
LEFT JOIN Con esto haremos el anidado de las tablas, en este caso con (members y messages)
members AS u Con esto le decimos que lea la tabla members y que ahora sera u.
ON (u.id_member = t.id_member_started) Con esto le decimos que solo lea los datos que coincidan en las columnas (u.id_member y t.id_member_started)
messages AS m Con esto le decimos que lea la tabla messages y que ahora sera m.
ON (m.id_msg = t.id_first_msg) Con esto le decimos que solo lea los datos que coincidan en las columnas (m.id_msg y t.id_first_msg)
ORDER BY t.id_topic DESC Con esto le decimos que ordene de forma descendente por id de topic
LIMIT {int:limit} Con esto le decimos que solo lea la cantidad de resultados de la variable limit.
'limit' => 10, Con esto establecemos la cantidad del limite, en este caso 10.
$datos = array(); Definimos la variable $datos y le decimos que sera un array.
while Recorremos todos los valores obtenidos de la consulta (While es un bucle)
$datos[] = Agregamos todos los valores a la variable $datos.
'topic' => Creamos un link con los datos del topic.
'autor' => Creamos un link con los datos del autor.
foreach($datos AS $data) Recorremos todos los valores obtenidos por el while (Foreach es un bucle)
echo Imprimimos los datos obtenidos.

En este ejemplo el resultado seria:
Tema: Tema 1
Autor: Nombre de usuario



Notas:
Esta es una consulta anidada simple para que vean mas o menos como seria.
Lo referente a while foreach y echo se explicara en sus respectivos tutoriales. (Aca se utilizan solo para que vean los resultados)
Lo referente a LEFT JOIN se explicara en su respectivo tutorial. (Aca se utilizan solo para que vean los resultados)





Como ya mensione en otros tutoriales, yo explico y enseño lo basico...
Despues dependera de cada uno el uso que le de y la imaginacion que tenga para usarlo.

Script: Desde este Link podran descargar el script de este ejemplo.
Lo descargan.
Lo suben al root de su sitio.
Lo ejecutan: su_sitio/Consultas-Anidadas.php

Nota: El script esta todo comentado para su mejor comprension.



Nos vemos en el proximo tutorial sobre desarrollo de smf.



Ohh parece fácil a probarlo :D gracias :)




Muchas gracias por un nuevo tutorial Heracles. Haces que todos podamos aprender un poco más sobre SMF.

Sigue así amigo :)




Sería bueno como pequeño tip, especificar que LEFT JOIN especifica que el dato de la izquierda puede que este vació, el RIGHT JOIN especifica que el dato de la derecha puede que este vació. Finalmente, el JOIN los junta siempre y cuando, ambos datos no devuelvan nulos.

Está perfecto, también sería bueno agregar cuando se ocupa los $context para enviar la información a la vista, excelente trabajo como siempre estimado.

Saludos, Jose.




Tambien seria bueno que leas las notas!! :P

Citar
Lo referente a LEFT JOIN se explicara en su respectivo tutorial. (Aca se utilizan solo para que vean los resultados)

Los context no tienen nada que ver con base de datos, smf utiliza ese array para pasar los datos, pero se puede utilizar cualquier variable. Aun asi, no tiene sentido explicarlo aca ya que aca solo se esta utilizando un archivo, por lo cual pasar una variable es innecesario.




Otros temas de su interes

Variables globales ^HeRaCLeS^ Febrero 03, 2013, 06:02:36 pm
Introduccion al desarrollo smf ^HeRaCLeS^ Febrero 03, 2013, 05:59:25 pm
$_SESSION y $_COOKIE ^HeRaCLeS^ Octubre 04, 2013, 04:55:46 pm
Base de datos (Consultas) ^HeRaCLeS^ Abril 24, 2014, 04:11:29 pm
Introduccion a las bases de datos ^HeRaCLeS^ Octubre 15, 2013, 01:38:56 pm
Base de datos (Insertar y modificar) ^HeRaCLeS^ Abril 23, 2014, 02:40:38 pm



Usuario:
Contraseña:
Sesión: