sql_get_select

La fonction sql_get_select() retourne la requête de sélection demandée. C’est un alias de la fonction sql_select() mais qui envoie l’argument $option à false, de sorte la requête SQL au lieu d’être exécutée est retournée.

Elle prend les mêmes arguments que sql_select() hormis le dernier qui est renseigné par la fonction :

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

Elle s’utilise comme ceci :

$requete = sql_get_select('colonne', 'table');
// retourne "SELECT colonne FROM table" (avec MySQL)

On récupère ainsi une requête SQL valide pour le gestionnaire de base de données utilisé. Comme cette requête est propre, elle peut être utilisée directement par la fonction sql_query(), mais plus souvent, elle sert à créer des sous requêtes en association avec sql_in() :

// liste d'identifiants 
$ids = sql_get_select('id_table', 'tableA');
// selection en fonction de cette selection
$resultats = sql_select('titre', 'tableB', sql_in('id_table', $ids)));

Exemple

Pour obtenir tous les titres de rubriques dont les identifiants d’articles sont supérieurs à 200, une des méthodes possibles (on pourrait aussi utiliser une jointure) est d’utiliser sql_get_select() :

// creer la requete de selection donnant la liste des rubriques
$ids = sql_get_select('DISTINCT(id_rubrique)', 'spip_articles', array('id_article > 200'));
// selectionner ces rubriques
$res = sql_select('titre', 'spip_rubriques', sql_in('id_rubrique', $ids));
while ($r = sql_fetch($res)) {
	// afficher le titre.
	echo $r['titre'] . '<br />';
}

De façon bien plus complexe, on trouve des exemples dans certaines fonctions de critères, par exemple dans le critère {noeud} du plugin « SPIP Bonux » qui crée une sous requête pour récupérer la liste des objets ayant des enfants.

function critere_noeud_dist($idb, &$boucles, $crit) {
// [...]
// cette construction avec IN fera que le compilateur demandera 
// l'utilisation de la fonction sql_in()
$where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
if ($crit->not)
	$where = array("'NOT'", $where);

$boucle->where[]= $where;
}

Auteur Matthieu Marcillaud Publié le : Mis à jour : 12/03/23

Traductions : English, français