• User Newbie

    Errore PHP: Warning: Undefined array key

    questo è il codice spero mi potrete dare un aiuto:
    index.php

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>SecurityHook</title>
        <link rel="shortcut icon" href="../images/fav_icon.png" type="image/x-icon">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
        <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,700" rel="stylesheet">
        <!-- Bulma Version 0.9.0-->
        <link rel="stylesheet" href="https://unpkg.com/[email protected]/css/bulma.min.css" />
        <link rel="stylesheet" type="text/css" href="../css/landing.css">
    </head>
    
    <body>
    
        <section class="hero is-info is-fullheight" style="background-color:#45C6AF">
            
                        <div class="logo">
    					
    					<center>
                            
                                <img src="logo.png" width="500px" height="auto"  alt="Logo">
                           
                           </center>
                                
                                <span></span>
                                <span></span>
                            </span>
                        </div>
                       
    
                <div class="hero-body">
                    <div class="container has-text-centered">
                        <div class="column is-6 is-offset-3">
                            <h1 class="title">
                              Aiutaci ad aiutare la tua città
                            </h1>
                            <h2 class="subtitle">
                               Segnala alle forze dell'ordine atti illeciti in pochissimi secondi.
    						   
    						<br>
    						<br>
    						‎‎
                            <div class="box">
    						<form action="connect.php" method"post">
    						<div class="field">
      <label class="label">Nome</label>
      <div class="control">
        <input class="input" type="text" id="nome" placeholder="Mario" required>
      </div>
    </div>
    
    <div class="field">
      <label class="label">Cognome</label>
      <div class="control">
        <input class="input" type="text" id="cognome" placeholder="Rossi">
      </div>
    </div>
    <label class="label">Codice Fiscale</label>
      <div class="control">
        <input class="input" type="text" id="cod_fiscale"  placeholder="CF" required>
      </div>
    
    
    <div class="field">
      <label class="label">Email</label>
      <div class="control">
        <input class="input" type="text" id="email" placeholder="[email protected]">
      </div>
    </div>
    <label class="label">A chi è rivolta la segnalazione</label>
    <div class="field has-addons">
      <div class="control is-expanded">
        <div class="select is-fullwidth">
          <select>
            <option value="Carabinieri">Carabinieri</option>
            <option value="Polizia">Polizia</option>
            <option value="Finazieri">Finazieri</option>
            <option value="Pompieri">Pompieri</option>
            <option value="Polizia Stradale">Polizia stradale</option> 
          </select>
        </div>
    	</div>
      </div>
      <label class="label">Cos'è successo</label>
    
      <div class="control is-expanded">
       
         <input class="textarea" placeholder="rapina,colluttazione" id="descrizione" rows="10"required></input>
    		
          </select>
    	</div>
    
    <div class="field">
      <label class="label">A che ora è successo</label>
      <div class="control">
        <input type="time" id="orario" required>
      </div>
    </div>
    
    <div class="field">
      <label class="label">Dov'è successo</label>
      <div class="control">
        <input class="input" type="text" id="Via" placeholder="Via..">
    	<br>‎‎
    	<input class="input" type="number" id="Numcivico" placeholder="22">
    		<br>‎‎
    	<input class="input" type="text" id="Comune" placeholder="Comune">
      </div>
    </div>
      
    
    <div class="field is-grouped">
      <div class="control">
        <button class="output" name="invia">Invia</button>
      </div>
     
    </div>
    
    
    
    
    
    
    
    
    </form>
    
    </div>
    						
                                
                                        </a>
                                    </p>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
    
        </section>
        <script async type="text/javascript" src="../js/bulma.js"></script>
    </body>
    
    </html>
    
    
    

    connect.php

    <?php
    $connessione = mysqli_connect('localhost','root','', 'securityhook');
    $avviso = "";
    
    if(isset($_POST['invia'])) {
    
    $nome = $_POST['nome'];
    $cognome = $_POST['cognome']; 
    $cod_fiscale = $_POST['cod_fiscale'];
    $email = $_POST['email'];
    
    $query = "INSERT INTO utente(nome,cognome,cod_fiscale,email) VALUES('{$nome}', '{cognome}','{cod_fiscale}','{email}')";
    
    mysqli_query($connessione, $query);
    
    $avviso = "Successo";
    echo $avviso;
    
    }else {
      $avviso = "Errore";
      echo $avviso;
    }
    ?>```
    
    
    
    mi da il seguente errore: " Warning: Undefined array key "nome" in C:\xampp\htdocs\sito\connect.php on line 9
    
    Warning: Undefined array key "cognome" in C:\xampp\htdocs\sito\connect.php on line 10
    
    Warning: Undefined array key "cod_fiscale" in C:\xampp\htdocs\sito\connect.php on line 11
    
    Warning: Undefined array key "email" in C:\xampp\htdocs\sito\connect.php on line 12
    * list item"

    overclokk 1 Risposta
  • Moderatore

    Ciao @passpm

    L'errore stesso ti dice quale sia il problema, l'array che stai utilizzando non ha "ancora" le chiavi indicate nell'errore.

    Tu stai usando la globale $_POST che è un array ma non fai un check se le chiavi esistonio:

    $nome = $_POST['nome'];
    

    Non essendo inizializata questa chiave ti da errore, ora quello che potresti fare è usare o isset() o ancora meglio array_key_exists() per esempio:

    attenzione, non usare questo codice che serve solo per spiegare come funziona, ci sono problemi di sicurezza che risolviamo più avanti

    /**
     * Qui facciamo un check  se esiste quella chiave
     * isset()
     */
    
    $nome = isset( $_POST['nome'] ) ? $_POST['nome'] : '' ;
    

    Questa successiva è più dichiarativa e più facile da leggere:

    /**
     * Qui facciamo un check se esiste quella chiave ma con un sistema migliore
     * array_key_exists()
     */
    
    $nome = array_key_exists( 'nome' , $_POST ) ? $_POST['nome'] : '' ;
    

    Però ancora, abbiamo un code smell, c'è troppa ripetizione, dovresti appunto ripetere il check per ogni chiave, quindi meglio semplificare ulteriormente:

    
    $default = [
        'nome' => '',
        // Qui aggiungerai tutti gli altri valori di default
     ];
    
    $_POST = array_replace( $default, $_POST );
    
    $nome = $_POST['nome'];
    

    Con array_replace() quello che facciamo è inizializzare le chiavi nell'array se queste non esistono così ti eviti tutti i check, nella variabile di default poi devi aggiungere tutte le chiavi che vuoi inizializzare, qui un esempio.

    Ora però attenzione, c'è un problema ancora più grosso, la sicurezza

    Tu stai semplicemente mettendo nel DB qualcosa che l'utente sta inviando, e l'utente potrebbe inviare del codice malevolo, never trust user input.

    Puoi cercare form validation per ulteriori info, qui ti posto uno dei tanti tutorial che si trovano https://www.w3schools.com/php/php_form_validation.asp

    Ricorda anche di sanitizzare poi il dato dopo averlo prelevato dal db e prima di stamparlo per esempio con questi filtri https://www.php.net/manual/en/filter.filters.sanitize.php perché anche sul DB potrebbe esserci codice malevolo.

    Ora dopo tutta questa spiegazione veniamo all'HTML, nei field manca l'attributo name, qui un esempio di form https://www.w3schools.com/php/php_forms.asp e nel tag form la sintassi è sbagliata, hai dimenticato un =, tu hai scritto:

    <form action="connect.php" method"post">
    

    e invece va scritto:

    <form action="connect.php" method="post">
    

    Altra lettura che ti consiglio (la più importante) è questa Unit Test che in futuro ti possono salvare da errori come questo.