/** * Calcule le code PHP d'une boucle contenant les informations qui produiront une requête SQL * * Le code produit est un tableau associatif $command contenant les informations * pour que la boucle produise ensuite sa requête, tel que `$command['from'] = 'spip_articles';` * * @param Boucle $boucle * AST de la boucle * @return string * Code PHP compilé définissant les informations de requête **/ function calculer_requete_sql($boucle) { $init = array(); $init[] = calculer_dec('table', "'" . $boucle->id_table . "'"); $init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'"); # En absence de champ c'est un decompte : $init[] = calculer_dec('from', calculer_from($boucle)); $init[] = calculer_dec('type', calculer_from_type($boucle)); $init[] = calculer_dec('groupby', 'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ")"); $init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . "\")"); $init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ")"); $init[] = calculer_dec('where', calculer_dump_array($boucle->where)); $init[] = calculer_dec('join', calculer_dump_join($boucle->join)); $init[] = calculer_dec('limit', strpos($boucle->limit, 'intval') === false ? "'" . $boucle->limit . "'" : $boucle->limit); $init[] = calculer_dec('having', calculer_dump_array($boucle->having)); $s = $d = ""; // l'index 0 de $i indique si l'affectation est statique (contenu) // ou recalculée à chaque passage (vide) foreach ($init as $i) { if (reset($i)) { $s .= "\n\t\t" . end($i); } else { $d .= "\n\t" . end($i); } # dynamique } return ($boucle->hierarchie ? "\n\t{$boucle->hierarchie}" : '') . $boucle->in . $boucle->hash . "\n\t" . 'if (!isset($command[\'table\'])) {' . $s . "\n\t}" . $d; }
function calculer_requete_sql($boucle){ return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '') . $boucle->in . $boucle->hash . calculer_dec('$table', "'" . $boucle->id_table . "'") . calculer_dec('$id', "'" . $boucle->id_boucle . "'") # En absence de champ c'est un decompte : . calculer_dec('$from', calculer_from($boucle)) . calculer_dec('$type', calculer_from_type($boucle)) . calculer_dec('$groupby', 'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ")") . calculer_dec('$select', 'array("' . join("\",\n\t\t\"", $boucle->select) . "\")") . calculer_dec('$orderby', 'array(' . calculer_order($boucle) . ")") . calculer_dec('$where', calculer_dump_array($boucle->where)) . calculer_dec('$join', calculer_dump_join($boucle->join)) . calculer_dec('$limit', (strpos($boucle->limit, 'intval')===false ? "'" . $boucle->limit . "'" : $boucle->limit)) . calculer_dec('$having', calculer_dump_array($boucle->having)); }