sql_select

La fonction sql_select() sélectionne des contenus dans la base de données et retourne une ressource SQL en cas de réussite, ou false en cas d’erreur.

Elle dispose de 9 paramètres, les 2 premiers sont indispensables, placés dans l’ordre de description d’une requête SQL standard. Ils prennent en entrée (de préférence) un tableau, mais acceptent des chaînes de caractères dont les éléments sont séparés par des virgules :

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

La fonction sql_select() est souvent couplée à sql_fetch() comme ceci :

// selection
if ($resultats = sql_select('colonne', 'table')) {
    // boucler sur les resultats
    while ($res = sql_fetch($resultats)) {
        // utiliser les resultats
        // $res['colonne']
    }
}

Les paramètres $select et $from acceptent de déclarer des alias. On peut donc imaginer :

if ($r = sql_select(
    array(
        'a.colonne AS colA',
        'b.colonne AS colB',
        'SUM(b.nombre) AS somme'
    ),
    array(
        'tableA AS a',
        'tableB AS b'
    ))) {
    while ($ligne = sql_fetch($r)) {
        // on peut utiliser :
        // $ligne['colA']  $ligne['colB']  $ligne['somme']  
    }
}

Exemple

Sélectionner les rubriques racines (id_parent=0) de la table « spip_rubriques » triés par rang [1] puis par ordre alphanumérique, et en demander toutes les colonnes (sélection totale avec ’*’) :

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

Sélectionner les chats mais pas les chiens (dans le titre) pour les articles du secteur 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);

Sélectionner les titres et extensions connues pour les documents, et stocker cela dans un tableau :

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

Cette sélection pourrait aussi s’écrire :

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

Sélectionner les documents liés à une rubrique, avec le titre de la rubrique en question, triés par date antichronologique :

$result = sql_select(
    array(
        "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"),
    array(
        "spip_documents AS docs",
        "spip_documents_liens AS lien",
        "spip_rubriques AS R"),
    array(
        "docs.id_document = lien.id_document",
        "R.id_rubrique = lien.id_objet",
        "lien.objet='rubrique'",
        "docs.mode = 'document'"),
     "",
    "docs.date DESC");
while ($row=sql_fetch($result)) {
    $titre=$row['titre'];
    // ...
    // et avec le tableau précédent :
    $titre_extension = $types[$row['extension']]['titre'];
}

Notes

[1Un jour, un jour il y aura une véritable colonne dédiée !

Auteur Matthieu Marcillaud Publié le : Mis à jour : 10/05/10

Traductions : English, français