Selecting data using JDatabase/es: Difference between revisions

From Joomla! Documentation

Created page with "Nota: La 'clave' debe ser un nombre de columna válido de la tabla; no tiene que ser un Índice o una Clave Principal. Pero si no tiene un valor único no puede ser capaz de r..."
FuzzyBot (talk | contribs)
Updating to match new version of source page
 
(39 intermediate revisions by 3 users not shown)
Line 49: Line 49:
$query->select($db->quoteName(array('user_id', 'profile_key', 'profile_value', 'ordering')));
$query->select($db->quoteName(array('user_id', 'profile_key', 'profile_value', 'ordering')));
$query->from($db->quoteName('#__user_profiles'));
$query->from($db->quoteName('#__user_profiles'));
$query->where($db->quoteName('profile_key') . ' LIKE '. $db->quote('\'custom.%\''));
$query->where($db->quoteName('profile_key') . ' LIKE ' . $db->quote('custom.%'));
$query->order('ordering ASC');
$query->order('ordering ASC');


Line 58: Line 58:
$results = $db->loadObjectList();
$results = $db->loadObjectList();
</source>
</source>
(Here the <tt>quoteName()</tt> function adds appropriate quotes around the column names to avoid conflicts with any database reserved word, now or in the future.)


La consulta también puede ser encadenada para simplificar aún más:
La consulta también puede ser encadenada para simplificar aún más:
Line 65: Line 67:
     ->select($db->quoteName(array('user_id', 'profile_key', 'profile_value', 'ordering')))
     ->select($db->quoteName(array('user_id', 'profile_key', 'profile_value', 'ordering')))
     ->from($db->quoteName('#__user_profiles'))
     ->from($db->quoteName('#__user_profiles'))
     ->where($db->quoteName('profile_key') . ' LIKE '. $db->quote('\'custom.%\''))
     ->where($db->quoteName('profile_key') . ' LIKE ' . $db->quote('custom.%'))
     ->order('ordering ASC');
     ->order('ordering ASC');
</source>
</source>


El encadenamiento puede ser útil cuando las consultas se convierten en más y más complejas.
El método de llamadas encadenadas, mejora la legibilidad del código y reduce el exceso de código a medida que las consultas se vuelven más largas y complejas.


La agrupación se puede lograr muy simplemente. La siguiente consulta sería para contar el número de artículos en cada categoría.
La agrupación se puede lograr muy simplemente. La siguiente consulta sería para contar el número de artículos en cada categoría.
Line 75: Line 77:
<source lang="php">
<source lang="php">
$query
$query
     ->select( array('catid', 'COUNT(*)') )
     ->select(array('catid', 'COUNT(*)'))
     ->from($db->quoteName('#__content'))
     ->from($db->quoteName('#__content'))
     ->group($db->quoteName('catid'));
     ->group($db->quoteName('catid'));
Line 88: Line 90:
     ->setLimit('10');
     ->setLimit('10');
</source>
</source>


