The sql_select() function selects content form the database and returns an SQL resource when successful or false in the event of an error.

It accepts up to 9 parameters, the first 2 being mandatory, and sequenced in the same descriptive order as a standard SQL query. Each parameter will (preferably) accept an array as input data, but will also accept character strings with elements separated by commas:

  1. $select,
  2. $from,
  3. $where,
  4. $groupby,
  5. $orderby,
  6. $limit,
  7. $having,
  8. $serveur,
  9. $option.

The sql_select() function is often coupled with an sql_fetch(), such as shown here below:

// selection
if ($resultats = sql_select('column', 'table')) {
	// loop on the results
	while ($res = sql_fetch($resultats)) {
		// use the results
		// $res['column']

The $select and $from parameters accept the declaration of aliases. This offers the following type of construction:

if ($r = sql_select(
		'a.column AS colA',
		'b.column AS colB',
		'SUM(b.number) AS btotal'
		'tableA AS a',
		'tableB AS b'
	))) {
	while ($ligne = sql_fetch($r)) {
		// we now have access to:
		// $ligne['colA']  $ligne['colB']  $ligne['btotal']  


Select the root sections (id_parent=0) in the "spip_rubriques" table sorted by rank [1], then in alphanumeric order, and request all of the columns (total selection with ’*’) :

$result = sql_select('*', "spip_rubriques", "id_parent=0", '', '0+titre,titre');
while ($row = sql_fetch($result)){
	$id_rubrique = $row['id_rubrique'];
	// ...

Select cats but not dogs (in the title) for articles in sector 3:

$champs = array('titre', 'id_article', 'id_rubrique');
$where = array( 
	'id_secteur = 3',
	'titre LIKE "%chat%" ',
	'titre NOT LIKE "%chien%"'
$result = sql_select($champs, "spip_articles", $where);

Select the titles and extensions recognised for documents, and store the result in a table:

$types = array();
$res = sql_select(array("extension", "titre"), "spip_types_documents");
while ($row = sql_fetch($res)) {
	$types[$row['extension']] = $row;

This selection could also be written as:

$res = sql_select("extension, titre", "spip_types_documents");

Select the documents linked to a section, with the title of the section in question, and sort in reverse date order:

$result = sql_select(
		"docs.id_document AS id_doc",
		"docs.extension AS extension",
		"docs.fichier AS fichier",
		"docs.date AS date",
		"docs.titre AS titre",
		"docs.descriptif AS descriptif",
		"R.id_rubrique AS id_rub",
		"R.titre AS titre_rub"),
		"spip_documents AS docs", 
		"spip_documents_liens AS lien", 
		"spip_rubriques AS R"),
		"docs.id_document = lien.id_document", 
		"R.id_rubrique = lien.id_objet", 
		"docs.mode = 'document'"),
	"docs.date DESC");
while ($row=sql_fetch($result)) {
	// ...
	// and with the previous table:
	$titre_extension = $types[$row['extension']]['titre'];


[1Maybe one of these days there will be a genuinely dedicated column for this!

Author Mark Baber Published : Updated : 12/03/23

Translations : English, français