8795 sujets

Développement web côté serveur, CMS

ReBonjour !

Me revoilà bloqué,

j'ai 2 tables, une ITEM l'autre SUPPLIER :

ITEM (simplifier)
IDItem
supplierItem (c'est un nombre)


SUPPLIER
IDSupplier (commençant à 1)
nameSupplier


sachant que supplierItem est une clé étrangère de IDSupplier (c'est des nombres)

Voici le formulaire :


<form action="<?php $_SERVER['PHP_SELF'] ?>" method="post">

		<!--cost-->
		<label for="coastItem">Prix</label> : 
		<input type="text" name="coastItem" id="coastItem" tabindex='10' /><br />		
                
		<!--supplier-->
		<label for="supplierItem">Supplier : </label>
		<?php
			$req = db_query("SELECT DISTINCT supplierItem, nameSupplier  
							FROM SUPPLIER, ITEM 
							WHERE nameSupplier = supplierItem") 
				or die(" Erreur lors de la requête : " . db_error());
			echo "<SELECT NAME='nameSupplier' onChange='FocusObjet()' tabindex='80' >"; 
			while ($result = db_fetch_array($req)) {
				echo "<OPTION VALUE='$result[0]'>$result[1]</OPTION>\n";
			}
			echo "</SELECT>"; 
			
		?>
		<p><input type="submit" value="Valider" /></p>
	</form>




l'affichage est juste, j'ai bien les nom des fournisseurs dans une liste déroulante,

maintenant il faut insérer les résultats dans une base :



	if (isset($_POST['coastItem'])) {
	db_query("INSERT INTO ITEM VALUES
		('','$_POST[coastItem]',
		'$_POST[supplierItem]') //c'est la ligne 17, pour après
	")
		 or	die('Error: ' . mysql_error());
	echo "1 record added";

	if (!empty($_POST)) 
	{
		echo '<pre>';
		print_r($_POST);
		echo '</pre>';
	}
	
	}


et voici l'affichages :

a écrit :

Notice: Undefined index: supplierItem in C:\Program Files\EasyPHP5.3.0\www\itemsAdd.php on line 17
1 record added

Array
(
[costItem] => 1596
[nameSupplier] => 0 //remarquer le zero, alors que les ID commence à 1
)




Donc finalement, l'erreur ne serai pas du à l'utilisation de la variable $result[] ?
Modifié par maryooman (09 Nov 2009 - 16:45)
Commences par tester ta requête dans phpmyadmin par exemple pour voir s'il elle te renvoies bien les données que tu souhaites.

D'ailleurs concernant ta requête si j'ai bien compris ton modèle, une jointure serait la bienvenue.

SELECT ITEM.supplierItem, SUPPLIER.nameSupplier FROM ITEM JOIN SUPPLIER ON ITEM.supplierItem = SUPPLIER.IDSupplier
en fait je préfère rester sur du SQL "classique", celui de mySQL je ne le trouve pas très jolie ...

en plus c'est une très bonne idée de tester sur phpmyadmin (pardonnez moi je suis débutant)

et voici le résutat :

SELECT DISTINCT supplierItem, nameSupplier
FROM SUPPLIER, ITEM
WHERE nameSupplier = supplierItem

m'affiche :

supplierItem nameSupplier
0 Fujitsu
0 Logitech
0 Orange


donc dans la table SUPPLIER, se sont les 3 champs qui sont affiché, c'est le résultat recherché pour qu'ils apparaissent dans la liste déroulante,

mais pour supplierItem, cette clé étrangère qui se trouve dans ITEM, il y a un problème ...

Je suis pourtant allé dans la table ITEM --> Gestion des relations et pour supplierItem j'ai choisi supplier.IDSupplier


...................................


idée de dernière minute :

pourquoi ne pas remplacer la requête par :

"SELECT DISTINCT IDSupplier, nameSupplier FROM SUPPLIER"

IDSuplier et nameSupplier ont la même nature,

et finalement le résultat est juste, par contre il y a un blocage .... Smiley sweatdrop


la requête :

		<?php
			$req = mysql_query("SELECT DISTINCT IDSupplier, nameSupplier  
							FROM SUPPLIER") 
				or die(" Erreur lors de la requête : " . db_error());
			echo "<SELECT NAME='nameSupplier' onChange='FocusObjet()' tabindex='80' >"; 
			while ($result = db_fetch_array($req)) {
				echo "<OPTION VALUE='$result[0]'>$result[1]</OPTION>\n";
			}
			echo "</SELECT>"; 
			
		?>


l'affichage et introduction dans la base :

	if (isset($_POST['costItem'])) {
	mysql_query("INSERT INTO ITEM VALUES
		'$_POST[coastItem]',
		'$_POST[supplierItem]')    //ligne 17 pour après
	")
		 or	die('Error: ' . mysql_error());
	echo "1 record added";

	if (!empty($_POST))
	{
		echo '<pre>';
		print_r($_POST);
		echo '</pre>';
	}



et l'affichage :

a écrit :

Notice: Undefined index: supplierItem in C:\Program Files\EasyPHP5.3.0\www\itemsAdd.php on line 17
1 record added

Array
(
[costItem] => 321
[nameSupplier] => 1
)



maintenant que le numéro du fournisseur est bien présent, pourquoi il y a une erreur "d'index" ?
Le requête que je t'ai proposée est en SQL classique, je ne vois pas le problème. Smiley rolleyes

Pour ton erreur j'ai du mal à comprendre tes tables mais à mon avis tu devrais revoir la syntaxe de ta requête d'insertion.
INSERT INTO ITEM (`IDItem`, `coastItem`, `supplierItem`) VALUES ('','$_POST[coastItem]', '$_POST[supplierItem]')

Mais ça serait plus simple de te répondre si on avait le schéma complet de tes tables.
Quel est le SQL classique ... je ne sais pas^^ enfin bref

CREATE TABLE IF NOT EXISTS `item` (
`IDItem` int(11) NOT NULL AUTO_INCREMENT,
`costItem` int(11) NOT NULL,
`supplierItem` int(11) NOT NULL,
PRIMARY KEY (`IDItem`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;


INSERT INTO `item` (`IDItem`, `costItem`, `supplierItem`) VALUES
(1, 1200, 1),
(2, 950, 1),
(3, 75, 2),



CREATE TABLE IF NOT EXISTS `supplier` (
`IDSupplier` int(11) NOT NULL AUTO_INCREMENT,
`nameSupplier` varchar(15) NOT NULL,
PRIMARY KEY (`IDSupplier`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;


INSERT INTO `supplier` (`IDSupplier`, `nameSupplier`) VALUES
(1, 'Fujitsu'),
(2, 'Logitech'),
(3, 'Orange');




Donc voilà,


je souhaite insérer dans Items des lignes rempli par un formulaire.


et les requêtes que j'ai montré jusqu'à présent m'insèrent une ligne, mais avec supplierItem=0, ce qui est faux!

petite remarque, en générant le code sql avec phpmyadmin, je ne constate pas qu'il y a de lien entre les 2 table, c'est à dire supplierItem une clé étrangère ....
Modifié par maryooman (10 Nov 2009 - 16:19)
Voici les requêtes adéquates :
SELECT item.costItem, supplier.nameSupplier FROM item JOIN supplier ON item.supplierItem = supplier.IDSupplier;

INSERT INTO item (`costItem`,`supplierItem`) VALUE ('$costItem','$supplierItem');

Où $costItem est le prix renvoyé par le formulaire et $supplierItem, l'id du supplier (la valeur renvoyé par le select).


Au passage pour des raison de sécurité, il ne faut jamais insérer les variables $_POST['ma_variable'] dans une requête SQL, il faut traiter la variable avec la fonction mysql_real_escape_string().
ReBonjour !

1)Même avec tes requête, j'ai encore cette erreur :

Notice: Undefined index: supplierItem in C:\Program Files\EasyPHP5.3.0\www\itemsAdd.php on line 18

et il insert 0 dans nameItem

2) le select choisi choisi ça :

costItem nameSupplier
1024 Fujitsu
950 Fujitsu
75 Fujitsu
13 Fujitsu
13 Fujitsu
13 Fujitsu
13 Fujitsu
13 Fujitsu
13 Fujitsu
159 Orange
1024 Fujitsu


et moi je veux


IDSupplier nameSupplier
1 Fujitsu
2 Logitech
3 Orange


d'ou la requête :

SELECT IDSupplier, nameSupplier
FROM SUPPLIER


ce qui change rien, dans nameSupplier il insert toujours 0 !!


je vais changer le sens des jointure pour voir
non en fait on ne peut pas^^



Relation internes

supplierItem supplier.IDSupplier


en tout cas je n'ai pas de pb de ce coté je pense


je vais le refaire au propre, et je reviens
je suis allé dans structure -> +Détails (tout en bas) -> Puis j'ai modifier le nom de l'index

quand on regarde l'erreur que j'avais : Undefined index, il est possible que c'est à cause de ça.

Pour l'instant sa marche Smiley biggrin

Je te remercie moust pour m'avoir donné de l'aide.

A bientôt peut être Smiley cligne