Récupération valeur d'une requête SQL

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Récupération valeur d'une requête SQL

par Cyrano » 29 août 2006, 10:32

La concaténation, ce n'est pas particulièrement sorcier, il faut simplement un minimum d'attention.

Le but consiste à insérer du code PHP dans des chaines de caractères. Chaque chaine est délimités par des caractères particuliers: apostrophes ou guillemets. Mon choix personnel est le suivant (et c'est essentiellement une question de confort de travail personnel, adapte à ton goût, mais n'oublie pas de respecter les règles de base)

Lorsque je dois avoir une chaine de caractères, j'utilise des guillemets :
<?php
$var = "chaine de caractères";
?>
Jusque-là, rien de compliqué. Mais j'aurais pu écrire aussi bien:
<?php
$var = 'chaine de caractères';
?>
Le résultat est le même.

Maintenant, supposons que nous devions insérer une variable au milieu de cette chaine : avec des guillemets, on peut théoriquement (et ça fonctionne même si ce n,est à mon sens pas très propre) l'ajouter sans autre forme de procès :
<?php
$var = "chaine de $nb caractères";
?>
Si ma variable $nb vaut 23, ma chaine correspondra bien à "chaine de 23 caractères". Ce qui me fait préférer les guillemets dans ce genre de cas, c'est que si j'écris :
<?php
$var = 'chaine de $nb caractères';
?>
Ma chaine correspondra alors à "chaine de $nb caractères" : entre apostrophes, les variables PHP ne sont pas interprétées, c'est une erreur très classique.

Comment résoudre ce problème ?

En effectuant une concaténation, c'est à dire qu'on va diviser la chaine en plusieurs portions et on utilisera l'opérateur de concaténation quei est le point.
<?php
$var = "chaine de ". $nb ." caractères";
?>
ou encore
<?php
$var = 'chaine de '. $nb .' caractères';
?>
Le résultat sera le même : on assemble une chaine plus courte avec une variable puis une nouvelle chaine.

Et lorsqu'on va créer des requêtes SQL, on va se heurter à un autre problème : là, on va mélanger du PHP, du SQL et des chaines de caractères. Il faut séparer chaque partie:
-1- Pour PHP, le SQL doit être traité comme une chaine de caractères
-2- Pour SQL, les valeurs de champs devront être également traité comme des chaines de caractères.

Donc en SQL, on va utiliser aussi des caractères pour isoler les chaines. Mon choix personnel, c'est l'apostrophe pour distinguer des caractères que j'utilise en PHP (guillemets)

Mettons donc que j'aie une requête qui à la base ressemble à ceci:

Code : Tout sélectionner

SELECT champ1, champ2 FROM ma_table WHERE nom = 'untel';
Pour l'instant, on est en SQL, mais je dois définir ça en PHP, ça va donner:
<?php
$sql = "SELECT champ1, champ2 FROM ma_table WHERE nom = 'untel';";
?>
Jusque là, pas de problème : pour PHP, la requête est une chaine de caractères délimitée par des guillemets, et "untel" est pour SQL une chaine de caractères délimitée par des apostrophes : il n'y a pas de conflits.

Mais ma requête doit être dynamique et le nom doit pouvoir changer : "untel" doit être remplacé par une variable PHP. Je vais procéder comme montré plus haut : je vais couper ma chaine (requête) en deux chaînes :
  1. SELECT champ1, champ2 FROM ma_table WHERE nom = '
  2. ';
La seconde partie est minime, mais indispensable. Je concatène ensuite ma variable avec le tout:
<?php
$sql = "SELECT champ1, champ2 FROM ma_table WHERE nom = '". $nom ."';";
?>
Si $nom vaut "dupont", l'affichage de ma requête donnera:

Code : Tout sélectionner

SELECT champ1, champ2 FROM ma_table WHERE nom = 'dupont';
Ma chaine est correcte.

par Newbie » 29 août 2006, 10:10

Merci, mon problème est résolu.

Il va falloir que je comprenne un peu mieux la concaténation des variables dans une requête SQL... :?

Connaîtrais-tu par hasard un tuto qui en explique bien le fonctionnement avec des exemples de chaque cas possible ?

par Cyrano » 29 août 2006, 09:51

