TUTOS.EU

Exécuter et afficher une requête SQL en PHP

Exécuter une requête SQL en PHP avec connexion à la base

Le code en version concise

<?php

	//Définition des constantes
	define("SQLServerName","NomServeurMySQL");
	define("sqldbname","NomBaseDeDonnees");
	define("sqllogin","LoginSQL");
	define("sqlpass","MotDePasseSQL");
	
		
	$MaConnection = mysqli_connect(constant('SQLServerName'), constant('sqllogin'),constant('sqlpass'), constant('sqldbname'));
	if(!$MaConnection) {if ($debugmode > 0){echo "Erreur de connexion à MSSQL<br />";}}

	/* Modification du jeu de résultats en utf8 */
	if (!mysqli_set_charset($MaConnection, "utf8")) {echo "Erreur lors du chargement du jeu de caractères utf8 : ".mysqli_error($MaConnection)."<br />";}
	if ($debugmode > 0){echo "Reussite de la connection<br />";}	
	
	if ($MaConnection) {
		$sqlrequest = "Select * From `".constant('sqldbname')."`.`NomTable` order by NomChamp01;";
		echo $sqlrequest."<br />\n";

		if (strlen($sqlrequest) > 0){
			$Resultat = mysqli_query($MaConnection, $sqlrequest); //Passage d'une requête à la base de données
			if (!$Resultat) {
				echo "Passage de la requête non ok<br />\n";
				die('Erreur sur la requête : ' . mysqli_error());
			}
			else{ // Si la requête est bien passée
				echo "Passage de la requête ok<br />\n";
				$num_rows = mysqli_num_rows($Resultat);
				echo "Nombre de lignes : $num_rows<br />\n";

				//Affichage des noms des colonnes
				$CompteurChamp = mysqli_num_fields($Resultat);
				echo "Nombre de colonnes ou champs : $CompteurChamp<br />\n";
				echo "<br />\n";
				$finfo = mysqli_fetch_fields($Resultat);

				echo "<table>\n";
				echo chr(9)."<tr>\n";
				foreach ($finfo as $val) {
					echo chr(9).chr(9)."<th>$val->name</th>\n";
					//echo "Table $val->table<br />\n";
					//echo "max. Len $val->max_length<br />\n";
					//echo "Flags $val->flags<br />\n";
					//echo "Type $val->type<br />\n";

				}
				echo chr(9)."</tr>\n";

				//Affichage des valeurs					
				while ($MaLigne=mysqli_fetch_array($Resultat, MYSQLI_ASSOC)){
					echo chr(9)."<tr>\n";
					$finfo = mysqli_fetch_fields($Resultat);
					foreach ($finfo as $val) {
						$onevalue = $MaLigne[$val->name];
						if (mb_detect_encoding($onevalue, 'UTF-8', true) === false) {$onevalue = utf8_encode($onevalue);}
						$onevalue = htmlentities($onevalue, ENT_QUOTES, "UTF-8"); //pour afficher des variables qui contiennent des guillemets et notamment du code HTML sans qu'il soit interprété par le navigateur, il faut utiliser htmlentities
						echo chr(9).chr(9)."<td>$onevalue</td>\n"; //Affichage du résultat

					}
					echo chr(9)."</tr>\n";

				}							
				echo "</table>\n";

				mysqli_free_result($result);
			
			}
	
		}
		mysql_close($MaConnection);
	}
	else{
		die('Connexion impossible : ' . mysql_error());
	}

?>
Lien vers le fichier : cliquez ici

Code complet avec le code HTML de la page de base

