Page 1 sur 1

Undefined index... problème avec isset

Posté : 24 nov. 2008, 20:00
par baal666
Bonjour,

Je suis en train d'apprendre le PHP, et j'ai de la difficulté avec l'utilisation (ou non) de la variable isset.

Voici le code problématique:

Code : Tout sélectionner

<?php if (isset($_POST['submitted'])) { if (($_POST['submitted']) && (!$_GET['modify_id'])) { $category=($_POST['category']); $topic_name=($_POST['topic_name']); $topic_description=($_POST['topic_description']); $topic_url=($_POST['topic_url']); mysql_query ("INSERT into ref_links (ref_categories_id, topic_name, topic_desc,topic_url) VALUES ('$category','$topic_name','$topic_description','$topic_url')", $connectID) or die ("Unable to insert record into database"); print "Record successfully added"; } elseif ((!$_POST['submitted']) && ($_GET['modify_id'])) { $id=($_GET['modify_id']); $thisRecord = mysql_query ("SELECT ref_links.*, ref_categories.category_name,ref_categories.id AS cat_id FROM ref_links, ref_categories WHERE ref_categories.id = ref_links.ref_categories_id AND ref_links.id = '$id'",$connectID) or die ("Can't read this record."); while ($record_data = mysql_fetch_array ($myResult, MYSQL_ASSOC)) { foreach ($record_data as $key => $value) { print "$key => $value<br/>"; } } } elseif (($_POST['sumbitted']) && ($_GET['modify_id'])) { } } ?>
À l'origine, dans le manuel que je consulte, la partie avec isset n'existait pas, et je l'ai rajoutée pour essayer de faire fonctionner le code avec DreamWeaver et EasyPHP, mais je n'y arrive pas.

Voici le message que j'obtiens après avoir rempli le formulaire:

Notice: Undefined index: modify_id in C:\Program Files.... on line 7

Quelqu'un peut m'aider?

Merci!

Re: Undefined index... problème avec isset

Posté : 24 nov. 2008, 20:13
par Victor BRITO
Voici le message que j'obtiens après avoir rempli le formulaire:

Notice: Undefined index: modify_id in C:\Program Files.... on line 7

Quelqu'un peut m'aider?
Pourrais-tu montrer la ligne de code incriminée par le message d'erreur ?

Soit dit en passant, pour afficher du code PHP, sache que tu as à ta disposition les balises BBCode PHP :

Code : Tout sélectionner

[php] [/php]
qui permettent de colorer syntaxiquement, pour ainsi dire, le code PHP, ce qui facilite grandement l'analyse du code. ;)

Posté : 24 nov. 2008, 20:15
par Aureusms
Il te dis que $_GET['modify_id'] n'existe pas!!

Ta ligne

Code : Tout sélectionner

if (($_POST['submitted']) && (!$_GET['modify_id']))
veux dire :

Code : Tout sélectionner

Si $_POST['submitted'] est vrai et $_GET['modify_id'] est faux

Posté : 24 nov. 2008, 20:43
par baal666
Merci pour vos réponses.

La ligne 7 est
	if (($_POST['submitted']) && (!$_GET['modify_id']))
Je suis vraiment un débutant. Je suis pas à pas le livre « Coder pour le web » de Charles Wyke-Smith et celui-ci ne tient simplement pas compte de isset nulle part, ce qui veut dire que j'ai dû l'ajouter moi-même à quelques endroits pour que ça fonctionne.

La partie de code originale est
if (($_POST['submitted']) && (!$_GET['modify_id'])) {
	// the user has submitted a new listing
	$category=($_POST['category']);
	$topic_name=($_POST['topic_name']);
	$topic_description=($_POST['topic_description']);
	$topic_url=($_POST['topic_url']);
  //write to database
	mysql_query ("INSERT into ref_links (ref_categories_id, topic_name, topic_desc, topic_url) VALUES ('$category', '$topic_name', '$topic_description', '$topic_url')", $connectID)
  or die ("Unable to insert record into database");
	print "Record successfully added";
	
} elseif  ((!$_POST['submitted']) && ($_GET['modify_id'])) {
       // the admin page has passed ID of record to be updated
			 $id = ($_GET['modify_id']);
			 	$this_Record = mysql_query("SELECT ref_links.*,ref_categories.category_name, ref_categories.id AS cat_id FROM ref_links, ref_categories WHERE ref_categories.id = ref_links.ref_categories_id AND ref_links.id = '$id'", $connectID)
				or die ("Can't read the this record.");
while ($record_data = mysql_fetch_array($this_Record, MYSQL_ASSOC)) {
foreach ($record_data as $key => $value) {
	print "$key => $value<br />";
	}
} // end while loop
} elseif  (($_POST['submitted']) && ($_GET['modify_id'])) {
       // the user has submitted the form to update a listing
} else {
// The user has loaded the page to enter a new listing
// do nothing - just let the page load
}
mais ça ne fonctionne pas.


