Requêteur php

Soyez le premier à donner votre avis sur cette source.

Vue 12 138 fois - Téléchargée 911 fois

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

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
jeudi 21 juillet 2005
Statut
Membre
Dernière intervention
31 mars 2009

Bonjour,

Ce code m'interesse beaucoup... et j'ai essayé de l'adapter pour faire des INSERT MULTIPLE, comme cela fonctionne dans PhpMyAdmin ... mais je n'ai pas réussi.
Quelqu'un sait il comment faire ?

Merci.

insert into tbl1 values('2');
insert into tbl2 values('1');
Messages postés
21
Date d'inscription
jeudi 16 mars 2006
Statut
Membre
Dernière intervention
21 janvier 2008

moi je pense que c'est pas toi qui l'as écrite j'ai vtoruvé la même chose sure asp-php.net et posté par l'administrateur!
Messages postés
2
Date d'inscription
jeudi 11 décembre 2003
Statut
Membre
Dernière intervention
7 mars 2006

bonjour,
Le source fonctionne une fois les petites erreurs de syntaxe réglées, et il y a de bonnes idées. Lorsque tu proposes la requête SELECT, vas plus loin , offre une liste déroulante pour sélectionner les variables, les valeurs distinctes , une clause WHERE, des ORDER BY, etc...
Proposes aussi les requetes INSERT , UPDATE, DELETE ...
Mais surtout regardes du côté des templates ( Smarty ou autres ) pour séparer dans ton code le html du php, mets ton javascript dans un fichier à part, le css aussi, tout sera beaucoup plus clair et maintenable.
Et pourquoi ne pas présenter dans des onglets séparés les différentes requêtes ?

bon courage pour la suite...
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
42
FhX??? bah si t'as tout dans un seul echo évidement, mais bon, quand c'est du ligne par ligne... Et si un jours t'as envi d'ajouter un output buffering (ob_start), alors ça ne te sert à rien...
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
4
"4) Mettre un seul echo au lieu de plusieur."
Pas forcément. Accepter un gros volume de donnée pour un seul echo est synonyme d'une attente plus longue lors du chargement de la page à cause du buffer d'envoi.

En faite, il faut savoir modérer l'emploi du echo()... c'est tout ;)

Voila, le reste je regarde pas ;)
Afficher les 7 commentaires

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.