<!DOCTYPE html>
<HTML lang="fr">
	<HEAD>
		<meta charset="utf-8" />

		<LINK rel="stylesheet" type="text/css" href="../style.css">

		<title>Titre du site</title>
		<meta name="Description" content="Description du site"/>
		<meta name="author" content="Bob l'éponge" />
		<meta name="Keywords" content="a, b, c"/>
		
	</HEAD>

	<BODY>

	<?php

		//Tiré de http://www.siteduzero.com/informatique/tutoriels/les-magic-quotes-ou-guillemets-magiques/desactiver-les-magic-quotes
		//Cette option pour virer les magic quotes est importante lorsque l'on poste récupère des valeurs de champs Input et textarea faute de quoi par exemple C'est deviendra C\'est
		function stripslashes_r($var) // Fonction qui supprime l'effet des magic quotes
		{
			if(is_array($var)) // Si la variable passée en argument est un array, on appelle la fonction stripslashes_r dessus
			{
				return array_map('stripslashes_r', $var);
			}
			else // Sinon, un simple stripslashes suffit
			{
				return stripslashes($var);
			}
		}

		if(get_magic_quotes_gpc()) // Si les magic quotes sont activés, on les désactive avec notre super fonction ! ;)
		{
			$_GET = stripslashes_r($_GET);
			$_POST = stripslashes_r($_POST);
			$_COOKIE = stripslashes_r($_COOKIE);
		}


		//Définition des constantes
		define("SQLServerName","NomServeurMySQL");
		define("sqldbname","NomBaseDeDonnees");
		define("sqllogin","LoginSQL");
		define("sqlpass","MotDePasseSQL");
		
			
		$MaConnection = mysqli_connect(constant('SQLServerName'), constant('sqllogin'),constant('sqlpass'), constant('sqldbname'));
		if(!$MaConnection) {if ($debugmode > 0){echo "Erreur de connexion à MSSQL<br />";}}

		/* Modification du jeu de résultats en utf8 */
		if (!mysqli_set_charset($MaConnection, "utf8")) {echo "Erreur lors du chargement du jeu de caractères utf8 : ".mysqli_error($MaConnection)."<br />";}
		if ($debugmode > 0){echo "Reussite de la connection<br />";}	
		
		if ($MaConnection) {
			$sqlrequest = "Select * From `".constant('sqldbname')."`.`NomTable` order by NomChamp01;";
			echo $sqlrequest."<br />\n";

			if (strlen($sqlrequest) > 0){
				$Resultat = mysqli_query($MaConnection, $sqlrequest); //Passage d'une requête à la base de données
				if (!$Resultat) {
					echo "Passage de la requête non ok<br />\n";
					die('Erreur sur la requête : ' . mysqli_error());
				}
				else{ // Si la requête est bien passée
					echo "Passage de la requête ok<br />\n";
					$num_rows = mysqli_num_rows($Resultat);
					echo "Nombre de lignes : $num_rows<br />\n";

					//Affichage des noms des colonnes
					$CompteurChamp = mysqli_num_fields($Resultat);
					echo "Nombre de colonnes ou champs : $CompteurChamp<br />\n";
					echo "<br />\n";
					$finfo = mysqli_fetch_fields($Resultat);

					echo "<table>\n";
					echo chr(9)."<tr>\n";
					foreach ($finfo as $val) {
						echo chr(9).chr(9)."<th>$val->name</th>\n";
						//echo "Table $val->table<br />\n";
						//echo "max. Len $val->max_length<br />\n";
						//echo "Flags $val->flags<br />\n";
						//echo "Type $val->type<br />\n";

					}
					echo chr(9)."</tr>\n";

					//Affichage des valeurs					
					while ($MaLigne=mysqli_fetch_array($Resultat, MYSQLI_ASSOC)){
						echo chr(9)."<tr>\n";
						$finfo = mysqli_fetch_fields($Resultat);
						foreach ($finfo as $val) {
							$onevalue = $MaLigne[$val->name];
							if (mb_detect_encoding($onevalue, 'UTF-8', true) === false) {$onevalue = utf8_encode($onevalue);}
							$onevalue = htmlentities($onevalue, ENT_QUOTES, "UTF-8"); //pour afficher des variables qui contiennent des guillemets et notamment du code HTML sans qu'il soit interprété par le navigateur, il faut utiliser htmlentities
							echo chr(9).chr(9)."<td>$onevalue</td>\n"; //Affichage du résultat

						}
						echo chr(9)."</tr>\n";

					}							
					echo "</table>\n";

					mysqli_free_result($result);
				
				}
		
			}
			mysql_close($MaConnection);
		}
		else{
			die('Connexion impossible : ' . mysql_error());
		}

	?>

	</BODY>
</HTML>
Lien vers le fichier : cliquez ici

Si vous avez une erreur comme si-dessous, c'est que votre requête sql n'est pas bonne :

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in ... on line xxx
 

Si vous devez envoyer une requête SQL contenant des données provenant d'un formulaire, au préalable passez vos variables dans la fonction mysql_real_escape_string

Exemple :

mysql_real_escape_string($MaVariableVenantDunFormulaire, $MaConnection);

 

stripslashes est l'équivalent désué de mysql_real_escape_string
Exemple :

$mavariablepourrequetesql = stripslashes($mavariablepourrequetesql); 


Autre problème : l'affichage du contenu d'un fichier non utf-8 passe mal.
Pour afficher correctement le contenu d'un fichier qui n'est pas codé en utf-8 mais en ANSI par exemple, il faut vérifier le codage.

Si le codage n'est pas en UTF-8, il faut le convertir.
Ci-dessous un exemple de convertion si la source n'est pas en UTF-8. La source est ici la variable $line :

if (mb_detect_encoding($line, 'UTF-8', true) === false) {$line = utf8_encode($line);}

 

La fonction htmlentities :
Dans un premier temps j'a cru qu'elle n'était pas nécessaire si j'avais ces pré-requis :

  • une base SQL en UTF-8
  • mysql_query("SET NAMES UTF8") placé après l'ouverture de la base
  • un fichier PHP en format utf-8
  • <meta charset="utf-8" /> spécifié dans le HEAD

Cependant, sur une page de prod, j'ai eu des problèmes pour afficher du code HTML qui s'est retrouvé interprété.
Comprenez que le contenu du champ value de balise input de cet exemple pose problème :

<input type="text" id="MonInput1" value="Cela ne fonctionne pas si j'affiche un guillemets type " vous comprennez ?" size=60 /><br />

 

En PHP, l'affichage de votre page peut être corrompu si vous affichez des variables contenant des guillemets simples ou doubles.

Dans l'exemple ci-dessous, si la variable $MaVariableaAfficher contient un guillemet, cela peut poser problème :

<?php

<input type="text" name="TxtAffichageDescription1" id="TxtAffichageDescription1" value=\"$MaVariableaAfficher" size=60 /><br />

?>

L'utilisation de la fonction htmlentities solutionne la question :

<?php

$MaVariableaAfficher = htmlentities($MaVariableaAfficher, ENT_QUOTES, "UTF-8");

<input type="text" name="TxtAffichageDescription1" id="TxtAffichageDescription1" value=\"$MaVariableaAfficher" size=60 /><br />

?>

 

A propos des guillemets, pour les traiter correctement avec htmlentities, il faut utiliser la fonction de cette façon :

htmlentities($MaVariable, ENT_QUOTES, "UTF-8");

 

La version simple ne fonctionne pas, cad :

htmlentities($MaVariable);

 

Pages Web

Site WebDescription
Mysql_connectAide sur la fonction mysql_connect en PHP.
php.netmysqli_fetch_array