Requêteur php

Description

Vous en avez assez, à chaque fois que vous voulez "fouiller" dans votre base de données, de lancer PhpMyAdmin (ou autre outil en fonction de votre base).
Le code ci-dessous vous permet de mettre une page sur votre site pour faire des requêtes.
Le commentaire en début de code est très explicite.

Source / Exemple :


<!--
Ce script contient un formulaire pour soumettre des requêtes à une base de données.
Il ne dépend pas du langage de requête.
C'est un formulaire qui s'appelle lui-même (dans la balise FORM, l'attribut action = "_self")
La sécurité n'est pas gérée dans le script, mais dépend de chacun, aussi bien au niveau de l'accès à la page
que des "grant" SQL de la base de données.

A la connexion à la base de données, les tables sont listées, et un bouton est créé pour pouvoir
insérer le nom de la table dans la zone de requête.

Ce script ne préjuge pas de la requête, et ne contrôle en aucune façon sa validité (sauf si elle est vide).

En cas de requête INSERT ou UPDATE, on voit le nombre de rangées insérées ou modifiées.

En cas d'erreur de requête, le n° de l'erreur est reporté, ainsi que son libellé.
-->

<!-- inclusion optionnelle d'une page gérant la sécurité d'accès -->
<?php //include "controle_acces.php" ?>
<!-- -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Description" name="Description" content="Requeteur SQL">
<title>Requeteur SQL par Richard HUMERY</title>

<!-- Paramètres de connexion au serveur et à la base de données (maBdd) -->
<?php
$hostname_connexion = "monServeur";
$database_connexion = "maBdd";
$username_connexion = "monIdentifiant";
$password_connexion = "monMdp";
$connexion = mysql_pconnect($hostname_connexion, $username_connexion, $password_connexion) or trigger_error(mysql_error(),E_USER_ERROR); 

// Ci-dessous, requête pour lister les tables de la bdd et leurs caractéristiques
// dès le chargement de la page. L'affichage aura lieu juste après le titre, dans <body>
mysql_select_db($database_connexion, $connexion);
    $query_tables = mysql_query("SHOW TABLE STATUS", $connexion) or die(mysql_error());
    $row_query_tables = mysql_fetch_assoc($query_tables);
    $totalRows_query_tables = mysql_num_rows($query_tables);

// C'est ici que la requête entrée par l'utilisteur est soumise à la base de données lors du clic sur le bouton de soumission.
// Le test isset du début évite de lancer la requête au premier chargement de la page. 
if (isset($_POST['texte_requete'])) {
    mysql_select_db($database_connexion, $connexion);
	// Quand on soumet ce formulaire, c'est le texte de requête qui est choisi.
	// Si on clique quand la requête est vide, on met quand même qq chose ("SELECT @@version" par exemple pour éviter l'erreur SQL 'Empty query'.
	$query_texte = stripslashes(trim($_POST['texte_requete']));
	if($query_texte == "") { $query_texte = "SELECT @@version"; }
    $query_result = mysql_query($query_texte, $connexion);
    if($query_result) {
		$debut_requete = strtoupper(substr($query_texte,0,5));
		// Ci-dessous, on test que la requête est succeptible de renvoyer des enregistrements.
		// Autrement, mysql_fetch_assoc et mysql_num_rows donneraient une erreur
		if($debut_requete == "SELEC" || $debut_requete == "SHOW " || $debut_requete == "EXPLA" || $debut_requete == "DESCR") {
			$requete_type_select = TRUE;
			$row_query_result = mysql_fetch_assoc($query_result);
			$totalRows_query_result = mysql_num_rows($query_result);
		} 
		if($debut_requete == "INSER" or $debut_requete == "UPDAT" or $debut_requete == "DELET") {
			$requete_type_select = FALSE;
			$totalRows_affected = mysql_affected_rows();
			}

	} else {
		$erreur =  mysql_errno($connexion) . " : " . mysql_error($connexion);
	}
}
?>

<!-- Quelques styles de présentation -->
<style type="text/css">
<!--
td {
	empty-cells: show;
	font-size: smaller;
	white-space: nowrap;
}
.petit {
	font-size: small;
}
body,td,th {
	font-family: Arial, Helvetica, sans-serif;
	background-color: #D3FEF0;
}
textarea {
	font-size: small;
	font-family: "Courier New", Courier, mono;
}
-->
</style>

<script language="JavaScript" type="text/JavaScript">
<!-- Fonction utilisée par les boutons "SHOW FULL COLUMNS" et "SELECT * FROM", uniquement pour se simplifier la vie
// On peut ajouter des boutons à discrétion
function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_setTextOfTextfield(objName,x,newText) { //v3.0
  var obj = MM_findObj(objName); if (obj) obj.value = newText;
  obj.focus();
}
// Fonction pour ajouter du texte à la suite de l'existant
function MM_addTextOfTextfield(objName,x,newText) { //v3.0
  var obj = MM_findObj(objName); if (obj) obj.value = obj.value + ' ' + newText;
  obj.focus();
}
//-->
</script>
<body>
<h1 align="center">Requéteur SQL</h1>
<?php // Présentation d'un tableau contenant les tables de la base de données
if($totalRows_query_tables > 0) {
echo '<p>';
echo "&nbsp;&nbsp;&nbsp;&nbsp;" . $totalRows_query_tables . " tables sur le serveur <b>" . $_SERVER[HTTP_HOST] . "</b> &#8211; base de données <b>" . $database_connexion ."</b>";
echo '<table border="1" cellpadding="2" cellspacing="0" summary="Tables de la base">';  
echo '<tr>';
echo '<td align="center">' . '<b>' . "&nbsp;" . '</b></td>';
foreach ($row_query_tables as $cle => $valeur) {
	echo '<td align="center">' . '<b>' . htmlentities($cle) . '</b></td>';
}
do {
	echo '<tr>';
	// Et pour chaque table, bouton cliquable permettant d'insérer son nom dans la zone de requête
	// A noter qu'il n'y a rien entre les balises <button> et </button>, pour ne pas générer un "gros" bouton.
	// Mais ça génère un avertissement dans les contrôleurs de syntaxe HTML.
	echo '<td align="center">' . "<button type=\"button\" onClick=\"MM_addTextOfTextfield('texte_requete',''," . "'" . $row_query_tables['Name']." '" . ")\">" . '</button></td>';
	$champ=0;
	foreach ($row_query_tables as $cle => $valeur) {
		$champ++;
		if($champ == 1) { // Et pour chaque table, son nom devient cliquable pour l'insérer dans la zone de requête
		echo "<td onClick=\"MM_addTextOfTextfield('texte_requete',''," . "'".$row_query_tables['Name']." '" . ")\">" . "<b>" . htmlentities($valeur) . "</b>" . '</td>';
		} else {
			echo "<td>" . htmlentities($valeur) . "</td>";
			}
		}
	echo '</tr>';
	} while ($row_query_tables = mysql_fetch_assoc($query_tables));
echo '</table>';
echo " &nbsp;Cliquer sur le <b>nom</b> d'une table ou sur le bouton à sa gauche pour ajouter le nom au texte de requête. ";
//echo '</p>';
}
?>
<!-- Ci-dessous, 2 boutons pour se faciliter la vie.
Si d'autres requêtes sont souvent utilisées, on pourrait créer d'autres boutons évitant de taper le texte
-->
<p class="petit"> 
    <button type="button" onClick="MM_setTextOfTextfield('texte_requete','','SHOW FULL COLUMNS FROM ')">SHOW FULL COLUMNS FROM</button>
    &nbsp;(Pour connaître les colonnes d'une table en MySql: SHOW FULL COLUMNS FROM nom_table )
<br>
<br>
	<button type="button" onClick="MM_setTextOfTextfield('texte_requete','','SELECT * FROM ')"> SELECT * FROM</button>
   &nbsp;Le debut de la requête la plus utilisée...</p>

<!-- Le formulaire proprement dit -->
<form action="requeteur.php" method="post" target="_self" id="Requete">
    <b>Ecrire la requête ci-dessous puis </b>
    <input name="Submit2" type="submit" value="Soumettre la requête">
    <br>
	<textarea name="texte_requete" cols="100" rows="10" id="texte_requete"><?php if(isset($_REQUEST['texte_requete'])) {echo stripslashes($_REQUEST['texte_requete']);} //Pour répéter la requête au rechargement de la page ?></textarea><br>
<b>Ecrire la requête ci-dessus puis </b>
<input name="Submit" type="submit" value="Soumettre la requête">
</form>
<?php
if(isset($_POST['texte_requete']) && $query_texte > "") {
	echo "<b>Requête soumise :</b>", "<br>"; // On rappelle la requête
	echo $query_texte, "<br>";
}

if($totalRows_query_result > 0) {
echo "<b>Résultat</b>", "<br>";
echo "&nbsp;&nbsp;&nbsp;&nbsp;<b>" . $totalRows_query_result . "</b> enregistrement(s)";
echo '<table border="1" cellpadding="1" cellspacing="1" summary="Resultats">';  
echo '<tr>';
foreach ($row_query_result as $cle => $valeur) {
	echo '<th align="center">' . htmlentities($cle) . '</th>';
}
do {
	echo '<tr>';
	foreach ($row_query_result as $cle => $valeur) {
		echo '<td>' . htmlentities($valeur) . '</td>';
		}
	echo '</tr>';
	} while ($row_query_result = mysql_fetch_assoc($query_result));
echo '</table>';
}
if($requete_type_select == TRUE && $totalRows_query_result == 0) {
echo "Aucun enregistrement ne correspond";
	}
if($debut_requete == "UPDAT" && $totalRows_affected > 0) {
echo $totalRows_affected , " enregistrement(s) modifié(s)";
	}
if($debut_requete == "INSER" && $totalRows_affected > 0) {
echo $totalRows_affected , " enregistrement(s) inséré(s)";
	}
if($debut_requete == "DELET" && $totalRows_affected > 0) {
echo $totalRows_affected , " enregistrement(s) effacé(s)";
	}
if ($erreur > "") {echo "Erreur " . $erreur;}
?>
</body>
</html>
<?php
if(isset($query_result) && $query_result == TRUE && $requete_type_select == TRUE) {
	mysql_free_result($query_result);
	}
?>

Conclusion :


J'attends vos commentaires et vos suggestions pour améliorer ce soft.

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.