8721 sujets

Développement web côté serveur, CMS

Bonjour à tous,

C'est peut-être tout bête à vrai dire, ou bien très compliqué, je n'en sais rien ...

Je dois créer une page PHP dans laquelle un formulaire permettra à un administrateur de taper n'importe quelle requête SQL, qui sera ensuite exécutée. Jusque là pas de souci.
Mais alors, comment afficher le résultat de cette requête alors qu'elle m'est inconnue ?

Le but est d'offrir un outil d'administration simple, sans pour autant donner accès à PHPMyAdmin (et pouvoir le brider au niveau des requêtes possibles par la suite si nécessaire).
J'aimerais donc reproduire en PHP quelque chose qui ressemble à l'exécuteur de requête de PHPMyAdmin...

Possible ? Facile ? Laisse tomber ?
En utilisant foreach, c'est bien sûr possible ^^

while($mysql=$mysqli->fetch_assoc())


Te donne à chaque passage (à chaque ligne du select) un tableau ressemblant à ça :

$mysql=array(
    "champ1"=>"valeur 1",
    "champ2"=>"valeur 2",
    /*etc*/
)


champ1 et champ2 étant le nom dans la table mysql (ou l'alias si un alias a été demandé dans la requête).

A partir de là, tu parcours ce tableau avec un [http://www.php.net/manual/fr/control-structures.foreach.php]foreach[/url].

Par contre, c'est vrai uniquement pour les requêtes de type select.

Si tu envisages de permettre d'autres requêtes (insert, delete ou update par exemple), là il faudra d'abord récupérer le type de requête (avec explode par exemple). Parce que la réponse à un insert, delete ou un update n'est forcément pas celle d'un select. (à vue de nez, ça devrait donner le nombre de ligne touchées)
Merci, j'ai effectivement trouvé une solution à partir de cette idée !

Côté exécution de la requête, ça donne :

if ($_REQUEST['R_sql'] && !empty($_REQUEST['R_sql'])){
	$S_requete = mysqli_query($C, $_REQUEST['R_sql']);
	if (!$S_requete) {$oki = "Requête invalide : <b>".mysqli_error($C)."</b>";} 
        else{
		$type = explode(" ",$_REQUEST['R_sql']);
		if (count($type)>0 && strtolower($type[0])=="select"){
			while ($DT_requete = mysqli_fetch_array($S_requete)){$resultats[] = $DT_requete;}
		}
		$oki = "Requête exécutée avec succès";
	}
}


Et côté affichage (dégueulasse, pour test), ça donne :

if (is_array($resultats)){
	$champs = array_keys($resultats[0]);
	$i=0;
	foreach($champs as $champ){
		if (!is_numeric($champ)){
			echo "<div style='float:left;margin:2em 0 2em 0;border-right:1px solid #ccc;background-color:#f1f1f1'>";
			echo "<div style='margin-bottom:1em;background-color:#e1e1e1;padding:0.5em'><b>".$champ."</b></div>";
			foreach($resultats as $resultat){echo "<div style='border-bottom:1px solid #ccc;padding:0.5em'>&nbsp;".$resultat[$i]."</div>";}
			echo "</div>";
			$i++;
		}
	}
}