Carnet Wiki

mysql_to_spip

Version 4 — Mars 2019 JLuc

Cette fonction analyse une requête SQL simple pour en extraire les paramètres select, from etc utiles pour les fonctions de l’API sql de SPIP. L’index ’explain’ donne l’explication du résultat sous la forme d’un HTML.

Ça marche bien pour les requêtes SQL simples et pour une part de requêtes moyennement complexes , mais il y a plein de cas moyennement complexes ou complexespour lesquels elle échoue .

// Auteur : JLuc


// Nettoie la query des caractères en trop
function nettoie_query ($str) {
	$rep = array("\r\n", "\n", "\r", "\t");
	$rep = str_replace ($rep, " ", $str);
        return preg_replace("/\s+", ' ', $rep);
}


// Calcule les parametres de la query pour l'API sql_ de SPIP
function mysql_to_spip ($my_query, $special) {
	$my_query = nettoie_query ($my_query);


if (!preg_match ("/SELECT\b(.*)\bFROM\b(.*)\bWHERE\b(.*)(\bGROUP BY\b(.*))?(\bORDER BY\b(.*))?$/imuU", $my_query, $matches))
		return null;


$select= $matches[1];
	// vu la regexp ya toujours un where
	$where = $matches[3];


$found = array(
		'query' => $my_query,
		'select' => $select,
		'from' => ($from = $matches[2]),
		'where' => $where,
		'group_by' => ($groupby = (isset ($matches[5]) ? $matches[5] : '')),
		'order_by' => ($orderby = (isset ($matches[7]) ? $matches[7] : '')),
		'explain' => "SELECT: ".$select
				."<br>FROM: ".$from
				."<br>WHERE: ".$where
				."<br>GROUP BY: ".$groupby
				."<br>ORDER BY: ".$orderby
		);
	return $found;
};