Proposition de correction :
<?php
//Création et envoi de la requête
$sql = "SELECT id_inscrit FROM inscrit WHERE semaine='". $sem ."' AND jour='". $jour."'";
$req = mysql_query($sql) or die('Erreur SQL'. $sql .'<br>'. mysql_error());
//Création tableau
$inscrit = array();
//Remplissage tableau
while (false != ($result = mysql_fetch_array($req)))
{
    $inscrit[] = $result['id_inscrit'];
}
//Test des variables
echo 'Semaine : '.$sem.'<br>' ;
echo 'Jour : '.$jour.'<br>' ;
$nb_lignes = count($inscrit);
for($i = 0; $i < $nb_lignes; $i++)
{
	echo 'N° : '. $inscrit[$i] .'<br>' ;
}
?>

par Newbie » 29 août 2006, 09:43

Désolé, mais je dois avoir un problème car j'ai beau essayé de modifié l'exemple selon mes besoins : rien ne marche.
Voici le code entier pour plus de clareté :
//Création et envoi de la requête
$sql = "SELECT id_inscrit FROM inscrit WHERE semaine=.$sem AND jour=.$jour";
$req = mysql_query($sql) or die('Erreur SQL'.sql.'<br>'.mysql_error());
//Création tableau
$inscrit = array();
//Remplissage tableau
while (false != ($result = mysql_fetch_array($req)))
	{
	$inscrit[] = $result['id_inscrit'];
	}
//Test des variables
echo 'Semaine : '.$sem.'<br>' ;
echo 'Jour : '.$jour.'<br>' ;
echo 'N° : '.$inscrit[0].'<br>' ;
echo 'N° : '.$inscrit[1].'<br>' ;
Le test me retourne bien les bonnes valeurs de semaine et jour mais rien pour le N° des inscrits (ma table contient bien des données correspondantes à la requête).
Cette portion de code servant à connaître les identifiants de membre inscrit pour une session de telle semaine et de tel jour.

par Cyrano » 29 août 2006, 09:05

Bien, alors voici un croquis basique sur le fonctionnement : lis bien les commentaires que j'ai mis dans le code, ils expliquent chaque instruction:
<?php
/* Création d'une requête SQL */
$sql = "SELECT champ1, champ2, FROM ma_table";

/* Paramètres de connexion */
$serveur     = "localhost";
$utilisateur = "root";
$mdp         = "";
$schema      = "ma_base";

/* Connexion au serveur de base de données */
$cnx = mysql_connect($serveur, $utilisateur, $mdp) or die("Erreur lors de la connexion au serveur :". mysql_error);
/* Sélection du schéma approprié */
mysql_select_db($schema, $cnx) or die("Erreur lors de la sélection du schéma :". mysql_error);

/* Exécution de la requête */
$req = mysql_query($sql) or die("Erreur lors de l'exécution de la requête \"". $sql ."\" :<br/>\n". mysql_error);

/* 
Récupération des résultats : comme on peut avoir plusieurs lignes de 
résultat, on crée des tableaux pour stocker les valeurs.
*/
$valeur_1 = array();
$valeur_2 = array();
/* On boucle tant qu'il y a des résultats */
while(false != ($result = mysql_fetch_array($req)))
{
    $valeur_1[] = $result['champ1'];
    $valeur_2[] = $result['champ2'];
}
?>
Petit détail de terminologie : tu auras peut-être noté le terme de "schéma" qu'on emploiera de préférence au terme "base de données", ce dernier s'appliquant plutôt à l'ensemble des schémas stockés dans ton serveur MySQL.

Ensuite, à partir de ce type de code, tu disposes de tableaux indexés pour travailler.

Re: Récupération valeur d'une requête SQL

par polo » 29 août 2006, 08:56

Bonjour,
$sql = SELECT ......... ;
$req = mysql_query............ ;
$result = mysql_fetch_array($req);

$valeur_1 = 1er résultat;
$valeur_2 = 2ème résultat;
...
...
Si c'est la méthode que tu cherches avec quelques exemples regarde ceci:
Clique ici
et encore:
Clique ici
Et finalement tu pourras sûrement trouver ton bonheur dans tous ça:
Clique ici
Voila :D

Récupération valeur d'une requête SQL

par Newbie » 29 août 2006, 08:19

Bonjour tous le monde, comme mon pseudo l'indique je suis tout jeune dans la programmation php.

J'aimerais, si possible que qqun me dise comment je peux récupérer les variables (résultats de la requête) :
$sql = SELECT ......... ;
$req = mysql_query............ ;
$result = mysql_fetch_array($req);

$valeur_1 = 1er résultat;
$valeur_2 = 2ème résultat;
...
...

si je m'explique bien, en fait je voudrais récupérer les valeurs résultat afin de les réaffecter dans de nouvelles variables pour plus de facilité afin de les récupérer plus tard dans ma page.

Merci de votre aide.