Het selecteren van gegevens met behulp van JDatabase

From Joomla! Documentation

This page is a translated version of the page Selecting data using JDatabase and the translation is 96% complete.
Other languages:
English • ‎Nederlands • ‎español • ‎français • ‎русский • ‎中文(中国大陆)‎ • ‎中文(台灣)‎
Joomla! 
3.x
Joomla! 
2.5
Versie opmerking

Let op dat veel online voorbeelden $db->query() gebruiken in plaats van $db->execute(). Dit was de oude methode in Joomla 1.5 en 2.5 en zal deprecated (verouderd) berichten geven in Joomla 3.0+.

Deze handleiding is opgesplitst in twee aparte delen:

  • Invoegen, bijwerken en verwijderen van gegevens in de database.
  • Selecteren van gegevens uit één of meer tabellen en het ophalen op diverse verschillende formaten.

Dit gedeelte van de documentatie kijkt naar het selecteren van gegevens uit een database tabel en het ophalen in verschillende formaten. Klik hier voor om het andere deel te lezen.

Inleiding

Joomla biedt een geavanceerde database abstractie laag om het gebruik door externe ontwikkelaars te vereenvoudigen. Nieuwe versies van de Joomla Platform API bieden extra functionaliteit welke de database laag verder uitbreidt en bevat functies zoals koppelingen naar een groot aantal database servers en de query-koppeling om de leesbaarheid te vergroten van verbindingscode an het vereenvoudigen van het coderen van SQL.

Joomla kan verschillende soorten SQL database systemen gebruiken en draaien op diverse omgevingen met verschillende tabel-voorvoegsels. Naast deze functies maakt de class automatisch de database verbinding aan. Naast het instantiëren van het object heeft u slechts twee regels code nodig om het resultaat uit de database te krijgen in een verscheidenheid aan formaten. Het gebruik van de Joomla database laag garandeert een maximum aan compatibiliteit en flexibiliteit voor uw extensie.

De query

Joomla's database querying veranderd met de introductie van Joomla 1.6. De aanbevolen manier van het bouwen van database queries is met behulp van "query chaining" (hoewel string queries nog wel worden ondersteund).

Query chaining verwijst naar de methode van koppelen van een aantal methodes, de één na de ander waarbij ieder methode een object terug geeft die de volgende methode kan ondersteunen, waardoor de leesbaarheid verbeterd wordt en de code vereenvoudigd.

Om een nieuwe instantie van de JDatabaseQuery class te verkrijgen gebruiken we de JDatabaseDriver getQuery methode:

$db = JFactory::getDbo();

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

De JDatabaseDriver::getQuery neemt een optioneel argument, $new, welke 'waar' of 'niet waar' kunnen zijn (de standaard is 'niet waar').

Om onze data source te bevragen kunnen we een aantal JDatabaseQuery methodes aanroepen; deze methodes kapselen de gegevens source's query-taal (in de meeste gevallen SQL) in, verbergen query-specifieke syntaxis voor de ontwikkelaar en verhogen de overdraagbaarheid van de broncode van de ontwikkelaar.

Enkele van de meest gebruikte methodes omvatten; select, from, join, where en order. Er zijn ook methodes zoals insert, update en delete voor het wijzigen van de gegevensopslag. Door het koppelen van deze en andere methodes aanroepen, kunt u bijna iedere query maken ten opzichte van uw database zonder afbreuk te doen aan de overdraagbaarheid van uw code..

Selecteren van gegevens uit een enkele tabel

Hieronder staat een voorbeeld hoe je een database query aanmaakt met behulp van de JDatabaseQuery klasse. Met gebruik van de select, from, where en order methodes, kunnen we queries maken die flexibel, makkelijke leesbaar en draagbaar zijn.

// 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.)

De query kan ook geschakeld worden om het volgende te vereenvoudigen:

$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');

Chaining kan handig zijn wanneer queries langer en complex worden.

Groeperen werkt ook simpel. De volgende query telt het aantal artikelen in iedere categorie.

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

Een limiet kan worden ingesteld op een query met behulp van "setLimit". Bijvoorbeeld in de volgende query, die zou teruggebracht worden naar 10 records.

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


Selecteren van gegevens uit meerdere tabellen