@Aureusms: Je ne suis pas certain de bien comprendre ce que vous voulez dire...


En fait, ce que je dois tester, c'est une réponse envoyée à partir d'un page différente et qui passe par la page ci-haut pour inscrire des infos dans MySQL.

Le code de l'autre page est le suivant
<?php include ("connection_to_database_open.php");

if (isset($_GET['delete_id']))
{
         

if ($_GET['delete_id'])
	{
    $id=($_GET['delete_id']);
    $success=mysql_query ("DELETE FROM ref_links WHERE id=$id",$connectID)
    	or die ("Unable to delete record from database");
	if ($success)
		{
		print "Record successfully deleted";
		}
	}
}
?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Links Admin</title>
</head>
<body>
<?php
//query the database
$myResult = mysql_query('SELECT ref_links.*, ref_categories.category_name FROM ref_links, ref_categories WHERE ref_links.ref_categories_id=ref_categories.id', $connectID)
  or die ("Unable to select from database");
//loop through the returned records

print '<table border="1">'."\n";
while ($row = mysql_fetch_array($myResult, MYSQL_ASSOC)) {
	//category heading only written out if a listing is in diff cat from previous listing
//$thisCat is used to test if a new heading needs to be written out
   $thisCat= $row['category_name'];
   $lastCat='';

   if ($lastCat<>$thisCat) { // true first time($lastCat not set), and each time a new category is found
 //then write out a table heading with the category name
 			print '<th colspan="6" align="left">'; //heading spans all columns of table
			print "<h3>".$row['category_name']."</h3>";  // print the next category heading
			print "</th>\n";
	 }
	 print '<tr>';

   print '<tr>'."\n";
	 print '<td>'.$row['topic_name'].'</td>'."\n";
	 print '<td class="description">'.$row['topic_desc'].'</td>'."\n";
	 print '<td><a href="'.$row['topic_url'].'" target="_blank">'.$row['topic_url'];
	 print'</a></td>';
	 
	  
	 
	 $id =$row['id'];
	 
	 print '<td><a href="links_form.php?modify_id='.$id.'">Edit</td>';
	 
	 print '<td><a href="';
	 print ($_SERVER['PHP_SELF']);
	 print '?delete_id='.$id.'">Delete</a></td>';
	 
	 print '</tr>'."\n";
	 
	 // finally, we store the current category so next time the loop repeats,
	// we can tell if the next item is in a new category or not
	// if so, we write out a new heading	- see if ($lastCat<>$thisCat) above
	$lastCat = $row['category_name'];
}

print '</table>'."\n";
?>
</body>
</html>















<?php include ("connection_to_database_close.php");?>
Désolé pour la longueur du code. J'imagine que des gens qui s'y connaissent plus que moi verront immédiatement où est le problème! Merci beaucoup..


Post Scriptum -> Est-ce que je peux essayer d'utiliser isset pour les deux variables, pour que
if (($_POST['submitted']) && (!$_GET['modify_id']))
soit setté pour les deux? e.g. Quelque chose comme
if (isset($_POST['submitted']) && (!$_GET['modify_id']))
??

Merci

Posté : 25 nov. 2008, 22:07
par Aureusms
Bien je vais t'aider à traduire :
if (($_POST['submitted']) && (!$_GET['modify_id']))
Si la variable "submitted" envoyée par un formualire en mode POST (voir les balises HTML <FORM> </FORM>) est vrai et si la variable modify_id présente dans l'url (sous la forme : http://www.monsite.com/index.php?modify_id=false) est fausse (false en anglais) alors exécute la suite.

Là tu as ($_GET['modify_id']) qui n'existe pas aussi je pense que dans ton url de ton formulaire tu n'as pas cette variable GET.

Si tu comprend rien à ce que j'écris, vérifie dans ton début de formulaire si tu as :

Code : Tout sélectionner

<form action="formulaire.php?modify_id=false" method="POST" >
où formulaire.php est le fichier qui t'indique l'erreur à la ligne 7

Posté : 25 nov. 2008, 23:39
par AB
Euh je connais pas ton livre mais un livre d'initiation à php qui ne mentionne pas isset() ... :roll:
ça doit être une nouvelle méthode d'apprentissage de ne pas commencer par l'essentiel :mrgreen:

