Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/03/2011, 23h21   #1
Invité régulier
 
Inscription : octobre 2009
Messages : 25
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : octobre 2009
Messages : 25
Points : 6
Points : 6
Par défaut Problème requete

Bonsoir,
J'ai un soucis sur une requête SQL que je genere via a petit script :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php session_start(); 
include 'include/connect.php';
$nbrCommande=count($_SESSION['panier']['produit']);
for ($i=0 ;$i < $nbrCommande ; $i++)
{
	$sql = 'SELECT prix FROM data_prices WHERE ';
	foreach($_SESSION['panier'] as $cle=>$valeur)
	{		
		if($valeur[$i] == '')
		{			
			$valeur[$i] = 'default';
		}
 
		if($cle != 'num_commande' && $cle != 'prixHT' && $cle != 'page_cover' && $cle != 'prixTTC')
		{
			if($cle == 'page'){
				$cle = 'pages';
			}
			$sql = $cle.'=\''.mysql_real_escape_string($valeur[$i]).'\' AND ';		
			if($cle == 'delais'){
				$valeur[$i] = substr($valeur[$i],0,1);
				$sql = $cle.'=\''.mysql_real_escape_string($valeur[$i]).'\'';
			}
 
		}
		//echo $sql.'<br>';
	}
	$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
	while($row = mysqli_fetch_assoc($req)) {
		echo $row['prix'];
	}
 
}				
?>
Quand je fais un echo de ma $req j'obtient une requête valide du genre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT prix FROM data_prices WHERE
produit='Affiche' AND
format='1000 x 707 mm DIN B1' AND
quantite='3000 exemplaires' AND
pages='default' AND
grammage='170 gr/m²' AND
impression='default' AND
impression='default' AND
finition='default' AND
pelliculage='default' AND
impression_cover='default' AND
grammage_cover='default' AND
delais='8'
J'ai une erreur de syntax...
Code :
1
2
3
Erreur SQL !
delais='2'
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 'delais='2'' at line 1
Ma base
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE IF NOT EXISTS `data_prices` (
  `produit` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `format` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `grammage` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `impression` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `pelliculage` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `finition` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `pages` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `impression_cover` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `grammage_cover` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `quantite` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `delais` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `prix` float NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Merci d'avance
Rem693 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 23h34   #2
Modérateur
 
Avatar de Vil'Coyote
 
Développeur Web
Inscription : février 2008
Messages : 3 302
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : février 2008
Messages : 3 302
Points : 4 480
Points : 4 480
as tu testé ta requête de phpmyadmin pour vérifier que tu as bien des enregistrement et que ta requête est bonne ?
Vil'Coyote est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/03/2011, 00h09   #3
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Il faut que tu reprennes la logique même de ce que tu fais.
Ici tu parcours ton panier en ajoutant des conditions sur les critères de tous les produits du panier.

Tu vois bien que ça n'a aucun sens car tu te retrouves par exemple ici avec les quantités des 3 produits du panier ; imagine si en plus elles sont différentes.
Il faut déterminer ton prix pour chaque produit indépendamment.

De plus stocker un valeur numérique sous la forme "300 exemplaires" est vraiment une aberration.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 01h22   #4
Invité régulier
 
Inscription : octobre 2009
Messages : 25
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : octobre 2009
Messages : 25
Points : 6
Points : 6
Par défaut re

Ma requête est valide dans phpmyadmin, elle me retourne bien le prix...
Je désire récupere le prix pour une vérification car j'affiche un prix qui vient d'un array en js que je génère avec les données de ma DB

sabotage : de qu'elle valeur numérique tu me parle... toutes mes données sont des chaines de caractères.
De plus ma logique est correct,je cherche uniquement a vérifier le prix.
Forcement mon prix est déja stocker dans ma db...
Rem693 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 01h54   #5
Membre régulier
 
Homme Benjamin Dubois
Chef de projet NTIC
Inscription : février 2008
Messages : 65
Détails du profil
Informations personnelles :
Nom : Homme Benjamin Dubois
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : février 2008
Messages : 65
Points : 99
Points : 99
Salut,

A première vue, il manque le point-virgule de ta requête (phpMyAdmin l'ajoute automatiquement). C'est peut-être la cause de ton erreur...


Pour le message de sabotage, il cible ta colonne 'quantite' : le fait d'ajouter "exemplaires" dans la colonne te force à la typer en varchar, alors qu'en stockant simplement le nombre d'exemplaires, tu pourrais en faire une colonne de type INT, rendant les requêtes de sélection beaucoup plus performantes (Les nombres sont plus simples à trier que l'alphabet).

De plus, il est vrai que ta table semble ne semble pas correctement modélisée (c'est ce que je comprends de la première partie de son message). En effet, une base de données est souvent utilisée comme un simple tableau (il semble que ce soit le cas pour toi, d'après le code que tu nous montres), mais c'est une erreur : le but d'une base de données est d'exploiter au mieux les relations que l'on peut faire entre les données que l'on y stocke.

Si tu souhaites obtenir plus d'infos, voici un article qui semble assez complet sur une technique assez répandue de modélisation de bases de données :

http://sqlpro.developpez.com/cours/modelisation/merise/
monsieurben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 02h00   #6
Invité régulier
 
Inscription : octobre 2009
Messages : 25
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : octobre 2009
Messages : 25
Points : 6
Points : 6
Par défaut re

Dans mon cas, ma db me sert uniquement a la génération de mes array en javascript du genre :
Code :
1
2
3
4
5
6
7
8
9
10
11
arrayProductOptions=[
{
"t":"500 x 700 mm",
"image":"image37.jpg",
"grammage":
 [{"t":"115 gr/m²","impression":[{"t":"4 couleurs Recto","pelliculage":[{"finition":[{"quantity":[{"t":"1 exemplaire","delay":[{"t":"3","v":"200"}]},{"t":"2 exemplaires","delay":[{"t":"3","v":"400"}]},{"t":"3 exemplaires","delay":[{"t":"3","v":"600"}]},{"t":"4 exemplaires","delay":[{"t":"3","v":"800"}]}]}]}]}]}]},
{
"t":"700 x 1000 mm",
"image":"image42.jpg",
"grammage":
 [{"t":"115 gr/m²","impression":[{"t":"4 couleurs Recto","pelliculage":[{"finition":[{"quantity":[{"t":"1 exemplaire","delay":[{"t":"3","v":"340"}]},{"t":"2 exemplaires","delay":[{"t":"3","v":"640"}]},{"t":"3 exemplaires","delay":[{"t":"3","v":"980"}]},{"t":"4 exemplaires","delay":[{"t":"3","v":"1320"}]}]}]}]}]}]}];
Cependant pour éviter que l'utilisateurs ne change les prix dans le fichier array je voudrais le vérifier dans ma db
Voici la petite explication pour la DB


Pour l'exporte de DB http://www.business-insight.com/html.../Anatella.html
Rem693 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h02.


 
 
 
 
Partenaires

Hébergement Web