Met behulp van de JDatabaseQuery's join methodes, kunnen we gegevens selecteren van meerdere gerelateerde tabellen. De algemene "join" methode heeft twee argumenten; het join "type" (binnen, buiten, links, rechts) en de join voorwaarden. In het volgende voorbeeld zul je merken dat we alle zoekwoorden kunnen gebruiken die we normaal gesproken gebruiken als we een SQL query zouden schrijven, inclusief het 'Als' zoekwoord voor alias tabellen en het 'Aan' zoekwoord om relaties tussen de tabellen te maken. Let op dat de tabel alias wordt gebruikt in alle methodes die verwijzen naar tabel kolommen (I.e. 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();

De join methode hierboven stelt ons in staat om zowel op inhoud als gebruikerstabellen te doorzoeken, artikelen ophalend met de autheur details. Er zijn ook gemakkelijke methodes voor joins:

We kunnen meerdere joins gebruiken voor een query van meer dan twee tabellen:

$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');

Let op hoe chaining de broncode veel leesbaarder maakt voor deze langere query's.

Soms, heb je ook de 'als' clausule nodig als je items selecteert om conflicten met kolomnamen te vermijden. In dit geval, kunnen meerdere select-punten worden ge-chained in combinatie met het gebruik van de tweede parameter van $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');

Een tweede reeks kan ook gebruikt worden als de tweede parameter van de select punten om de waarden te vullen van de 'als' clausule. Vergeet niet om de nullen toe te voegen in de tweede reeks om te verwijzen naar kolommen in de eerste reeks waar je de 'als' clausule niet voor wilt gebruiken.

$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));

De resultaten van de query

De database klasse bevat vele methodes voor het werken met een query resultaat.

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

Enkele waarde resultaat

loadResult ()

Gebruik loadResult() als je verwacht dat het resultaat een enkele waarde is vanuit de database query.

id naam email gebruikersnaam
1 John Smith johnsmith@domein.voorbeeld johnsmith
2 Magda Hellman magda_h@domein.voorbeeld magdah
3 Yvonne de Gaulle ydg@domein.voorbeeld ydegaulle

Dit is vaak het resultaat van een 'getelde' query om een aantal gegevens te krijgen:

$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();

of waar je gewoon een enkel veld zoekt van een rij in de tabel (of mogelijk een enkel veld van de eerste rij weergeven).

$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();

Enkele rij resultaten

Elk van deze resultaten functies geven een enkel gegeven uit de database, ook al komen er meerdere overeen met de ingestelde criteria. Om meer gegevens te krijgen zul je de functie nog eens moeten gebruiken.

id naam email gebruikersnaam
1 John Smith johnsmith@domein.voorbeeld johnsmith
2 Magda Hellman magda_h@domein.voorbeeld magdah
3 Yvonne de Gaulle ydg@domein.voorbeeld ydegaulle

loadRow()

loadRow() geeft een geïndexeerde reeks van een enkel record in de tabel:

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

geeft:

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

Je kunt toegang krijgen tot de individuele waarden met behulp van:

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

Opmerkingen:

  1. De reeks index is numeriek vanaf nul.
  2. Terwijl je de oproep voor de volgende rijen kunt herhalen, is een van de functies die meerdere rijen weergeeft nuttiger.

loadAssoc()

loadAssoc() geeft een geïndexeerde reeks van een enkel record in de tabel:

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

geeft:

Array ( [id] => 1, [naam] => John Smith, [email] => johnsmith@domein.voorbeeld, [gebruikersnaam] => johnsmith )

Je kunt toegang krijgen tot de individuele waarden met behulp van:

$row['name'] // e.g. $row['email']

Opmerkingen:

  1. Terwijl je de oproep voor de volgende rijen kunt herhalen, is een van de functies die meerdere rijen weergeeft nuttiger.

loadObject()

loadObject herhaalt een PHP object van één record in de tabel:

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

geeft:

stdClass Object ( [id] => 1, [naam] => John Smith, [email] => johnsmith@domein.voorbeeld, [gebruikersnaam] => johnsmith )

Je kunt toegang krijgen tot de individuele waarden met behulp van:

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

Opmerkingen:

  1. Terwijl je de oproep voor de volgende rijen kunt herhalen, is een van de functies die meerdere rijen weergeeft nuttiger.

Enkele kolom resultaten

Elk van deze resultaten functies geeft een enkele kolom weer vanuit de database.

id naam email gebruikersnaam
1 John Smith johnsmith@domein.voorbeeld johnsmith
2 Magda Hellman magda_h@domein.voorbeeld magdah
3 Yvonne de Gaulle ydg@domein.voorbeeld ydegaulle

loadColumn()

loadColumn() geeft een geïndexeerde reeks van een enkele kolom in de tabel:

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

geeft:

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