Bref, si tu bloques, ferme ton livre, achètes en un autre ou vas sur le web.

Deux bonnes adresses pour commencer :

http://www.phpdebutant.org/ (colonne de droite)
http://www.siteduzero.com/

Si tu commences à coder sans connaître les bases, ça va devenir un bin's inextricable :wink:

Posté : 26 nov. 2008, 00:49
par baal666
@Aureusms: J'ai un code semblable dans une autre page web:
print '<td><a href="links_form.php?modify_id='.$id.'">Edit</td>';
En fait, j'ai deux pages, que j'ai montré dans mon dernier message. La première est links_form.php et la deuxième est links_admin.php . En fait ce qui doit se produire c'est que quand je clique sur « edit » dans links_admin.php ça doit m'envoyer sur links_form.php avec les anciennes données déjà rentrées. Là où j'en suis, c'est d'essayer d'établir les différentes façons d'accéder à links_form.php:

1) Page chargée pour nouvelle liste;
2) Formulaire envoyé;
3) Formulaire modifé;
4) Formulaire envoyé + id de modification;

Et le problème c'est que si $_GEt['modify'] n'est pas initié ça ne fonctionne pas du tout. Et j'ignore comme l'initier, même avec isset...

@AB: Au début il a été un peu question de isset() et je l'ai utilisé pour contourner des variables non-initialisées ailleurs dans le livre. Mais dans ce cas-ci j'ignore comment l'utiliser pour les 4 possibilités de connections sur la page...

Merci pour les liens, je vais regarder ça. Mais j'aime bien avoir un livre physique aussi.. En aurais-tu un à me conseiller? Merci

Posté : 26 nov. 2008, 14:45
par AB
Peut-être alors que tu as passé un peu vite les premières étapes... Essayes de faire les tutos des sites mentionnés et si tu y arrives assez vite c'est que ton livre t'a mis sur la bonne voie.
Sinon il y a le livre "PHP5 avancé", mais je ne sais pas dans quelle mesure il est adapté aux débutants.

L'important n'est pas de tout savoir mais d'avoir suffisamment de bases pour être à même de comprendre assez facilement de nouvelles méthodes ou de nouveaux scripts.

Par exemple, j'ai fais un tuto d'inscription et de connexion dans un espace membre qui s'adresse à des débutants. Tu devrais être en mesure de le comprendre assez facilement avant de t'attaquer à des choses plus compliquées.

Et puis tu utilises if ($_POST['submitted'])... if (!$_GET['modify_id']) sans apparemment savoir à quoi cela correspond. C'est à mon avis une très mauvaise méthode que d'utiliser cette syntaxe surtout pour les débutants, d'autant plus qu'il existe dans ce contexte, des équivalents beaucoup plus clairs avec isset() et empty() qu'il est essentiel de connaître. Donc utilises le manuel php pour connaître ces définitions.

Posté : 26 nov. 2008, 21:43
par Aureusms
Côté bouquin j'ai tout appris avec "PHP5 avancé" de éditions EYROLLES (je crois que cela s'écrit comme cela) décrit par AB. Il est adapté au débutant car je ne connaissais rien du PHP avant lui (maintenant je fais de l'ajax pour te dire... mais j'ai du appendre javascript aussi qui ressemble beaucoup à PHP).

Essaye d'abord de comprendre comment fonctionne un formulaire. Ne saute pas d'étape car sinon tes scripts marcheront mais avec peut-être des failles de sécurité.

Pour ton lien :

Code : Tout sélectionner

<td><a href="links_form.php?modify_id='.$id.'">Edit</td>
.

Vu ton code, cela ne peut pas marcher : quand tu cliques vers links_form.php tu initialise (même si je n'aime pas ce terme) la variable "modify_id" qui prends la valeur "$id". Donc dans ta page links_form.php tu peux mettre :
$valeur = $_GET["modify_id"]; 
et donc la variable $_GET["modify_id"] existera (sera selon la fonction isset = vrai, true)

Ainsi la variable $valeur prendra la valeur $id (i.e. si $id = 3, $valeur = 3).
Ton problème : n'importe qui peut mettre n'importe quelle valeur à $id => faille de sécurité.
Surtout tu n'indiques pas de variable $_POST avec ce genre de lien car tu ne proviens pas d'un formulaire. Donc ton code précédent ne peut pas fonctionner... car pas de POST...

Achète le bouquin c'est très bien décris dedans. Sinon il y a tout plein de ressources sur internet sur tout cela. Cependant je te rejoins je préfère aussi les bouquins...