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 stringasembra facilmente risolvibile, eppure contando i campi nel database, ed i valori passati, verificata la query, non riesco a venirne a capo.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
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:
Mentre la tabella è quella sotto riportata: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 il metodo della classe Aggiorna che salva i dati è questo: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;
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.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', $data, PDO::PARAM_STR );
}
if ( !$handle->execute() )
{
$handle->debugDumpParams();
throw( new PDOException( 'Errore scrivendo nel database!' ) );
}
$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.