PHP Notice: undefined index

Discussioni e problematiche sul linguaggio PHP

Moderatori: maurizio, markdesign

Regole del forum
Per scrivere del codice all'interno di ogni post, utilizzare il tag: [syntax=il_linguaggio]codice[/syntax] sostituendo "il_linguaggio" con il linguaggio del codice che dovete inserire, ad esempio: html, css, javascript, php, asp, ecc...

PHP Notice: undefined index

Messaggioda Tizionario » domenica 29 maggio 2011, 18:57

Ciao a tutti,
ho un piccolo problema con questo metodo:
Sintassi: php [ Scarica ] [ Nascondi ]
  1.                 public function InsertContact()
  2.                 {
  3.                         $nome = $_POST['nome'];
  4.                         $cognome = $_POST['cognome'];
  5.                         $numero = $_POST['numero'];
  6.                         $this->ValidateForm($nome,$cognome,$numero);
  7.                         //preparo la query sql per l'inserimento del database
  8.                         //e la inserisco in una variabile
  9.                         $sql = "INSERT INTO rubrica_telefonica (nome,cognome,numero) VALUES ('$nome','$cognome','$numero')";
  10.                        
  11.                         //eseguo finalmente la query
  12.                         mysql_query($sql, $this->conn);
  13.        
  14.                         echo "<script type=\"text/javascript\">
  15.                                 if(confirm(\'Vuoi aggiungere un altro contatto?\'))
  16.                                 {
  17.                                         location.href=\'insert.php\';                          
  18.                                 }else location.href=\'showall.php\';
  19.                                 </script>";
  20.                 }
  21.  


che viene chiamato all'invio del seguente form:
Sintassi: html [ Scarica ] [ Nascondi ]
  1. <form class="cb" action="insert_data.php" method="post">
  2.         <label for="nome">Nome:</label>
  3.         <input type="text" maxlenght="20" name="nome" /><br />
  4.         <label for="cognome">Cognome:</label>
  5.         <input type="text" maxlenght="20" name="cognome" /><br />
  6.         <label for="numero">Numero di Telefono:</label>
  7.         <input type="text" maxlenght="15" name="numero" /><br />
  8.         <input type="submit" value="inserisci" />
  9. </form>
  10.  

naturalmente la chiamata al metodo avviene nella pagina insert_data.php tramite l'istruzione:
Sintassi: php [ Scarica ] [ Nascondi ]
  1. $contact->InsertContact();


Fino a stamattina funzionava tutto correttamente, stranamente questa sera, senza aver apportato modifiche al metodo InsertContact() e tantomeno a ValidateForm() (che si occupa solo di controllare che i dati passati dal form siano coerenti con delle espressioni regolari), non funziona più e i log di apache riportano questi tre errori:


[Sun May 29 18:31:18 2011] [error] [client 127.0.0.1] PHP Notice: Undefined index: nome in /var/www/rubrica/include/contactlist.class.php on line 189
[Sun May 29 18:31:18 2011] [error] [client 127.0.0.1] PHP Notice: Undefined index: cognome in /var/www/rubrica/include/contactlist.class.php on line 190
[Sun May 29 18:31:18 2011] [error] [client 127.0.0.1] PHP Notice: Undefined index: numero in /var/www/rubrica/include/contactlist.class.php on line 191


le linee 189,190e 191 corrispondono appunto alla dichiarazione delle variabili in InsertContact().

Qualcuno sa aiutarmi? Inizio a non capirci nulla, mi sembra tutto corretto.
Tizionario

Avatar utente
 
Messaggi: 101
Iscritto il: venerdì 3 dicembre 2010, 10:47
Località: Taranto

Re: PHP Notice: undefined index

Messaggioda oly1982 » martedì 31 maggio 2011, 10:10

Il codice che hai postato non è sufficiente per fornirti una risposta.

In generale il tipo di notice che ti compare è dovuto all'inesistenza dell'elemento dell'array con una determinata key.
Ovvero "Undefined index: nome" significa che non esiste l'elemento dell'array con chiave "nome".

Se dovessi fare un'ipotesi credo che dipenda dal fatto che esegui il metodo InsertContact() senza assicurarti che vi sia stato il submit del form... ma senza vedere il codice completo questa rimane un'ipotesi.

-----

Inoltre se posso darti altri consigli ti direi (oltre che articolare meglio la classe):
- valorizzare $nome, $cognome, $numero con l'operatore ternario;
- verificare che siano sintatticamente corretti (regex) e in caso errato evitare l'inserimento;
- essendo delle stringhe di direi di applicare su di esse mysql_real_escape_string.
oly1982

Avatar utente
 
Messaggi: 15
Iscritto il: mercoledì 30 marzo 2011, 14:45
Località: Caserta - Benevento

Re: PHP Notice: undefined index

Messaggioda Tizionario » martedì 31 maggio 2011, 14:18

Ciao Oly e grazie per la risposta :)

Procediamo per gradi:
in allegato ho caricato il file contenente tutta la classe che sto provando a sviluppare (premetto che con la oop ho iniziato da poco).

La variabile $nome non è un indice di un array ma una vera e propria variabile, e stamattina lo stesso errore lo sto avendo con la variabile $message presente in GetAlarms(), non capisco proprio il motivo di questo errore, visto che senza modificare nulla funzionava :(

Il confronto con le regex lo effettuo nel metodo ValidateForm(). Una precisazione: da quando ho deciso di aggiungere l'apostrofo alla regex del cognome (per poter inserire cognomi come De' Paperoni), questa ha smesso di funzionare, anche se, provandola con un po' di tools online, sembra essere corretta.

L'uso di Mysql_real_escape_string l'ho messo in conto, appena risolvo questa storia lo implemento.



P.S.: Una cosa strana che ho notato è che a volte i dati nel database li inserisce comunque, solo che non riesce a riconoscere il codice javascript inserito alla fine di InsertContact()



Grazie per la disponibilità
Allegati
contactlist.class.zip
(2.63 KiB) Scaricato 10 volte
Tizionario

Avatar utente
 
Messaggi: 101
Iscritto il: venerdì 3 dicembre 2010, 10:47
Località: Taranto

Re: PHP Notice: undefined index

Messaggioda oly1982 » martedì 31 maggio 2011, 19:01

Tizionario ha scritto:La variabile $nome non è un indice di un array ma una vera e propria variabile

...$_POST['nome']...

Iniziamo con l'insert...
ebbene io farei così (non testato):
Sintassi: php [ Scarica ] [ Nascondi ]
  1. <?php
  2. class ContactList{
  3.         protected $conn = FALSE;
  4.         /*input dell'utente*/
  5.         protected $nome;
  6.         protected $cognome;
  7.         protected $numero;
  8.  
  9.         public function __construct(){
  10.                 $this->DBConnect();
  11.                 }
  12.         private function DBConnect(){
  13.                 $this->conn = mysql_connect(HOST,DB_USER,DB_PASSWORD) or die ("<p>Impossibile connettersi al server MySQL</p>");
  14.                 mysql_select_db(DB,$this->conn);
  15.                 }
  16.        
  17.         public function InsertContact(){
  18.                 // valorizzo tramite operatore ternario
  19.                 // se esiste ok altrimenti vuota
  20.                 $this->nome     = isset($_POST['nome']) ? $_POST['nome'] : '';
  21.                 $this->cognome  = isset($_POST['cognome']) ? $_POST['cognome'] : '';
  22.                 $this->numero   = isset($_POST['numero']) ? $_POST['numero'] : '';
  23.                 if($this->validate_input()==TRUE){ // se validazione andata a buon fine
  24.                         // eseguo insert
  25.                         $this->query_insert();
  26.                         return TRUE;
  27.                         }
  28.                 return FALSE;
  29.                 }
  30.        
  31.         /*
  32.         semplice esecuzione della query
  33.         */
  34.         protected function query_insert(){
  35.                 $sql = "
  36.                                 INSERT INTO rubrica_telefonica (nome,cognome,numero)
  37.                                 VALUES
  38.                                 ('".mysql_real_escape_string($this->nome)."',
  39.                                 '".mysql_real_escape_string($this->cognome)."',
  40.                                 '".mysql_real_escape_string($this->numero)."')";
  41.                 mysql_query($sql, $this->conn);
  42.                 }
  43.         /*
  44.         i tre metodi per validare i tre componenti...
  45.         public così puoi fare validazioni ajax
  46.         */
  47.         public function validate_nome($s){
  48.                 $regex = "/^[a-zA-Z]{3,20}$/";
  49.                 return preg_match($s,$regex);
  50.                 }
  51.        
  52.         public function validate_cognome($s){
  53.                 $regex = "/^[A-Za-z \'-]{3,20}$/i"; // non testata...
  54.                 return preg_match($s,$regex);
  55.                 }
  56.        
  57.         public function validate_numero($s){
  58.                 $regex = "/^(\+)?[0-9]{8,15}$/";
  59.                 return preg_match($s,$regex);
  60.                 }
  61.        
  62.         /*validazione degli input... una sorta di somma dei tre*/
  63.         protected function validate_input(){
  64.                 if(!$this->validate_nome($this->nome)){
  65.                         // nome non valido
  66.                         return FALSE;
  67.                         }
  68.                 else if(!$this->validate_cognome($this->cognome)){
  69.                         // cognome non valido
  70.                         return FALSE;
  71.                         }
  72.                 else if(!$this->validate_numero($this->numero)){
  73.                         // numero non valido
  74.                         return FALSE;
  75.                         }
  76.                 return TRUE;
  77.                 }
  78.        
  79.         /*
  80.         nel tutorial di maurizio vi è un unico metodo per mostrare
  81.         i record presenti...
  82.         io preferisco dividere la formattazione html dall'estrazione
  83.         in estrazione costruisco un array
  84.         */
  85.         public function Get_Array_Rubrica(){
  86.                 $sql = "SELECT id,nome,cognome,numero FROM rubrica_telefonica";
  87.                 $res = mysql_query($sql,$this->conn) or die(mysql_error());
  88.                 $rubrica = array();
  89.                 while($row = mysql_fetch_array($res)){
  90.                         $rubrica[$row['id']] = array(
  91.                                                                 'nome' => stripcslashes($row['nome']),
  92.                                                                 'cognome' => stripslashes($row['cognome']),
  93.                                                                 'numero' => stripcslashes($row['numero'])
  94.                                                                 );
  95.                         }
  96.                 return $rubrica;
  97.                 }
  98.        
  99.         public function Print_Rubrica(){
  100.                 $array = $this->Get_Array_Rubrica();
  101.                 if(count($array)==0){
  102.                         echo '<p>Non è presente nessuno in rubrica!';
  103.                         }
  104.                 else{
  105.                         echo '<table border="1">
  106.                                         <tr>
  107.                                                 <td>Nome</td>
  108.                                                 <td>Cognome</td>
  109.                                                 <td>Numero</td>
  110.                                                 <td></td>
  111.                                                 <td></td>
  112.                                         </tr>';
  113.                         foreach($array as $id => $value){
  114.                                 list($nome, $cognome, $numero) = $value;
  115.                                 echo '<tr>
  116.                                                 <td>'.$nome.'</td>
  117.                                                 <td>'.$cognome.'</td>
  118.                                                 <td>'.$numero.'</td>
  119.                                                 <td><a href="modify.php?id='.$id.'" title="Modifica informazioni su "'.$nome.' '.$cognome.'">[modifica]</a></td>
  120.                                                 <td><a onclick="return confirm(\'Sei sicuro di voler cancellare questo record?\')" href="delete.php?id='.$id.'" title="Elimina informazioni su "'.$nome.' '.$cognome.'">[cancella]</a></td>
  121.                                         </tr>';
  122.                                 }
  123.                         echo '</table>';
  124.                         }
  125.                 }
  126. }
  127. ?>
oly1982

Avatar utente
 
Messaggi: 15
Iscritto il: mercoledì 30 marzo 2011, 14:45
Località: Caserta - Benevento


Torna a PHP