Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606

    Invalid parameter number: parameter was not defined

    Ciao, e sì lo so, oggi è il primo maggio, ma c'è pure chi lavora :D
    Quindi fatti gli auguri a tutti i lavoratori, vengo al punto.
    Come da titolo, l'errore sembra facile da risolvere e in genere ci riesco benissimo, ma questa volta, sono due giorni che ci sbatto la testa, sia sul lavoro che a casa dove sono ora.
    Ebbene la stringa
    codice:
    Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter  number: parameter was not defined in  C:\xampp\htdocs\siti\rubrica\bin\class\update.class.php on line 101
    sembra facilmente risolvibile, eppure contando i campi nel database, ed i valori passati, verificata la query, non riesco a venirne a capo.

    Un po' di codice:
    Per memorizzare i dati utilizzo il PDO con PHP 7.4 su un database MySQL in ufficio, e MariaDB qui in locale ( ma l'errore è lo stesso ).

    Una classe che chiamo Aggiorna, contiene tre metodi fondamentali, due pubblici e uno privato.
    In quelli pubblici, chiamati aggiornaNumeri e aggiornaIndirizzi, creano la query SQL per le tabelle Numeri e Indirizzi.
    Mentre la updateDB che è privata, compie l'effettivo salvataggio dei dati.
    La query è solida e contiene tutti i nomi dei campi presenti nella tabella del database, i riferimenti ai campi sono giusti e i suoi valori sono quelli previsti.
    QUERY di update per i numeri, così come uscita dopo l'istruzione PHP var_dump( $handle ); dove la variabile $handle è lo statements, è questa:
    UPDATE numeri SET id_rub = :id_rub, titolo = :tits, nome = :nome, cognome = :cognome, telefono = :tel, telefono_ufficio = :tel_u, cellulare = :cell, cellulare_ufficio = :cell_u, fax = :fax, email = :email, email_ufficio = :email_u, pec = :pec, pec_ufficio = :pec_u, sito_web = :sito, id_mod = :id_utente, update_num = :data, note_num = :note WHERE id_num = :id_num ; --
    Mentre la tabella è quella sotto riportata:
    CREATE TABLE `numeri` (
    `id_num` int(10) UNSIGNED NOT NULL,
    `id_rub` int(10) UNSIGNED NOT NULL COMMENT 'Collegamento alla rubrica.',
    `titolo` varchar(30) NOT NULL COMMENT 'Dottor, Dottoressa, Signor, Signora...',
    `nome` varchar(256) DEFAULT NULL,
    `cognome` varchar(256) NOT NULL COMMENT 'Importante, se manca questo dato non si può iscrivere nulla.',
    `telefono` varchar(15) DEFAULT NULL,
    `telefono_ufficio` varchar(15) DEFAULT NULL,
    `cellulare` varchar(15) DEFAULT NULL,
    `cellulare_ufficio` varchar(15) DEFAULT NULL,
    `fax` varchar(15) DEFAULT NULL,
    `email` varchar(256) DEFAULT NULL,
    `email_ufficio` varchar(256) DEFAULT NULL,
    `pec` varchar(256) DEFAULT NULL,
    `pec_ufficio` varchar(256) DEFAULT NULL,
    `sito_web` varchar(256) DEFAULT NULL,
    `creazione_num` datetime NOT NULL COMMENT 'Momento della creazione del record',
    `update_num` datetime DEFAULT NULL COMMENT 'Data della modifica del record,
    `id_mod` int(10) UNSIGNED DEFAULT NULL COMMENT 'Riferiment a chi ha effettuata la modifica',
    `note_num` varchar(4096) DEFAULT NULL,
    `condivisione` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Condivide questo record con un altro utente. Default = 0'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    Mentre il metodo della classe Aggiorna che salva i dati è questo:
    Codice PHP:
    $handle $this->pdo->prepare$this->sql );  //  $this->sql contiene la query, così come riportata sopra.

    $handle->bindValue':id_num',  $update['id_num'],              PDO::PARAM_INT );
    $handle->bindValue':id_rub',  $update['id_rub'],              PDO::PARAM_INT );

    $handle->bindValue':tits',    $update['titolo'],              PDO::PARAM_STR );
    $handle->bindValue':nome',    $update['nome'],                PDO::PARAM_STR );
    $handle->bindValue':cognome'$update['cognome'],             PDO::PARAM_STR );
    $handle->bindValue':tel',     $update['telefono'],            PDO::PARAM_STR );
    $handle->bindValue':tel_u',   $update['telefono_ufficio'],    PDO::PARAM_STR );
    $handle->bindValue':cell',    $update['cellulare'],           PDO::PARAM_STR );
    $handle->bindValue':cell_u',  $update['cellulare_ufficio'],   PDO::PARAM_STR );
    $handle->bindValue':fax',     $update['fax'],                 PDO::PARAM_STR );
    $handle->bindValue':email',   $update['email'],               PDO::PARAM_STR );
    $handle->bindValue':email_u'$update['email_ufficio'],       PDO::PARAM_STR );
    $handle->bindValue':pec',     $update['pec'],                 PDO::PARAM_STR );
    $handle->bindValue':pec_u',   $update['pec_ufficio'],         PDO::PARAM_STR );
    $handle->bindValue':sito',    $update['sito_web'],            PDO::PARAM_STR );
    $handle->bindValue':note',    $update['note_num'],            PDO::PARAM_STR );
    $handle->bindValue':id_mod',  $update['id_utente'],           PDO::PARAM_INT );   //  Questa la riga 101 che genera l'errore
        
    $data date'Y-m-d H:i:s' );
    $handle->bindValue':data'$dataPDO::PARAM_STR );
    }
    if ( !
    $handle->execute() )
    {
        
    $handle->debugDumpParams();
        throw( new 
    PDOException'Errore scrivendo nel database!' ) );

    Come scritto nel remark, la riga che genera l'errore è quella lì, ma il dato esiste in $update e questo mi sta tomentando da ieri.

    $update è l'array che viene dal form sul sito.
    I suoi valori sono:

    C:\xampp\htdocs\siti\rubrica\bin\class\update.clas s.php:82:
    array (size=31)
    'titolo' => string 'Signor' (length=6)
    'nome' => string 'Paolino' (length=7)
    'cognome' => string 'Paperino' (length=8)
    'telefono' => string '' (length=0)
    'cellulare' => string '' (length=0)
    'telefono_ufficio' => string '' (length=0)
    'cellulare_ufficio' => string '' (length=0)
    'fax' => string '' (length=0)
    'email' => string '' (length=0)
    'pec' => string '' (length=0)
    'email_ufficio' => string 'paolino.paperino@giustizia.it' (length=29)
    'pec_ufficio' => string '' (length=0)
    'sito_web' => string '' (length=0)
    'note_num' => string '' (length=0)

    Qui finisce il record Indirizzi

    Qui iniziano i dati per il record Numeri non in esame.

    'azienda' => string '' (length=0)
    'mansione' => string '' (length=0)
    'ufficio' => string '' (length=0)
    'cod_fiscale' => string '' (length=0)
    'p_iva' => string '' (length=0)
    'via' => string '' (length=0)
    'civico' => string '' (length=0)
    'provincia' => string '' (length=0)
    'cap' => string '' (length=0)
    'citta' => string 'Paperino' (length=8)
    'nazione' => string '' (length=0)
    'note_ind' => string '' (length=0)
    'id_ind' => boolean false
    'id_num' => int 28
    'id_rub' => int 11
    'warning' => boolean false

    Questo il dato contestato, in uso a tutte e due le tabelle
    'id_utente' => int 8

    I valori risondanti servono per l'altra tabella, quella degli indirizzi, che però non viene registrata, in quanto l'errore si manifesta prima che questo avvenga.
    L'errore apparentemente sembra riportare che manchi il dato alla riga 101 ( che è quella segnalata ) eppure il dato c'è, e pure nella query è riportato, dato che tra l'altro anche se mancasse, non dovrebbe generare nessun problema, dato che nel record il campo può essere NULL.
    Spero di essere stato chiaro, se ci sono cose che non vi tornano fatemi sapere e io vi darò spiegazioni ulteriori.
    Grazie.



  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Dovrebbe essere questo il problema:


    UPDATE numeri SET id_rub = :id_rub, titolo = :tits, nome = :nome, cognome = :cognome, telefono = :tel, telefono_ufficio = :tel_u, cellulare = :cell, cellulare_ufficio = :cell_u, fax = :fax, email = :email, email_ufficio = :email_u, pec = ec, pec_ufficio = ec_u, sito_web = :sito, id_mod = :id_utente, update_num = :data, note_num = :note WHERE id_num = :id_num ; --

    $handle->bindValue( ':id_mod', $update['id_utente'], PDO::PARAM_INT );

    In pratica nella query indichi il parametro :id_utente, ma non ci associ nessun valore visto che fai il bind con : id_mod (che non usi)

  3. #3
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Quote Originariamente inviata da boots Visualizza il messaggio
    Dovrebbe essere questo il problema:


    UPDATE numeri SET id_rub = :id_rub, titolo = :tits, nome = :nome, cognome = :cognome, telefono = :tel, telefono_ufficio = :tel_u, cellulare = :cell, cellulare_ufficio = :cell_u, fax = :fax, email = :email, email_ufficio = :email_u, pec = ec, pec_ufficio = ec_u, sito_web = :sito, id_mod = :id_utente, update_num = :data, note_num = :note WHERE id_num = :id_num ; --

    $handle->bindValue( ':id_mod', $update['id_utente'], PDO::PARAM_INT );

    In pratica nella query indichi il parametro :id_utente, ma non ci associ nessun valore visto che fai il bind con : id_mod (che non usi)
    AAaaaargh! Due giorni che ci perdo tempo, sto progetto era di un'idiozia totale, una rubrica del telefono, me l'hanno fatto andare di traverso. Ok problema superato, grazie.
    Ora se n'è presentato un altro su un'altra riga, $handle->execute(); vado a contare i parametri .
    Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number

    Spero di risolverlo

  4. #4
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Risolto la data di creazione del record, era finita nel posto sbagliato.
    Ok, Buon Primo Maggio a tutti.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.