Recherche dans 4 table mysql [Résolu]

Messages postés
95
Date d'inscription
dimanche 7 octobre 2007
Statut
Membre
Dernière intervention
25 novembre 2009
- - Dernière réponse : laloire33150
Messages postés
95
Date d'inscription
dimanche 7 octobre 2007
Statut
Membre
Dernière intervention
25 novembre 2009
- 25 nov. 2009 à 22:48
Bonjour à tous,

j'ai 4 tables de produits, et je voudrais en trouver un grâce à la référence

voici mon code :
<?php
$reference= $_POST['ref'];
include('include/config.php');

$sql "SELECT * FROM table1, table2, table3, table4 WHERE ref ".$ref0."";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
if (!$req) {
   die('Échec de la requête : ' . mysql_error());
}
$data= mysql_fetch_row($req);

echo $data[1];
?>


et voici l'erreur que j'ai :

Erreur SQL !
SELECT * FROM table1, table2, table3, table4 WHERE ref =
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

pouvez vous me donner un petit coup de pouce ?

laloire
Afficher la suite 

9 réponses

Meilleure réponse
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
10
3
Merci
Salut,

Mettre ainsi plusieurs table revient à effectuer implicitement, pour MySQL, une jointure interne. Non seulement ce n'est pas ce que tu veux, mais surtout vu que tu n'as aucune condition de jointure c'est le produit cartésien des 4 tables qui va être utiliser, ce qui va rapidement mettre son serveur au supplice si tu as pas mal d'entrées dans chaque table. Ce que tu voulais certainement faire c'est utiliser UNION afin d'avoir le résultat de 4 requêtes (une sur chaque table) en même temps.

Je me demande bien comment sont structurés tes tables et pourquoi tu en a 4 qui semblent plus ou moins identiques.

Sinon juste comme ça, tu as un très grave problème d'injections de SQL, je te conseille de lire au plus vite ceci et d'apporter les corrections nécessaires : Injection SQL

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 193 internautes nous ont dit merci ce mois-ci

Commenter la réponse de TychoBrahe
Messages postés
95
Date d'inscription
dimanche 7 octobre 2007
Statut
Membre
Dernière intervention
25 novembre 2009
0
Merci
zut j'ai fait une erreur en inscrivant mon code php
voici le bon :
<?php
$reference= $_POST['ref'];
include('include/config.php');

$sql "SELECT * FROM table1, table2, table3, table4 WHERE ref ".$reference."";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
if (!$req) {
   die('Échec de la requête : ' . mysql_error());
}
$data= mysql_fetch_row($req);

echo $data[1];
?>



laloire
Commenter la réponse de laloire33150
Messages postés
95
Date d'inscription
dimanche 7 octobre 2007
Statut
Membre
Dernière intervention
25 novembre 2009
0
Merci
Bonsoir TychoBrahe,

merci pour ta réponse, elle m'as bien aidé c'est vrai qu'avec union sa fonctionne très bien.

Je débute en php, les injections sql, première fois que j'en entend parler lol, merci de ton éclaircissement.

si je fait ceci, est-ce que c'est- bon ? je ne suis pas sur d'avoir bien compris les injections
<?php
//récupération produit 
$ref = $_POST[$reference];
$qan = $_POST[$quantite];

// la connexion
include ('config.php');

// recherche du produit
$sql "SELECT ref, nom, foto, prix, promo FROM table1 WHERE ref '$ref' UNION SELECT ref, nom, foto, prix, promo FROM table2 WHERE ref = '$ref' UNION SELECT ref, nom, foto, prix, promo FROM table3 WHERE ref = '$ref' UNION SELECT ref, nom, foto, prix, promo FROM table4 WHERE ref = '$ref'";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
if (!$req) {
   die('Echec de la requête : ' . mysql_error());
}
$data= mysql_fetch_row($req);
if ($data[4]=="") {
$prix = $data[3];
}
else {
$prix = $data[4];
}
$tot=$prix*$qan;

// afficher le produit
echo 'Nom du produit : ';
echo $data[1];
echo '
';
echo 'Prix : ';
echo $prix;
?>






laloire
Commenter la réponse de laloire33150
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
10
0
Merci
Salut,

si je fait ceci, est-ce que c'est- bon ? je ne suis pas sur d'avoir bien compris les injections

