[PHP][RISOLTO] Errore di tipo Notice: Undefined index - Come risolvere quando si hanno tante var

  • Creatore Discussione Creatore Discussione elpirata
  • Data di inizio Data di inizio

elpirata

Utente Attivo
18 Mar 2009
264
7
18
Buonasera,
ho un file denominato salva_commessa.php che recupera tante varibili traminte _POST ed esegue una query di insert, fintanto che il controllo errori php era disabilitato io non vedevo nessun NOTICE, ma adesso che sto lavorando in locale mi sono reso conto che non appena eseguo la query di insert (che comunque ha esito positivo), ricevo per ogni singola variabile un errore del tipo

Codice:
C:\xampp\htdocs\gos\page\salva_commessa.phpon line 20

Notice: Undefined index: itr3 in C:\xampp\htdocs\gos\page\salva_commessa.phpon line 41

Notice: Undefined index: itr4 in C:\xampp\htdocs\gos\page\salva_commessa.phpon line 42

Notice: Undefined index: itr5 in C:\xampp\htdocs\gos\page\salva_commessa.phpon line 43

Notice: Undefined index: itr6

ecc ecc ecc

Vi chiedo se esiste un modo, per ciclare e controllare le variabili in modo da non ottenere questo Notice.

Allego il codice

PHP:
<?php
/* RECUPERO I DATI DAL FORM INSERIMENTO COMMESSA */
if (isset($_POST)) {
$veicolo = mysqli_real_escape_string($mysqli, $_POST['veicolo']);
$targa = mysqli_real_escape_string($mysqli, $_POST['targa']);
$km = mysqli_real_escape_string($mysqli, $_POST['km']);
$telaio = mysqli_real_escape_string($mysqli, $_POST['telaio']);
$cliente = mysqli_real_escape_string($mysqli, $_POST['cliente']);
$indirizzo = mysqli_real_escape_string($mysqli, $_POST['indirizzo']);
$piva = mysqli_real_escape_string($mysqli, $_POST['piva']);
$tel = mysqli_real_escape_string($mysqli, $_POST['tel']);
$totale = mysqli_real_escape_string($mysqli, $_POST['totale']);
$n_tecnico = mysqli_real_escape_string($mysqli, $_POST['n_tecnico']);
$pagamento = mysqli_real_escape_string($mysqli, $_POST['pagamento']);
$data = mysqli_real_escape_string($mysqli, $_POST['data']);
$allegato = mysqli_real_escape_string($mysqli, $_POST['allegato']);
$allegato1 = mysqli_real_escape_string($mysqli, $_POST['allegato1']);
$allegato2 = mysqli_real_escape_string($mysqli, $_POST['allegato2']);
$allegato3 = mysqli_real_escape_string($mysqli, $_POST['allegato3']);

/* FILTRI e CONVERSIONI SULLE VARIABILI POST */
$veicolo = trim(strip_tags(strtoupper($veicolo)));
$targa = trim(strip_tags(strtoupper($targa)));
$km = trim(strip_tags(strtoupper($km)));
$telaio = trim(strip_tags(strtoupper($telaio)));
$cliente = trim(strip_tags(strtoupper($cliente)));
$indirizzo = trim(strip_tags(strtoupper($indirizzo)));
$piva = trim(strip_tags(strtoupper($piva)));
$tel = trim(strip_tags(strtoupper($tel)));
$totale = trim(strip_tags(strtoupper($totale)));
$n_tecnico = trim(strip_tags(strtoupper($n_tecnico)));
$pagamento = trim(strip_tags(strtoupper($pagamento)));
$data = trim(strip_tags(strtoupper($data)));
$allegato = trim(strip_tags(strtoupper($allegato)));
/* FINE FILTRI e CONVERSIONI SULLE VARIABILI POST */


$itr1 = mysqli_real_escape_string($mysqli, $_POST['itr1']);
$itr2 = mysqli_real_escape_string($mysqli, $_POST['itr2']);
ecc

$for1 = mysqli_real_escape_string($mysqli, $_POST['for1']);
$for2 = mysqli_real_escape_string($mysqli, $_POST['for2']);
ecc

$itr1 = trim(strip_tags(strtoupper($itr1)));
$itr2 = trim(strip_tags(strtoupper($itr2)));
ecc

$for1 = trim(strip_tags(strtoupper($for1)));
$for2 = trim(strip_tags(strtoupper($for2)));
ecc

$q1 = mysqli_real_escape_string($mysqli, $_POST['q1']);
$q2 = mysqli_real_escape_string($mysqli, $_POST['q2']);
ecc

$iu1 = mysqli_real_escape_string($mysqli, $_POST['iu1']);
$iu2 = mysqli_real_escape_string($mysqli, $_POST['iu2']);
ecc

$sc1 = mysqli_real_escape_string($mysqli, $_POST['sc1']);
$sc2 = mysqli_real_escape_string($mysqli, $_POST['sc2']);
ecc

$imp_1 = mysqli_real_escape_string($mysqli, $_POST['imp_1']);
$imp_2 = mysqli_real_escape_string($mysqli, $_POST['imp_2']);
ecc

if ($q1 == '') { $q1 = 0; }
if ($q2 == '') { $q2 = 0; }
ecc

if ($iu1 == '') { $iu1 = 0; }
if ($iu2 == '') { $iu2 = 0; }
ecc

if ($sc1 == '') { $sc1 = 0; }
if ($sc2 == '') { $sc2 = 0; }
ecc

if ($imp_1 == '') { $imp_1 = 0; }
if ($imp_2 == '') { $imp_2 = 0; }
ecc


$sq1 = "INSERT INTO commesse (veicolo,targa,km,telaio,cliente,indirizzo,piva,tel,itr1,itr2,itr3,itr4,itr5,itr6,itr7,itr8,itr9,itr10,itr11,itr12,itr13,itr14,itr15,for1,for2,for3,for4,for5,for6,for7,for8,for9,for10,for11,for12,for13,for14,for15,q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11,q12,q13,q14,q15,iu1,iu2,iu3,iu4,iu5,iu6,iu7,iu8,iu9,iu10,iu11,iu12,iu13,iu14,iu15,sc1,sc2,sc3,sc4,sc5,sc6,sc7,sc8,sc9,sc10,sc11,sc12,sc13,sc14,sc15,imp_1,imp_2,imp_3,imp_4,imp_5,imp_6,imp_7,imp_8,imp_9,imp_10,imp_11,imp_12,imp_13,imp_14,imp_15,totale,n_tecnico,pagamento,data,allegato) VALUES ('$veicolo','$targa','$km','$telaio','$cliente','$indirizzo','$piva','$tel','$itr1','$itr2','$itr3','$itr4','$itr5','$itr6','$itr7','$itr8','$itr9','$itr10','$itr11','$itr12','$itr13','$itr14','$itr15','$for1','$for2','$for3','$for4','$for5','$for6','$for7','$for8','$for9','$for10','$for11','$for12','$for13','$for14','$for15','$q1','$q2','$q3','$q4','$q5','$q6','$q7','$q8','$q9','$q10','$q11','$q12','$q13','$q14','$q15','$iu1','$iu2','$iu3','$iu4','$iu5','$iu6','$iu7','$iu8','$iu9','$iu10','$iu11','$iu12','$iu13','$iu14','$iu15','$sc1','$sc2','$sc3','$sc4','$sc5','$sc6','$sc7','$sc8','$sc9','$sc10','$sc11','$sc12','$sc13','$sc14','$sc15','$imp_1','$imp_2','$imp_3','$imp_4','$imp_5','$imp_6','$imp_7','$imp_8','$imp_9','$imp_10','$imp_11','$imp_12','$imp_13','$imp_14','$imp_15','$totale','$n_tecnico','$pagamento',STR_TO_DATE('$data', '%d/%m/%Y'),'$allegato')";
$rs1 = $mysqli->query($sq1);
var_dump($sq1);
exit;

if (!$rs1) {
echo "<p style='margin-top: 40px;text-align:center;'>Ho trovato un errore nell'esecuzione della <b>QUERY</b></p>";
die("Errore nella query $sq1: " . mysqli_error());
}else{
?>

Grazie o_O
 
Ciao Elpirata,
sembrerebbe che questa appicazione abbia un pò troppi bug...

Hai lo stesso problema di prima... https://forum.mrw.it/threads/php-passaggio-da-webapp-online-a-webapp-offline.50296/
la $_POST['qualcosa'] non è valorizzata e da l'eccezione...
$itr1 = mysqli_real_escape_string($mysqli, $_POST['itr1']);
$itr2 = mysqli_real_escape_string($mysqli, $_POST['itr2']);
devi verificare che la variabile abbia quella chiave che stai chiedendo.
http://php.net/manual/en/language.types.array.php
poi calcola che con un ciclo sulle chiavi riusciresti a far meglio la query senza doverla impostare a mano ogni volta, utilizzando il prepared statment...
 
Pian piano con lo studio e con l'analisi di tutti i bug ci arriverò, e se mai dovessi farcela saro sempre grato al vostro supporto
 
ciao
a parte quello che dice macus_adi, quando si cita un errore alla riga XY conviene indicare quale è la riga in modo che sia più semplice risalire per trovare l'errore, sempio citi
Notice: Undefined index: itr3 in C:\xampp\htdocs\gos\page\salva_commessa.phpon line 41
quale è la riga 41?
tra l'altro l'unico punto in cui vedo itr3, se non erro, è nei nomi dei campi della query di insert
 
Ciao Borgo Italia,
mi scuso sia con te che con Macus_adi per la poca chiarezza nell'esposizione della problematica, ad ogni modo

Notice: Undefined index: itr3 in C:\xampp\htdocs\gos\page\salva_commessa.phpon line 41

corrisponde a :

PHP:
/*Questa la riga 41*/
$itr3 = mysqli_real_escape_string($mysqli, $_POST['itr3']);
 
ciao
aha è quell'eccetera
l'unica è andare a vedere sul form se esiste un campo di input chiamato itr3, poi comunque se si tratta di tanti post conviene sempre fare l'if isset post se esiste ok, altrimenti fai qualcosaltro
 
Buongiorno Borgo Italia,
il mio codice effettivamente inizia verificando se $_POST è settato

ti riporto un pezzattino del file php che recupera i dati da un form molto lungo ...

PHP:
/* RECUPERO I DATI DAL FORM INSERIMENTO COMMESSA */
if (isset($_POST)) {
$veicolo = mysqli_real_escape_string($mysqli, $_POST['veicolo']);
$targa = mysqli_real_escape_string($mysqli, $_POST['targa']);
$km = mysqli_real_escape_string($mysqli, $_POST['km']);
$telaio = mysqli_real_escape_string($mysqli, $_POST['telaio']);
$cliente = mysqli_real_escape_string($mysqli, $_POST['cliente']);
$indirizzo = mysqli_real_escape_string($mysqli, $_POST['indirizzo']);
$piva = mysqli_real_escape_string($mysqli, $_POST['piva']);
$tel = mysqli_real_escape_string($mysqli, $_POST['tel']);
$totale = mysqli_real_escape_string($mysqli, $_POST['totale']);
$n_tecnico = mysqli_real_escape_string($mysqli, $_POST['n_tecnico']);
$pagamento = mysqli_real_escape_string($mysqli, $_POST['pagamento']);
$data = mysqli_real_escape_string($mysqli, $_POST['data']);
$allegato = mysqli_real_escape_string($mysqli, $_POST['allegato']);
$allegato1 = mysqli_real_escape_string($mysqli, $_POST['allegato1']);
$allegato2 = mysqli_real_escape_string($mysqli, $_POST['allegato2']);
$allegato3 = mysqli_real_escape_string($mysqli, $_POST['allegato3']);

/* FILTRI e CONVERSIONI SULLE VARIABILI POST */
$veicolo = trim(strip_tags(strtoupper($veicolo)));
$targa = trim(strip_tags(strtoupper($targa)));
$km = trim(strip_tags(strtoupper($km)));
$telaio = trim(strip_tags(strtoupper($telaio)));
$cliente = trim(strip_tags(strtoupper($cliente)));
$indirizzo = trim(strip_tags(strtoupper($indirizzo)));
$piva = trim(strip_tags(strtoupper($piva)));
$tel = trim(strip_tags(strtoupper($tel)));
$totale = trim(strip_tags(strtoupper($totale)));
$n_tecnico = trim(strip_tags(strtoupper($n_tecnico)));
$pagamento = trim(strip_tags(strtoupper($pagamento)));
$data = trim(strip_tags(strtoupper($data)));
$allegato = trim(strip_tags(strtoupper($allegato)));
/* FINE FILTRI e CONVERSIONI SULLE VARIABILI POST */


$itr1 = mysqli_real_escape_string($mysqli, $_POST['itr1']);
$itr2 = mysqli_real_escape_string($mysqli, $_POST['itr2']);
$itr3 = mysqli_real_escape_string($mysqli, $_POST['itr3']);
 
ciao
intanto hai verificato che i nomi dei campi di input del form corrisposndano a quelli nel $_POST?
poi tu verifichi che sia stato inviato un post con
if (isset($_POST)), ma questo verifica che sia stato inputato almeno un input se alcuni sono vuoti il post relativo al non inputato non risulta valorizzato e quindi errore
io farei un controllo del genere (ne metto uno ma simile anche per gli altri)
PHP:
//......
if(isset($_POST['itr1'])){$itr1 = mysqli_real_escape_string($mysqli, $_POST['itr1']);}else{$itr1 ="";}
//o usando l'operatore ternario
//....
qui tra l'altro si rende evitdente quello che dice macus_adi sull'uso degli array
a titolo di esempio (non so che tipo di campo utilizzi)
nel form
HTML:
<!-- ... -->
<input name="itr[1]" type="text">
<input name="itr[2]" type="text">
<input name="itr[3]" type="text">
<!-- ... -->
controllo php
PHP:
//...
for($k=1; $k<=3; $k++){
    if(isset($_POST['itr'][$k])){$itr[$k]=mysqli_real_escape_string($mysqli, $_POST['itr'][$k]);}else{$itr[$k]="";}
}
//....
con tre righe di codice volendo e mettendo i vari nomi adeguati controlli tutti i $_POST
 
Più semplicemente, siccome se non ricordo male, quei campi non sono altro che i nomi delle colonne della tabella del database, potresti effettuare un mapping tra la tabella e i dati in input, magari generando un modello per le eccezioni...

per esempio...
PHP:
//recupero tutti i nomi e i tipi delle colonne del DB
$this->query='SELECT COLUMN_NAME,COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = ?';
 if($result=$conn->query($this->query)){
                while($assoc=mysqli_fetch_assoc($result)){
                    $this->result[]=$assoc;
            }
        }

foreach($this->result as $items){

if(isset($_POST[$items['COLUMN_NAME']]){
     switch($items['COLUMN_TYPE']){
         case 'x':
            break;
          etc.....
      }
   }
}

Lo switch lo implementi per tipo e nome colonna, ed effettui i controlli che ti servono.... Con 10 linee di codice gestisci tutto!
SCUSATE, mi ero dimenticato!!!!
Naturalmente, dovresti poi memorizzare il valore elaborato in una variabile.... e costruire la query per l'insert...
Replicando il codice sopra per il recupero dei campi della tabella potresti effettuare anche l'insert costruendo in modo dinamico la query...
Ti consiglio di utilizzare un piccolissimo framework per le query "https://medoo.in/", in pratica passi alla insert un array associativo o un array di array associativo per fare le insert...
 
Ultima modifica:
Io mi metto subito al lavoro per cercare anzitutto partendo dai vostri più che consigli ma (pappa pronta), di rendere giustizia al vostro lavoro e realizzare qualcosa di valido, per completezza riporto anche la parte di codice html

HTML:
<input type="text" name="itr1" id="itr1" class="t1" required="required" size="30" placeholder="Max 49 caratteri" maxlength="49" >
<input type="text" name="for1" id="for1" class="t1" size="10">
<input type="text" name="q1" required="required" class="t2 somma" onKeyUp="SommaRiga(1)" id="q1" size="3" value="0.0" placeholder="0">
<input type="text" name="iu1" class="t2 somma" onKeyUp="SommaRiga(1)" onBlur="Format(1)" id="iu1" size="6" value="0.0" placeholder="0.00">
<input type="text" name="sc1" class="t2 somma" onKeyUp="Virgola(1)" id="sc1" size="8" value="0.0" placeholder="sconto">
<input type="text" name="imp_1" id="imp_1" class="t2 somma" size="8" value="0.0" placeholder="0.00" readonly>
 
Per completezza dovrebbe uscire una cosa del genere utilizzando Medoo...
PHP:
if(isset($_POST)){

   $campi_nome_tipo='SELECT COLUMN_NAME,COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = ?';

   $conn=new Medoo([
      // required
      'database_type' => 'mysql',
      'database_name' => 'NOME_DATABASE',
      'server' => 'HOST',
      'username' => 'USERNAME',
      'password' => 'PASSWORD']);

   //ottieni tutti i campi dentro la variabile data
   $data = $conn->query($campi_nome_tipo)->fetchAll();
   //converto l'array chiave valore
   $my_new_db_dati=[];
   foreach ($data as $items){
      $my_new_db_dati[$items['COLUMN_NAME']]=$items['COLUMN_TYPE'];
   }
   $data_insert=[];
   foreach ($my_new_db_dati as $chiave=>$valore){
      if(isset($_POST[$chiave])){
         if(strstr($valore,'int')){
            //Questo deve essere un valore intero prende INT-BIGINT-SMALLINT-TINYINT etc...
            //faccio qualcosa
            $data_insert[$chiave]=funzione_che_fa_qualcosa($_POST[$chiave]);
         }
         if(strstr($valore,'char') || strstr($valore,'text')){

            //Questo deve essere un valore testo
            //faccio qualcosa
            $data_insert[$chiave]=funzione_che_fa_qualcosa($_POST[$chiave]);
         }
      }
   }
   $conn->insert('NOME_DELLA_TABELLA',$data_insert);
}
 

Discussioni simili