Je kunt toegang krijgen tot de individuele waarden met behulp van:

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

Opmerkingen:

  1. De reeks index is numeriek vanaf nul.
  2. loadColumn() is gelijk aan loadColumn(0).

loadColumn($index)

loadColumn($index) geeft een geïndexeerde reeks vanuit een enkele kolom in de tabel:

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

geeft:

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

Je kunt toegang krijgen tot de individuele waarden met behulp van:

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

loadColumn($index) laat je door een serie van kolommen in de resultaten herhalen.

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

geeft:

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 )

Opmerkingen:

  1. De reeks index is numeriek vanaf nul.

Meerdere rijen resultaten

Elk van deze resultaten functies geeft een meerdere records weer vanuit de database.

id naam email gebruikersnaam
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() geeft een geïndexeerde reeks van geïndexeerde reeksen uit de tabel records gegeven door de query:

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

geeft (met regeleinden toegevoegd voor de duidelijkheid):

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 ) 
)

Je kunt toegang krijgen tot de individuele rijen met behulp van:

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

en je kunt toegang krijgen tot de individuele waarden met behulp van:

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

Opmerkingen:

  1. De reeks index is numeriek vanaf nul.

loadAssocList()

loadAssocList() geeft een geïndexeerde reeks van verwante reeksen vanuit de records uit de tabel door de query:

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

geeft (met regeleinden toegevoegd voor de duidelijkheid):

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 ) 
) 

Je kunt toegang krijgen tot de individuele rijen met behulp van:

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

en je kunt toegang krijgen tot de individuele waarden met behulp van:

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

loadAssocList($key)

loadAssocList('key') geeft een bijbehorende reeks - geïndexeerd op 'key' - van de bijbehorende reeksen van de tabel gegevens door de query:

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

geeft (met regeleinden toegevoegd voor de duidelijkheid):

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 ) 
)

Je kunt toegang krijgen tot de individuele rijen met behulp van:

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

en je kunt toegang krijgen tot de individuele waarden met behulp van:

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

Opmerking: Key moet een geldige kolomnaam uit de tabel zijn; dit hoeft geen index of primaire key te zijn. Maar als het geen unieke waarde heeft ben je niet in staat om de resultaten betrouwbaar op te halen.

loadAssocList($key, $column)

loadAssocList('key', 'column') geeft een associatieve reeks, geïndexeerd op 'key', van de waarden uit de kolomnaam 'kolom', gegeven door de query:

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

geeft (met regeleinden toegevoegd voor de duidelijkheid):

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

Opmerking: Key moet een geldige kolomnaam uit de tabel zijn; dit hoeft geen index of primaire key te zijn. Maar als het geen unieke waarde heeft ben je niet in staat om de resultaten betrouwbaar op te halen.

loadObjectList()

loadObjectList() geeft een geïndexeerde reeks van PHP objecten uit de tabel records gegeven door de query:

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

geeft (met regeleinden toegevoegd voor de duidelijkheid):

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 ) 
)

Je kunt toegang krijgen tot de individuele rijen met behulp van:

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

en je kunt toegang krijgen tot de individuele waarden met behulp van:

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

loadObjectList($key)

loadObjectList('key') geeft een bijbehorende reeks - geïndexeerd op 'key' - van objecten uit de tabel gegeven door de query:

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

geeft (met regeleinden toegevoegd voor de duidelijkheid):

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 ) 
)

Je kunt toegang krijgen tot de individuele rijen met behulp van:

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

en je kunt toegang krijgen tot de individuele waarden met behulp van:

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

Opmerking: Key moet een geldige kolomnaam uit de tabel zijn; dit hoeft geen index of primaire key te zijn. Maar als het geen unieke waarde heeft ben je niet in staat om de resultaten betrouwbaar op te halen.

Diverse resultaten instel methoden

getNumRows()

getNumRows() geeft een aantal rijen als resultaat gevonden met SELECTEER of TOON query en wacht om gelezen te worden. Om een resultaat te krijgen vanuit getNumRows() moet je deze uitvoeren na de query en voor je de reultaten kunt ophalen. Bij het achterhalen van de rijen beïnvloed door een INSERT, UPDATE, REPLACE or DELETE query, gebruik dan getAffectedRows().

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

geeft

3

Opmerking: getNumRows() is alleen geldig voor opgaven als SELECTEER of TOON die een werkelijk resultaat toont. Als je getNumRows() uitvoerd na loadRowList() - of een andere ophaalmethode - krijg je een PHP waarschuwing:

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.

Zie ook