==Seleccionar Registros de Varias Tablas==
==Seleccionar Registros de Varias Tablas==
Using the JDatabaseQuery's [http://api.joomla.org/11.4/Joomla-Platform/Database/JDatabaseQuery.html#join join] methods, we can select records from multiple related tables. The generic "join" method takes two arguments; the join "type" (inner, outer, left, right) and the join condition. In the following example you will notice that we can use all of the keywords we would normally use if we were writing a native SQL query, including the AS keyword for aliasing tables and the ON keyword for creating relationships between tables. Also note that the table alias is used in all methods which reference table columns (I.e. select, where, order).
Con el uso de los métodos [http://api.joomla.org/11.4/Joomla-Platform/Database/JDatabaseQuery.html#join join] de ''JDatabaseQuery'', se pueden seleccionar los registros de varias tablas relacionadas. El método genérico ''"join"'' toma dos argumentos; "tipo" de unión (''inner'', ''outer'', ''left'', ''right'') y la condición de unión. En el siguiente ejemplo se da cuenta de como podemos usar todas las palabras clave que queremos utilizar normalmente si estamos escribiendo una consulta SQL nativa, incluyendo la palabra clave ''AS'' para asignar un alias a las tablas y la palabra clave ''ON'' para la creación de relaciones entre tablas. También ten en cuenta que la tabla de alias se utiliza en todos los métodos que hacen referencia a columnas de la tabla (Por ej.: ''select'', ''where'', ''order'').


<source lang="php">
<source lang="php">
Line 103: Line 106:
// Note by putting 'a' as a second parameter will generate `#__content` AS `a`
// Note by putting 'a' as a second parameter will generate `#__content` AS `a`
$query
$query
     ->select($db->quoteName(array('a.*', 'b.username', 'b.name')))
     ->select(array('a.*', 'b.username', 'b.name'))
     ->from($db->quoteName('#__content', 'a'))
     ->from($db->quoteName('#__content', 'a'))
     ->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id') . ')')
     ->join('INNER', $db->quoteName('#__users', 'b') . ' ON ' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id'))
     ->where($db->quoteName('b.username') . ' LIKE \'a%\'')
     ->where($db->quoteName('b.username') . ' LIKE ' . $db->quote('a%'))
     ->order($db->quoteName('a.created') . ' DESC');
     ->order($db->quoteName('a.created') . ' DESC');


Line 126: Line 129:
<source lang="php">
<source lang="php">
$query
$query
     ->select($db->quoteName(array('a.*', 'b.username', 'b.name', 'c.*', 'd.*')))
     ->select(array('a.*', 'b.username', 'b.name', 'c.*', 'd.*'))
     ->from($db->quoteName('#__content', 'a'))
     ->from($db->quoteName('#__content', 'a'))
     ->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id') . ')')
     ->join('INNER', $db->quoteName('#__users', 'b') . ' ON ' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id'))
     ->join('LEFT', $db->quoteName('#__user_profiles', 'c') . ' ON (' . $db->quoteName('b.id') . ' = ' . $db->quoteName('c.user_id') . ')')
     ->join('LEFT', $db->quoteName('#__user_profiles', 'c') . ' ON ' . $db->quoteName('b.id') . ' = ' . $db->quoteName('c.user_id'))
     ->join('RIGHT', $db->quoteName('#__categories', 'd') . ' ON (' . $db->quoteName('a.catid') . ' = ' . $db->quoteName('d.id') . ')')
     ->join('RIGHT', $db->quoteName('#__categories', 'd') . ' ON ' . $db->quoteName('a.catid') . ' = ' . $db->quoteName('d.id'))
     ->where($db->quoteName('b.username') . ' LIKE \'a%\'')
     ->where($db->quoteName('b.username') . ' LIKE ' . $db->quote('a%'))
     ->order($db->quoteName('a.created') . ' DESC');
     ->order($db->quoteName('a.created') . ' DESC');
</source>
</source>
Line 141: Line 144:
<source lang="php">
<source lang="php">
$query
$query
     ->select($db->quoteName('a.*'))
     ->select('a.*')
     ->select($db->quoteName('b.username', 'username'))
     ->select($db->quoteName('b.username', 'username'))
     ->select($db->quoteName('b.name', 'name'))
     ->select($db->quoteName('b.name', 'name'))
     ->from($db->quoteName('#__content', 'a'))
     ->from($db->quoteName('#__content', 'a'))
     ->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id') . ')')
     ->join('INNER', $db->quoteName('#__users', 'b') . ' ON ' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id'))
     ->where($db->quoteName('b.username') . ' LIKE \'a%\'')
     ->where($db->quoteName('b.username') . ' LIKE ' . $db->quote('a%'))
     ->order($db->quoteName('a.created') . ' DESC');
     ->order($db->quoteName('a.created') . ' DESC');
</source>
</source>
Line 154: Line 157:
<source lang="php">
<source lang="php">
$query
$query
     ->select($db->quoteName(array('a.*', 'b.username', 'b.name'), array('', 'username', 'name'))
    ->select(array('a.*'))
     ->select($db->quoteName(array('b.username', 'b.name'), array('username', 'name')))
     ->from($db->quoteName('#__content', 'a'))
     ->from($db->quoteName('#__content', 'a'))
     ->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id') . ')')
     ->join('INNER', $db->quoteName('#__users', 'b') . ' ON ' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id'))
     ->where($db->quoteName('b.username') . ' LIKE \'a%\'')
     ->where($db->quoteName('b.username') . ' LIKE ' . $db->quote('a%'))
     ->order($db->quoteName('a.created') . ' DESC');
     ->order($db->quoteName('a.created') . ' DESC');
</source>
==Using OR in queries==
When using multiple WHERE clauses in your query, they will be treated as an AND. 
So, for example, the query below will return results where the 'name' field AND the 'state' field match.
<source lang="php">
$query = $db
    ->getQuery(true)
    ->select('COUNT(*)')
    ->from($db->quoteName('#__my_table'))
    ->where($db->quoteName('name') . " = " . $db->quote($value)
    ->where($db->quoteName('state') . " = " . $db->quote($state));
</source>
To use a WHERE clause as an OR, the query can be written like this
<source lang="php">
$query = $db
    ->getQuery(true)
    ->select('COUNT(*)')
    ->from($db->quoteName('#__my_table'))
    ->where($db->quoteName('name') . " = " . $db->quote($name_one), 'OR')
    ->where($db->quoteName('name') . " = " . $db->quote($name_two));
</source>
it can also be written like this
<source lang="php">
$query = $db
    ->getQuery(true)
    ->select('COUNT(*)')
    ->from($db->quoteName('#__my_table'))
    ->where($db->quoteName('name') . " = " . $db->quote($name_one)
    ->orWhere($db->quoteName('name') . " = " . $db->quote($name_two));
</source>
</source>


== Resultados de la Consulta ==
== Resultados de la Consulta ==
La clase ''database'' contiene muchos métodos para trabajar con el conjunto de resultados de al consulta.
La clase ''database'' contiene muchos métodos para trabajar con el conjunto de resultados de al consulta.
If there are no matches to the query, the result will be null.


=== Resultado de Valor Único ===
=== Resultado de Valor Único ===
Line 183: Line 220:
<source lang="php">
<source lang="php">
$db = JFactory::getDbo();
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query = $db
$query->select('COUNT(*)');
    ->getQuery(true)
$query->from($db->quoteName('#__my_table'));
    ->select('COUNT(*)')
$query->where($db->quoteName('name')." = ".$db->quote($value));
    ->from($db->quoteName('#__my_table'))
    ->where($db->quoteName('name') . " = " . $db->quote($value));


// Reset the query using our newly populated query object.
// Reset the query using our newly populated query object.
Line 192: Line 230:
$count = $db->loadResult();
$count = $db->loadResult();
</source>
</source>
or where you are just looking for a single field from a single row of the table (or possibly a single field from the first row returned).
o cuando estás buscando un único campo de una sola fila de la tabla (o posiblemente un único campo de la primera fila devuelta).
<source lang='php'>
<source lang='php'>
$db = JFactory::getDbo();
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query = $db
$query->select('field_name');
    ->getQuery(true)
$query->from($db->quoteName('#__my_table'));
    ->select('field_name')
$query->where($db->quoteName('some_name')." = ".$db->quote($some_value));
    ->from($db->quoteName('#__my_table'))
    ->where($db->quoteName('some_name') . " = " . $db->quote($some_value));


$db->setQuery($query);
$db->setQuery($query);
Line 228: Line 267:
</source>
</source>
se tendrá:
se tendrá:
<pre>Array ( [0] => 1 [1] => John Smith [2] => johnsmith@domain.example [3] => johnsmith ) </pre>
<pre>Array ( [0] => 1, [1] => John Smith, [2] => johnsmith@domain.example, [3] => johnsmith ) </pre>


Puedes acceder a los valores individuales mediante el uso de:<pre>$row['index'] // e.g. $row['2']</pre>
Puedes acceder a los valores individuales mediante el uso de:<pre>$row['index'] // e.g. $row['2']</pre>
Line 249: Line 288:
<pre>Array ( [id] => 1, [name] => John Smith, [email] => johnsmith@domain.example, [username] => johnsmith )</pre>
<pre>Array ( [id] => 1, [name] => John Smith, [email] => johnsmith@domain.example, [username] => johnsmith )</pre>


Puedes acceder a los valores individuales mediante el uso de:<pre>$row['name'] // e.g. $row['name']</pre>
Puedes acceder a los valores individuales mediante el uso de:<pre>$row['name'] // e.g. $row['email']</pre>


# Si bien puedes repetir la llamada para obtener más filas, una de las funciones que devuelve varias filas puede ser más útil.
# Si bien puedes repetir la llamada para obtener más filas, una de las funciones que devuelve varias filas puede ser más útil.
Line 298: Line 337:


se tendrá:
se tendrá:
<pre>Array ( [0] => John Smith [1] => Magda Hellman [2] => Yvonne de Gaulle )</pre>
<pre>Array ( [0] => John Smith, [1] => Magda Hellman, [2] => Yvonne de Gaulle )</pre>


Puedes acceder a los valores individuales mediante el uso de:<pre>$column['index'] // e.g. $column['2']</pre>
Puedes acceder a los valores individuales mediante el uso de:<pre>$column['index'] // e.g. $column['2']</pre>
Line 335: Line 374:


se tendrá:
se tendrá:
<pre>Array ( [0] => John Smith [1] => Magda Hellman [2] => Yvonne de Gaulle )
<pre>Array ( [0] => John Smith, [1] => Magda Hellman, [2] => Yvonne de Gaulle ),
Array ( [0] => johnsmith@domain.example [1] => magda_h@domain.example [2] => ydg@domain.example )
Array ( [0] => johnsmith@domain.example, [1] => magda_h@domain.example, [2] => ydg@domain.example ),
Array ( [0] => johnsmith [1] => magdah [2] => ydegaulle )</pre>
Array ( [0] => johnsmith, [1] => magdah, [2] => ydegaulle )</pre>
</pre>
</pre>


Line 370: Line 409:


<pre>Array (  
<pre>Array (  
[0] => Array ( [0] => 1 [1] => John Smith [2] => johnsmith@domain.example [3] => johnsmith )  
[0] => Array ( [0] => 1, [1] => John Smith, [2] => johnsmith@domain.example, [3] => johnsmith ),
[1] => Array ( [0] => 2 [1] => Magda Hellman [2] => magda_h@domain.example [3] => magdah )  
[1] => Array ( [0] => 2, [1] => Magda Hellman, [2] => magda_h@domain.example, [3] => magdah ),
[2] => Array ( [0] => 3 [1] => Yvonne de Gaulle [2] => ydg@domain.example [3] => ydegaulle )  
[2] => Array ( [0] => 3, [1] => Yvonne de Gaulle, [2] => ydg@domain.example, [3] => ydegaulle )  
)</pre>
)</pre>


Line 393: Line 432:
va a dar (con saltos de línea añadido para mayor claridad):
va a dar (con saltos de línea añadido para mayor claridad):
<pre>Array (  
<pre>Array (  
[0] => Array ( [id] => 1 [name] => John Smith [email] => johnsmith@domain.example [username] => johnsmith )  
[0] => Array ( [id] => 1, [name] => John Smith, [email] => johnsmith@domain.example, [username] => johnsmith ),
[1] => Array ( [id] => 2 [name] => Magda Hellman [email] => magda_h@domain.example [username] => magdah )  
[1] => Array ( [id] => 2, [name] => Magda Hellman, [email] => magda_h@domain.example, [username] => magdah ),
[2] => Array ( [id] => 3 [name] => Yvonne de Gaulle [email] => ydg@domain.example [username] => ydegaulle )  
[2] => Array ( [id] => 3, [name] => Yvonne de Gaulle, [email] => ydg@domain.example, [username] => ydegaulle )  
) </pre>
) </pre>


Line 413: Line 452:
va a dar (con saltos de línea añadido para mayor claridad):
va a dar (con saltos de línea añadido para mayor claridad):
<pre>Array (  
<pre>Array (  
[johnsmith] => Array ( [id] => 1 [name] => John Smith [email] => johnsmith@domain.example [username] => johnsmith )  
[johnsmith] => Array ( [id] => 1, [name] => John Smith, [email] => johnsmith@domain.example, [username] => johnsmith ),
[magdah] => Array ( [id] => 2 [name] => Magda Hellman [email] => magda_h@domain.example [username] => magdah )  
[magdah] => Array ( [id] => 2, [name] => Magda Hellman, [email] => magda_h@domain.example, [username] => magdah ),
[ydegaulle] => Array ( [id] => 3 [name] => Yvonne de Gaulle [email] => ydg@domain.example [username] => ydegaulle )  
[ydegaulle] => Array ( [id] => 3, [name] => Yvonne de Gaulle, [email] => ydg@domain.example, [username] => ydegaulle )  
)</pre>
)</pre>


Line 435: Line 474:
va a dar (con saltos de línea añadido para mayor claridad):
va a dar (con saltos de línea añadido para mayor claridad):
<pre>Array (  
<pre>Array (  
[1] => John Smith  
[1] => John Smith,
[2] => Magda Hellman  
[2] => Magda Hellman,
[3] => Yvonne de Gaulle
[3] => Yvonne de Gaulle,
)</pre>
)</pre>


Line 443: Line 482:


==== loadObjectList() ====
==== loadObjectList() ====
<tt>loadObjectList()</tt> returns an indexed array of PHP objects from the table records returned by the query:
<tt>loadObjectList()</tt> devuelve un array indexado de objetos PHP a partir de los registros de la tabla devueltos por la consulta:


<source lang='php'>
<source lang='php'>
Line 452: Line 491:
</source>
</source>


will give (with line breaks added for clarity):
va a dar (con saltos de línea añadido para mayor claridad):
<pre>Array (  
<pre>Array (  
[0] => stdClass Object ( [id] => 1 [name] => John Smith  
[0] => stdClass Object ( [id] => 1, [name] => John Smith,
     [email] => johnsmith@domain.example [username] => johnsmith )  
     [email] => johnsmith@domain.example, [username] => johnsmith ),
[1] => stdClass Object ( [id] => 2 [name] => Magda Hellman  
[1] => stdClass Object ( [id] => 2, [name] => Magda Hellman,
     [email] => magda_h@domain.example [username] => magdah )  
     [email] => magda_h@domain.example, [username] => magdah ),
[2] => stdClass Object ( [id] => 3 [name] => Yvonne de Gaulle  
[2] => stdClass Object ( [id] => 3, [name] => Yvonne de Gaulle,
     [email] => ydg@domain.example [username] => ydegaulle )  
     [email] => ydg@domain.example, [username] => ydegaulle )  
)</pre>
)</pre>


You can access the individual rows by using:<pre>$row['index'] // e.g. $row['2']</pre>
Puedes acceder a las filas individuales mediante el uso de:<pre>$row['index'] // e.g. $row['2']</pre>
and you can access the individual values by using:<pre>$row['index']->name // e.g. $row['2']->email</pre>
y puedes acceder a los valores individuales mediante el uso de:<pre>$row['index']->name // e.g. $row['2']->email</pre>


==== loadObjectList('key') ====
==== loadObjectList($clave) ====
<tt>loadObjectList($key)</tt> returns an associated array - indexed on 'key' - of objects from the table records returned by the query:
<tt>loadObjectList($clave)</tt> devuelve un array asociativo - indexado por 'clave', de objetos de los registros de la tabla devueltos por la consulta:


<source lang='php'>
<source lang='php'>
Line 475: Line 514:
</source>
</source>


will give (with line breaks added for clarity):
va a dar (con saltos de línea añadido para mayor claridad):
<pre>Array (  
<pre>Array (  
[johnsmith] => stdClass Object ( [id] => 1 [name] => John Smith  
[johnsmith] => stdClass Object ( [id] => 1, [name] => John Smith,
     [email] => johnsmith@domain.example [username] => johnsmith )  
     [email] => johnsmith@domain.example, [username] => johnsmith ),
[magdah] => stdClass Object ( [id] => 2 [name] => Magda Hellman  
[magdah] => stdClass Object ( [id] => 2, [name] => Magda Hellman,
     [email] => magda_h@domain.example [username] => magdah )  
     [email] => magda_h@domain.example, [username] => magdah ),
[ydegaulle] => stdClass Object ( [id] => 3 [name] => Yvonne de Gaulle  
[ydegaulle] => stdClass Object ( [id] => 3, [name] => Yvonne de Gaulle,
     [email] => ydg@domain.example [username] => ydegaulle )  
     [email] => ydg@domain.example, [username] => ydegaulle )  
)</pre>
)</pre>


You can access the individual rows by using:<pre>$row['key_value'] // e.g. $row['johnsmith']</pre>
Puedes acceder a las filas individuales mediante el uso de:<pre>$row['key_value'] // e.g. $row['johnsmith']</pre>
and you can access the individual values by using:<pre>$row['key_value']->column_name // e.g. $row['johnsmith']->email</pre>
y puedes acceder a los valores individuales mediante el uso de:<pre>$row['key_value']->column_name // e.g. $row['johnsmith']->email</pre>


Note: Key must be a valid column name from the table; it does not have to be an Index or a Primary Key. But if it does not have a unique value you may not be able to retrieve results reliably.
Nota: La 'clave' debe ser un nombre de columna válido de la tabla; no tiene que ser un Índice o una Clave Principal. Pero si no tiene un valor único no puede ser capaz de recuperar los resultados de forma fiable.


=== Miscellaneous Result Set Methods ===
=== Métodos Misceláneos para Grupos de Resultados ===
==== getNumRows() ====
==== getNumRows() ====
<tt>getNumRows()</tt> will return the number of result rows found by the last query and waiting to be read. To get a result from getNumRows() you have to run it '''after''' the query and '''before''' you have retrieved any results.
<tt>getNumRows()</tt> devuelve como resultado el número de filas encontrado por la última consulta SELECT o SHOW y a la espera de ser leído. Para obtener un resultado a partir de ''getNumRows()'' tienes que ejecutarlo '''después''' de la consulta y '''antes''' de obtener algún resultado. Para recuperar el número de filas afectadas por una consulta INSERT, UPDATE, REPLACE o DELETE, usa getAffectedRows().
   
   
<source lang='php'>
<source lang='php'>
Line 503: Line 542:
</source>
</source>


will return <pre>3</pre>
devolverá <pre>3</pre>
Note: if you run getNumRows() after loadRowList() - or any other retrieval method - you may get a PHP Warning:
Nota: getNumRows() sólo es válida para declaraciones como SELECT o SHOW que devuelven un conjunto de resultados reales. Si ejecuta getNumRows() después de loadRowList () o cualquier otro método de recuperación - obtendrás una Advertencia PHP:
<pre>Warning: mysql_num_rows(): 80 is not a valid MySQL result resource  
<pre>Warning: mysql_num_rows(): 80 is not a valid MySQL result resource  
in libraries\joomla\database\database\mysql.php on line 344</pre>
in libraries\joomla\database\database\mysql.php on line 344</pre>
== Sample Module Code ==
Below is the code for a simple Joomla module which you can install and run to demonstrate use of the JDatabase functionality, and which you can adapt to experiment with some of the concepts described above. If you are unsure about development and installing a Joomla module then following the tutorial at [[S:MyLanguage/J3.x:Creating a simple module/Introduction| Creating a simple module ]] will help.
'''Important note: In any Joomla extensions which you develop that you should avoid accessing the core Joomla tables directly like this and should instead use the Joomla APIs if at all possible, because the database structures may change without warning.'''
In a folder mod_db_select create the following 2 files:
<tt>mod_db_select.xml</tt>
<source lang="xml">
<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="site" method="upgrade">
    <name>Database select query demo</name>
    <version>1.0.1</version>
    <description>Code demonstrating use of Joomla Database class to perform SQL SELECT queries</description>
    <files>
        <filename module="mod_db_select">mod_db_select.php</filename>
    </files>
</extension>
</source>
<tt>mod_db_select.php</tt>
<source lang="php">
<?php
defined('_JEXEC') or die('Restricted Access');
use Joomla\CMS\Factory;
$db = Factory::getDbo();
$me = Factory::getUser();
$query = $db->getQuery(true);
$query->select($db->quoteName(array('name', 'email')))
->from($db->quoteName('#__users'))
->where($db->quoteName('id') . ' != ' . $db->quote($me->id))
->order($db->quoteName('name') . ' ASC');
$db->setQuery($query);
echo $db->replacePrefix((string) $query);
$results = $db->loadAssocList();
foreach ($results as $row) {
echo "<p>" . $row['name'] . ", " . $row['email'] . "<br></p>";
}
</source>
The code above selects and outputs the username and email of the records in the Joomla <tt>users</tt> table, apart from those of the currently logged-on user. The method <tt>Factory::getUser()</tt> returns the <tt>user</tt> object of the currently logged-on user, or if not logged on, then a blank <tt>user</tt> object, whose <tt>id</tt> field is set to zero.
The <tt>$db->replacePrefix((string) $query)</tt> expression returns the actual SQL statement, and outputting this can be useful in debugging.
Zip up the mod_db_select directory to create <tt>mod_db_select.zip</tt>.
Within your Joomla administrator go to Install Extensions and via the Upload Package File tab select this zip file to install this sample log module.
Make this module visible by editing it (click on it within the Modules page) then:
# making its status Published
# selecting a position on the page for it to be shown
# on the menu assignment tab specify the pages it should appear on
When you visit a site web page then you should see the module in your selected position, and it should output the SQL SELECT statement and the sequence of name, email values from the Joomla users table.
=== Ver también ===
*[[S:MyLanguage/Inserting, Updating and Removing data using JDatabase|Insertar, Actualizar y Eliminar datos utilizando JDatabase]]
*[[S:MyLanguage/Using the union methods in database queries|Usar los métodos UNION en consultas de base de datos]] (Joomla! 3.3+)
*[https://api.joomla.org/cms-3/classes/JDatabaseQuery.html Joomla CMS 3.8 API]


<noinclude>
<noinclude>
[[Category:Database]]
[[Category:Database{{#translation:}}]]
[[Category:JFactory]]
[[Category:JFactory{{#translation:}}]]
[[Category:Extension development]]
[[Category:Extension development{{#translation:}}]]
[[Category:Development Recommended Reading]]
[[Category:Development Recommended Reading{{#translation:}}]]
[[Category:Tutorials]]
[[Category:Tutorials{{#translation:}}]]
</noinclude>
</noinclude>

Latest revision as of 23:05, 25 February 2021

Joomla! 
3.x
Joomla! 
2.5
Nota de la Versión

Ten en cuenta que muchos ejemplos en línea usan $db->query() en lugar de $db->execute(). Este era el antiguo método en Joomla! 1.5 y 2.5 y lanzará un aviso de obsoleto en Joomla! 3.0 +.

Este tutorial se divide en dos partes independientes:

  • Insertar, actualizar y eliminar datos de la base de datos.
  • Seleccionar datos de una o más tablas y recuperarlos en una variedad de formas diferentes.

Esta sección de la documentación se ve la selección de datos de una tabla de base de datos y como recuperarlos en una variedad de formatos. Para ver la otra parte has clic aquí

Introducción

Joomla! ofrece una sofisticada capa de abstracción de la base de datos para simplificar su uso por parte de los desarrolladores de terceras partes. Las nuevas versiones de la Plataforma API de Joomla! proporciona funcionalidades adicionales que extiende la capa de base de datos; que incluye características tales como conectores para una mayor variedad de servidores de base de datos y la consulta encadenada. para mejorar la legibilidad del código de conexión y simplificar el código SQL.

Joomla puede utilizar diferentes tipos de sistemas de base de datos SQL y ejecutar una variedad de entornos con diferentes prefijos de las tablas. Además de estas funciones, la clase crea automáticamente la conexión a base de datos. Además de crear una instancia del objeto, necesitas sólo dos líneas de código para obtener un resultado de la base de datos, en una variedad de formatos. El uso de la capa de base de datos de Joomla! asegura una máxima compatibilidad y flexibilidad para tu extensión.

La Consulta

Las consultas a las base de datos de Joomla! a cambiado con la introducción de Joomla! 1.6. La forma recomendada de la construcción de consultas de base de datos es a través de la consulta "encadenada" (aunque la cadena de consultas aún son compatibles).

Consulta encadenada se refiere a un método de conexión de un número de métodos, uno tras otro, con cada método devolviendo un objeto que puede soportar el método siguiente, se mejora la legibilidad y la simplificación de código.

Para obtener una nueva instancia de la clase JDatabaseQuery utilizamos el método getQuery de JDatabaseDriver  :

$db = JFactory::getDbo();

$query = $db->getQuery(true);

JDatabaseDriver::getQuery toma un argumento opcional, $new, que puede ser true o false (el valor predeterminado es false).

La consulta a nuestra base de datos puede llamar a un número de métodos JDatabaseQuery; estos métodos encapsulan el lenguaje de consulta de la fuente de datos (en la mayoría de los casos SQL), ocultando la sintaxis específica de la consulta al desarrollador y aumentando la portabilidad de los código fuente del desarrollador.

Algunos de los métodos utilizados con más frecuencia incluyen: select, from, join, where y order. También hay métodos tales como insert, update y delete para la modificación de registros en la base de datos. Por el encadenamiento de estos y otros métodos de llamada, puedes crear casi cualquier consulta sobre tu base de datos sin comprometer la portabilidad del código..

Seleccionar Registros de una Sola Tabla

A continuación hay un ejemplo de creación de una consulta de base de datos utilizando la clase JDatabaseQuery. Con el uso de los métodos select, from, where y order, se pueden crear consultas, flexibles, fácilmente legibles y portables:

// Get a db connection.
$db = JFactory::getDbo();

// Create a new query object.
$query = $db->getQuery(true);

// Select all records from the user profile table where key begins with "custom.".
// Order it by the ordering field.
$query->select($db->quoteName(array('user_id', 'profile_key', 'profile_value', 'ordering')));
$query->from($db->quoteName('#__user_profiles'));
$query->where($db->quoteName('profile_key') . ' LIKE ' . $db->quote('custom.%'));
$query->order('ordering ASC');

// Reset the query using our newly populated query object.
$db->setQuery($query);

// Load the results as a list of stdClass objects (see later for more options on retrieving data).
$results = $db->loadObjectList();

(Here the quoteName() function adds appropriate quotes around the column names to avoid conflicts with any database reserved word, now or in the future.)

La consulta también puede ser encadenada para simplificar aún más:

$query
    ->select($db->quoteName(array('user_id', 'profile_key', 'profile_value', 'ordering')))
    ->from($db->quoteName('#__user_profiles'))
    ->where($db->quoteName('profile_key') . ' LIKE ' . $db->quote('custom.%'))
    ->order('ordering ASC');

El método de llamadas encadenadas, mejora la legibilidad del código y reduce el exceso de código a medida que las consultas se vuelven más largas y complejas.

La agrupación se puede lograr muy simplemente. La siguiente consulta sería para contar el número de artículos en cada categoría.

$query
    ->select(array('catid', 'COUNT(*)'))
    ->from($db->quoteName('#__content'))
    ->group($db->quoteName('catid'));

Un límite se puede ajustar a una consulta con "setLimit". Por ejemplo, en la siguiente consulta, se devolverían hasta 10 registros.

$query
    ->select($db->quoteName(array('user_id', 'profile_key', 'profile_value', 'ordering')))
    ->from($db->quoteName('#__user_profiles'))
    ->setLimit('10');


Seleccionar Registros de Varias Tablas

Con el uso de los métodos join de JDatabaseQuery, se pueden seleccionar los registros de varias tablas relacionadas. El método genérico "join" toma dos argumentos; "tipo" de unión (inner, outer, left, right) y la condición de unión. En el siguiente ejemplo se da cuenta de como podemos usar todas las palabras clave que queremos utilizar normalmente si estamos escribiendo una consulta SQL nativa, incluyendo la palabra clave AS para asignar un alias a las tablas y la palabra clave ON para la creación de relaciones entre tablas. También ten en cuenta que la tabla de alias se utiliza en todos los métodos que hacen referencia a columnas de la tabla (Por ej.: select, where, order).

// Get a db connection.
$db = JFactory::getDbo();

// Create a new query object.
$query = $db->getQuery(true);

// Select all articles for users who have a username which starts with 'a'.
// Order it by the created date.
// Note by putting 'a' as a second parameter will generate `#__content` AS `a`
$query
    ->select(array('a.*', 'b.username', 'b.name'))
    ->from($db->quoteName('#__content', 'a'))
    ->join('INNER', $db->quoteName('#__users', 'b') . ' ON ' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id'))
    ->where($db->quoteName('b.username') . ' LIKE ' . $db->quote('a%'))
    ->order($db->quoteName('a.created') . ' DESC');

// Reset the query using our newly populated query object.
$db->setQuery($query);

// Load the results as a list of stdClass objects (see later for more options on retrieving data).
$results = $db->loadObjectList();

El método join anterior nos permite consultar las tablas user y content, la recuperación de los artículos con detalles del autor. También hay métodos de conveniencia para las uniones:

Podemos utilizar varias combinaciones consultar a través de más de dos tablas:

$query
    ->select(array('a.*', 'b.username', 'b.name', 'c.*', 'd.*'))
    ->from($db->quoteName('#__content', 'a'))
    ->join('INNER', $db->quoteName('#__users', 'b') . ' ON ' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id'))
    ->join('LEFT', $db->quoteName('#__user_profiles', 'c') . ' ON ' . $db->quoteName('b.id') . ' = ' . $db->quoteName('c.user_id'))
    ->join('RIGHT', $db->quoteName('#__categories', 'd') . ' ON ' . $db->quoteName('a.catid') . ' = ' . $db->quoteName('d.id'))
    ->where($db->quoteName('b.username') . ' LIKE ' . $db->quote('a%'))
    ->order($db->quoteName('a.created') . ' DESC');

Observa cómo el encadenamiento hace que el código fuente sea mucho más legible para estas consultas más largas.

En algunos casos, también tendrás que utilizar la cláusula AS, a la hora de seleccionar los elementos para evitar conflictos entre los nombres de las columnas. En este caso, de selección múltiple, las declaraciones pueden ser encadenadas en conjunción con el segundo parámetro de $db->quoteName.

$query
    ->select('a.*')
    ->select($db->quoteName('b.username', 'username'))
    ->select($db->quoteName('b.name', 'name'))
    ->from($db->quoteName('#__content', 'a'))
    ->join('INNER', $db->quoteName('#__users', 'b') . ' ON ' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id'))
    ->where($db->quoteName('b.username') . ' LIKE ' . $db->quote('a%'))
    ->order($db->quoteName('a.created') . ' DESC');

Un segundo array también puede ser utilizado como el segundo parámetro de la instrucción select para rellenar los valores de la cláusula AS. Recuerda incluir nulls en el segundo array que correspondan a las columnas en el primer array y para los que no deseas utilizar la cláusula AS:

$query
    ->select(array('a.*'))
    ->select($db->quoteName(array('b.username', 'b.name'), array('username', 'name')))
    ->from($db->quoteName('#__content', 'a'))
    ->join('INNER', $db->quoteName('#__users', 'b') . ' ON ' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id'))
    ->where($db->quoteName('b.username') . ' LIKE ' . $db->quote('a%'))
    ->order($db->quoteName('a.created') . ' DESC');

Using OR in queries

When using multiple WHERE clauses in your query, they will be treated as an AND.

So, for example, the query below will return results where the 'name' field AND the 'state' field match.

$query = $db
    ->getQuery(true)
    ->select('COUNT(*)')
    ->from($db->quoteName('#__my_table'))
    ->where($db->quoteName('name') . " = " . $db->quote($value)
    ->where($db->quoteName('state') . " = " . $db->quote($state));

To use a WHERE clause as an OR, the query can be written like this

$query = $db
    ->getQuery(true)
    ->select('COUNT(*)')
    ->from($db->quoteName('#__my_table'))
    ->where($db->quoteName('name') . " = " . $db->quote($name_one), 'OR')
    ->where($db->quoteName('name') . " = " . $db->quote($name_two));

it can also be written like this

$query = $db
    ->getQuery(true)
    ->select('COUNT(*)')
    ->from($db->quoteName('#__my_table'))
    ->where($db->quoteName('name') . " = " . $db->quote($name_one)
    ->orWhere($db->quoteName('name') . " = " . $db->quote($name_two));

Resultados de la Consulta

La clase database contiene muchos métodos para trabajar con el conjunto de resultados de al consulta.

If there are no matches to the query, the result will be null.

Resultado de Valor Único

loadResult()

Se utiliza loadResult() cuando se espera un solo valor como resultado de la consulta de base de datos.

id nombre correo electrónico nombre de usuario
1 John Smith johnsmith@domain.example johnsmith
2 Magda Hellman magda_h@domain.example magdah
3 Yvonne de Gaulle ydg@domain.example ydegaulle

Esto es a menudo el resultado de una consulta 'count' para obtener un número de registros:

$db = JFactory::getDbo();
$query = $db
    ->getQuery(true)
    ->select('COUNT(*)')
    ->from($db->quoteName('#__my_table'))
    ->where($db->quoteName('name') . " = " . $db->quote($value));

// Reset the query using our newly populated query object.
$db->setQuery($query);
$count = $db->loadResult();

o cuando estás buscando un único campo de una sola fila de la tabla (o posiblemente un único campo de la primera fila devuelta).

$db = JFactory::getDbo();
$query = $db
    ->getQuery(true)
    ->select('field_name')
    ->from($db->quoteName('#__my_table'))
    ->where($db->quoteName('some_name') . " = " . $db->quote($some_value));

$db->setQuery($query);
$result = $db->loadResult();

Resultado de una Sola Fila

Cada una de estas funciones devuelve el resultados de un único registro de la base de datos, aunque puede haber varios registros que cumplan los criterios que se hayan establecido. Para obtener más registros de lo que necesitas llamar a la función nuevamente.

id nombre correo electrónico nombre de usuario
1 John Smith johnsmith@domain.example johnsmith
2 Magda Hellman magda_h@domain.example magdah
3 Yvonne de Gaulle ydg@domain.example ydegaulle

loadRow()

loadRow() devuelve un array indexado a partir de un único registro de la tabla:

. . .
$db->setQuery($query);
$row = $db->loadRow();
print_r($row);

se tendrá:

Array ( [0] => 1, [1] => John Smith, [2] => johnsmith@domain.example, [3] => johnsmith ) 

Puedes acceder a los valores individuales mediante el uso de:

$row['index'] // e.g. $row['2']

Notas:

  1. Los índices del array son numéricos a partir de cero.
  2. Si bien puedes repetir la llamada para obtener más filas, una de las funciones que devuelve varias filas puede ser más útil.

loadAssoc()

loadAssoc() devuelve un array asociativo a partir de un único registro de la tabla:

. . .
$db->setQuery($query);
$row = $db->loadAssoc();
print_r($row);

se tendrá:

Array ( [id] => 1, [name] => John Smith, [email] => johnsmith@domain.example, [username] => johnsmith )

Puedes acceder a los valores individuales mediante el uso de:

$row['name'] // e.g. $row['email']
  1. Si bien puedes repetir la llamada para obtener más filas, una de las funciones que devuelve varias filas puede ser más útil.

loadObject()

loadObject devuelve un objeto PHP a partir de un único registro de la tabla:

. . .
$db->setQuery($query);
$result = $db->loadObject();
print_r($result);

se tendrá:

stdClass Object ( [id] => 1, [name] => John Smith, [email] => johnsmith@domain.example, [username] => johnsmith )

Puedes acceder a los valores individuales mediante el uso de:

$result->index // e.g. $result->email

Notas:

  1. Si bien puedes repetir la llamada para obtener más filas, una de las funciones que devuelve varias filas puede ser más útil.

Resultado de una Sola Columna

Cada una de estas funciones devolverá resultados de una sola columna de la base de datos.

id nombre correo electrónico nombre de usuario
1 John Smith johnsmith@domain.example johnsmith
2 Magda Hellman magda_h@domain.example magdah
3 Yvonne de Gaulle ydg@domain.example ydegaulle

loadColumn()

loadColumn() devuelve un array indexado a partir de una única columna de la tabla:

$query->select('name'));
      ->from . . .";
. . .
$db->setQuery($query);
$column= $db->loadColumn();
print_r($column);

se tendrá:

Array ( [0] => John Smith, [1] => Magda Hellman, [2] => Yvonne de Gaulle )

Puedes acceder a los valores individuales mediante el uso de:

$column['index'] // e.g. $column['2']

Notas:

  1. Los índices del array son numéricos a partir de cero.
  2. loadColumn() es equivalente a loadColumn(0).

loadColumn($index)

loadColumn($index) devuelve un array indexado a partir de una única columna de la tabla:

$query->select(array('name', 'email', 'username'));
      ->from . . .";
. . .
$db->setQuery($query);
$column= $db->loadColumn(1);
print_r($column);

se tendrá:

Array ( [0] => johnsmith@domain.example, [1] => magda_h@domain.example, [2] => ydg@domain.example )

Puedes acceder a los valores individuales mediante el uso de:

$column['index'] // e.g. $column['2']

loadColumn($index) permite iterar a través de una serie de columnas en los resultados

. . .
$db->setQuery($query);
for ( $i = 0; $i <= 2; $i++ ) {
  $column= $db->loadColumn($i);
  print_r($column);
}

se tendrá:

Array ( [0] => John Smith, [1] => Magda Hellman, [2] => Yvonne de Gaulle ),
Array ( [0] => johnsmith@domain.example, [1] => magda_h@domain.example, [2] => ydg@domain.example ),
Array ( [0] => johnsmith, [1] => magdah, [2] => ydegaulle )

Notas:

  1. Los índices del array son numéricos a partir de cero.

Resultados de filas Múltiples

Cada una de estas funciones devolverá resultados de varios registros de la base de datos.

id nombre correo electrónico nombre de usuario
1 John Smith johnsmith@domain.example johnsmith
2 Magda Hellman magda_h@domain.example magdah
3 Yvonne de Gaulle ydg@domain.example ydegaulle

loadRowList()

loadRowList() devuelve un array indexado de arrays indexados con los registros de la tabla de devueltos por la consulta:

. . .
$db->setQuery($query);
$row = $db->loadRowList();
print_r($row);

va a dar (con saltos de línea añadido para mayor claridad):

Array ( 
[0] => Array ( [0] => 1, [1] => John Smith, [2] => johnsmith@domain.example, [3] => johnsmith ), 
[1] => Array ( [0] => 2, [1] => Magda Hellman, [2] => magda_h@domain.example, [3] => magdah ), 
[2] => Array ( [0] => 3, [1] => Yvonne de Gaulle, [2] => ydg@domain.example, [3] => ydegaulle ) 
)

Puedes acceder a las filas individuales mediante el uso de:

$row['index'] // e.g. $row['2']

y puedes acceder a los valores individuales mediante el uso de:

$row['index']['index'] // e.g. $row['2']['3']

Notas:

  1. Los índices del array son numéricos a partir de cero.

loadAssocList()

loadAssocList() devuelve un array indexado de arrays asociativo con los registros de la tabla de devueltos por la consulta:

. . .
$db->setQuery($query);
$row = $db->loadAssocList();
print_r($row);

va a dar (con saltos de línea añadido para mayor claridad):

Array ( 
[0] => Array ( [id] => 1, [name] => John Smith, [email] => johnsmith@domain.example, [username] => johnsmith ), 
[1] => Array ( [id] => 2, [name] => Magda Hellman, [email] => magda_h@domain.example, [username] => magdah ), 
[2] => Array ( [id] => 3, [name] => Yvonne de Gaulle, [email] => ydg@domain.example, [username] => ydegaulle ) 
) 

Puedes acceder a las filas individuales mediante el uso de:

$row['index'] // e.g. $row['2']

y puedes acceder a los valores individuales mediante el uso de:

$row['index']['column_name'] // e.g. $row['2']['email']

loadAssocList($clave)

loadAssocList('clave') devuelve un array asociativo - indexado por 'clave' - de array asociativos a partir de los registros de la tabla devueltos por la consulta:

. . .
$db->setQuery($query);
$row = $db->loadAssocList('username');
print_r($row);

va a dar (con saltos de línea añadido para mayor claridad):

Array ( 
[johnsmith] => Array ( [id] => 1, [name] => John Smith, [email] => johnsmith@domain.example, [username] => johnsmith ), 
[magdah] => Array ( [id] => 2, [name] => Magda Hellman, [email] => magda_h@domain.example, [username] => magdah ), 
[ydegaulle] => Array ( [id] => 3, [name] => Yvonne de Gaulle, [email] => ydg@domain.example, [username] => ydegaulle ) 
)

Puedes acceder a las filas individuales mediante el uso de:

$row['key_value'] // e.g. $row['johnsmith']

y puedes acceder a los valores individuales mediante el uso de:

$row['key_value']['column_name'] // e.g. $row['johnsmith']['email']

Nota: La 'clave' debe ser un nombre de columna válido de la tabla; no tiene que ser un Índice o una Clave Principal. Pero si no tiene un valor único no puede ser capaz de recuperar los resultados de forma fiable.

loadAssocList($clave, $columna)

loadAssocList('clave', 'columna') devuelve un array asociativo, indexado por 'clave', de los valores de la columna llamada 'columna' devueltos por la consulta:

. . .
$db->setQuery($query);
$row = $db->loadAssocList('id', 'username');
print_r($row);

va a dar (con saltos de línea añadido para mayor claridad):

Array ( 
[1] => John Smith, 
[2] => Magda Hellman, 
[3] => Yvonne de Gaulle,
)

Nota: La 'clave' debe ser un nombre de columna válido de la tabla; no tiene que ser un Índice o una Clave Principal. Pero si no tiene un valor único no puede ser capaz de recuperar los resultados de forma fiable.

loadObjectList()

loadObjectList() devuelve un array indexado de objetos PHP a partir de los registros de la tabla devueltos por la consulta:

. . .
$db->setQuery($query);
$row = $db->loadObjectList();
print_r($row);

va a dar (con saltos de línea añadido para mayor claridad):

Array ( 
[0] => stdClass Object ( [id] => 1, [name] => John Smith, 
    [email] => johnsmith@domain.example, [username] => johnsmith ), 
[1] => stdClass Object ( [id] => 2, [name] => Magda Hellman, 
    [email] => magda_h@domain.example, [username] => magdah ), 
[2] => stdClass Object ( [id] => 3, [name] => Yvonne de Gaulle, 
    [email] => ydg@domain.example, [username] => ydegaulle ) 
)

Puedes acceder a las filas individuales mediante el uso de:

$row['index'] // e.g. $row['2']

y puedes acceder a los valores individuales mediante el uso de:

$row['index']->name // e.g. $row['2']->email

loadObjectList($clave)

loadObjectList($clave) devuelve un array asociativo - indexado por 'clave', de objetos de los registros de la tabla devueltos por la consulta:

. . .
$db->setQuery($query);
$row = $db->loadObjectList('username');
print_r($row);

va a dar (con saltos de línea añadido para mayor claridad):

Array ( 
[johnsmith] => stdClass Object ( [id] => 1, [name] => John Smith, 
    [email] => johnsmith@domain.example, [username] => johnsmith ), 
[magdah] => stdClass Object ( [id] => 2, [name] => Magda Hellman, 
    [email] => magda_h@domain.example, [username] => magdah ), 
[ydegaulle] => stdClass Object ( [id] => 3, [name] => Yvonne de Gaulle, 
    [email] => ydg@domain.example, [username] => ydegaulle ) 
)

Puedes acceder a las filas individuales mediante el uso de:

$row['key_value'] // e.g. $row['johnsmith']

y puedes acceder a los valores individuales mediante el uso de:

$row['key_value']->column_name // e.g. $row['johnsmith']->email

Nota: La 'clave' debe ser un nombre de columna válido de la tabla; no tiene que ser un Índice o una Clave Principal. Pero si no tiene un valor único no puede ser capaz de recuperar los resultados de forma fiable.

Métodos Misceláneos para Grupos de Resultados

getNumRows()

getNumRows() devuelve como resultado el número de filas encontrado por la última consulta SELECT o SHOW y a la espera de ser leído. Para obtener un resultado a partir de getNumRows() tienes que ejecutarlo después de la consulta y antes de obtener algún resultado. Para recuperar el número de filas afectadas por una consulta INSERT, UPDATE, REPLACE o DELETE, usa getAffectedRows().

. . .
$db->setQuery($query);
$db->execute();
$num_rows = $db->getNumRows();
print_r($num_rows);
$result = $db->loadRowList();

devolverá

3

Nota: getNumRows() sólo es válida para declaraciones como SELECT o SHOW que devuelven un conjunto de resultados reales. Si ejecuta getNumRows() después de loadRowList () o cualquier otro método de recuperación - obtendrás una Advertencia PHP:

Warning: mysql_num_rows(): 80 is not a valid MySQL result resource 
in libraries\joomla\database\database\mysql.php on line 344

Sample Module Code

Below is the code for a simple Joomla module which you can install and run to demonstrate use of the JDatabase functionality, and which you can adapt to experiment with some of the concepts described above. If you are unsure about development and installing a Joomla module then following the tutorial at Creating a simple module will help.

Important note: In any Joomla extensions which you develop that you should avoid accessing the core Joomla tables directly like this and should instead use the Joomla APIs if at all possible, because the database structures may change without warning.

In a folder mod_db_select create the following 2 files:

mod_db_select.xml

<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="site" method="upgrade">
    <name>Database select query demo</name>
    <version>1.0.1</version>
    <description>Code demonstrating use of Joomla Database class to perform SQL SELECT queries</description>
    <files>
        <filename module="mod_db_select">mod_db_select.php</filename>
    </files>
</extension>

mod_db_select.php

<?php
defined('_JEXEC') or die('Restricted Access');

use Joomla\CMS\Factory;

$db = Factory::getDbo();

$me = Factory::getUser();

$query = $db->getQuery(true);

$query->select($db->quoteName(array('name', 'email')))
	->from($db->quoteName('#__users'))
	->where($db->quoteName('id') . ' != ' . $db->quote($me->id))
	->order($db->quoteName('name') . ' ASC');

$db->setQuery($query);

echo $db->replacePrefix((string) $query);

$results = $db->loadAssocList();

foreach ($results as $row) {
	echo "<p>" . $row['name'] . ", " . $row['email'] . "<br></p>";
}

The code above selects and outputs the username and email of the records in the Joomla users table, apart from those of the currently logged-on user. The method Factory::getUser() returns the user object of the currently logged-on user, or if not logged on, then a blank user object, whose id field is set to zero.

The $db->replacePrefix((string) $query) expression returns the actual SQL statement, and outputting this can be useful in debugging.

Zip up the mod_db_select directory to create mod_db_select.zip.

Within your Joomla administrator go to Install Extensions and via the Upload Package File tab select this zip file to install this sample log module.

Make this module visible by editing it (click on it within the Modules page) then:

  1. making its status Published
  2. selecting a position on the page for it to be shown
  3. on the menu assignment tab specify the pages it should appear on

When you visit a site web page then you should see the module in your selected position, and it should output the SQL SELECT statement and the sequence of name, email values from the Joomla users table.

Ver también