Un parseur de sql (lister les champs presents, et plus si affinites)

Description

Bon, je vous presente une classe (qui aurait peut-etre du etre formee comme une fonction, mais bon, j'ai choisi de pouvoir eventuellement laisser une possibilite d'evolution vers un systeme de construction de requettes) Cette classe permet de prendre une requette, de la decouper, d'obtennir ainsi plusieurs tableaux, l'un contient la liste des champs selectionnes, un autre contient la liste des bases, un autre, les conditions, les groupements et les limites... J'ai surement oublie des keywords importants a parser, si vous en trouvez, faites moi signe...

Ca ne parse que les requettes SELECT, simples comme complexes... je n'ai pas voulu gerer les DELETE, DROP, CREATE, INSERT et autres pour le moment, car ce ne sont pas vraiment des requettes que l'on fait construire par un script, ou pour lesquels, la lecture par un script presente de l'interet...... (enfin je crois...)

J'ai fait cette classe pour la requette presentee en bas, elle est complique, et risque de se compliquer encore, et j'avais besoin de faire une liste des champs disons facilement accessibles, alors j'ai code ca...

J'aurais pu faire un parsing recursif pour les sous requettes, je ne l'ai pas fait, c'est selon moi pas obligatoire, donc libre a l'utilisateur de le faire

Source / Exemple :


try{
		$s=new SqlExpr('
	SELECT
		clients.id, clients.nom, clients.prenom,
		clients.type AS typeclient,			/*Homme Femme, Enfant*/
		clients.civilite,				/*Madamme Mademoiselle Monsieur*/
		clients.date_de_naissance,
		clients.tranche_age,
		clients.adresse,
		clients.tel,
		clients.actif,					/*oui non */
		ville.nom AS nomville,
		ville.code_postal,
		collaborateur.nom AS collaborateur_nom,
		collaborateur.prenom AS collaborateur_prenom,
		collaborateur.pseudo AS collaborateur_pseudo,
		(
			SELECT COUNT(*)
			FROM passage_liste
			WHERE passage_liste.id_client=clients.id
		) AS nbr_passages,
		(
			SELECT MAX(date_de_passage)
			FROM passage_liste
			WHERE passage_liste.id_client=clients.id
		) AS derniere_visite,
		(
			SELECT prestations.nom
			FROM passage_liste LEFT JOIN
				(passage_prestation LEFT JOIN prestations
					ON prestations.id=passage_prestation.id_prestation)
				ON passage_prestation.id_passage=passage_liste.id
			WHERE passage_liste.id_client=clients.id
			GROUP BY passage_prestation.id_prestation
			ORDER BY COUNT(*)
			LIMIT 1
		) AS prestation_best
	FROM
		(clients LEFT JOIN ville ON clients.id_ville=ville.id)
			LEFT JOIN collaborateur ON id_collaborateur_prefere=collaborateur.id
');
	echo '<ul>';
	foreach ($s->SELECT as $l)
		echo '<li>'.$s->notableorbase($l[1]).'</li>';
	echo '</ul>';
}catch (Exception $e){
	echo $e;
}

Conclusion :


c'est une v1. j'ai commence ca vers 13h aujourd'hui, alors il peut rester quelques problemes (surtout que mon utilisation de cette classe reste limitee a une seule requette, alors j'ai teste avec quelques requettes que j'utilise frequement, mais j'ai pas non plus teste avec 400 requettes...)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.