Non. Tu peux essayer par toi même en utilisant ceci dans $ref :
toto' OR 1 = 2 UNION SELECT DATABASE(), USER(), CURRENT_USER(), VERSION(), SCHEMA() -- titi
Commenter la réponse de TychoBrahe
Messages postés
95
Date d'inscription
dimanche 7 octobre 2007
Statut
Membre
Dernière intervention
25 novembre 2009
0
Merci
oki et si je fait ceci c'est ok ?

<?php
//récupération produit 
$ref = mysql_real_escape_string($_POST['reference']);
$qan = mysql_real_escape_string($_POST['quantite']);

// la connexion
include ('config.php');

// recherche du produit
$sql "SELECT ref, nom, foto, prix, promo FROM table1 WHERE ref '$ref' UNION SELECT ref, nom, foto, prix, promo FROM table2 WHERE ref = '$ref' UNION SELECT ref, nom, foto, prix, promo FROM table3 WHERE ref = '$ref' UNION SELECT ref, nom, foto, prix, promo FROM table4 WHERE ref = '$ref'";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
if (!$req) {
   die('Echec de la requête : ' . mysql_error());
}
$data= mysql_fetch_row($req);
if ($data[4]=="") {
$prix = $data[3];
}
else {
$prix = $data[4];
}
$tot=$prix*$qan;

// afficher le produit
echo 'Nom du produit : ';
echo $data[1];
echo '
';
echo 'Prix : ';
echo $prix;
?>



laloire
Commenter la réponse de laloire33150
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
10
0
Merci
Salut,

C'est bien mieux comme ça oui Enfin si tu ne te sert pas de la quantité pour effectuer ta requête ça ne sert a rien de lui appliquer mysql_real_escape_string(), d'autant plus qu'avec le transtypage ce sera sa valeur numérique qui sera prise (à cause de la multiplication).
Commenter la réponse de TychoBrahe
Messages postés
95
Date d'inscription
dimanche 7 octobre 2007
Statut
Membre
Dernière intervention
25 novembre 2009
0
Merci
Bonjour TychoBrahe,

Merci pour ton aide, et si je fais ceci : juste pour savoir ci cela fonctionnerais et surtout si c'est juste, je me doute que sa ne sert a rien puisque ce n'est pas dans ma requête sql.

<?php
//récupération produit 
$ref = mysql_real_escape_string($_POST['reference']);
$qan = $_POST['quantite'];

if (is_int($qan)) {
$qanok = $qan;
} 
// Je voudrais savoir en php, mais je ne sait pas encore faire ci-dessous
else {
echo '<script language=javascript> alert ("Vous n'avez pas choisi la quantité !");</script>';
    echo '<SCRIPT LANGUAGE="JavaScript">
document.location.href="commande.php" </SCRIPT>';
exit;
}

// la connexion
include ('config.php');

// recherche du produit
$sql "SELECT ref, nom, foto, prix, promo FROM table1 WHERE ref '$ref' UNION SELECT ref, nom, foto, prix, promo FROM table2 WHERE ref = '$ref' UNION SELECT ref, nom, foto, prix, promo FROM table3 WHERE ref = '$ref' UNION SELECT ref, nom, foto, prix, promo FROM table4 WHERE ref = '$ref'";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
if (!$req) {
   die('Echec de la requête : ' . mysql_error());
}
$data= mysql_fetch_row($req);
if ($data[4]=="") {
$prix = $data[3];
}
else {
$prix = $data[4];
}
$tot=$prix*$qanok;

// afficher le produit
echo 'Nom du produit : ';
echo $data[1];
echo '
';
echo 'Prix : ';
echo $prix;
?>




laloire
Commenter la réponse de laloire33150
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
10
0
Merci
Salut,

Non ça ne fonctionnera pas, et ce pour deux raisons :
1. Tu as oublié d'échapper les simples quotes dans ton bout de JavScript.
2. $_POST['quantite'] n'est pas un entier mais une chaîne de caractère représentant un entier, il en est donc de même pour $qan. Avant un cast explicite ou implicite is_int() retournera toujours faux. À la place de is_int() tu peux cependant utiliser ctype_digit() qui fait ce que tu attends.
Commenter la réponse de TychoBrahe
Messages postés
95
Date d'inscription
dimanche 7 octobre 2007
Statut
Membre
Dernière intervention
25 novembre 2009
0
Merci
bonsoir TychoBrahe,

Merci pour tout c'est bon conseils, c'est gentil de ta part


laloire
Commenter la réponse de laloire33150