Sul sito che sto creando, ci sono due tabelle correlate, ma nella seconda vanno inseriti dei valori solo se questi esistono altrimenti va saltata.
Ora tutti questi valori vengono da un form riempito da un utente, e una funzione di ricerca degli errori segnala errori e warning prima di dare il via alla creazione dei record.
fino a qui è normale procedura, ma c'è un ma!
Un po' di codice così mi spiego meglio: Fase 1
Qui finisce il controllo di quanto inserito e in allegato qui sotto c'è quanto evidenziato nel browser.
Nei due array, almeno un campo è a pieno e la funzione array_search li trova, in questo modo non verrà presentato nessun warning e posso registrare quanto è stato passato.
Quindi codice della fase 2
Se vi state chiedendo perché ho scelto come valori pieno e vuoto, è perché non capendo il comportamento della funziona array_search() ho sostituito i valori true e false, penando che potevano dare dei problemi ( Illuso ).
In pratica, anche se l'array $errInd contiene almeno un campo a 'pieno', array_search() non sembra trovarlo e quindi salta a piè pari non registrando mai un indirizzo, ma nella fase di controllo lo trova senza problemi.
Ma non l'ho cancellato con unset(), il confronto è fatto esattamente come sopra e funziona ( sopra ) ma qui, niente.
Ora tutti questi valori vengono da un form riempito da un utente, e una funzione di ricerca degli errori segnala errori e warning prima di dare il via alla creazione dei record.
fino a qui è normale procedura, ma c'è un ma!
Un po' di codice così mi spiego meglio: Fase 1
PHP:
/**
* La variabile $input è un array che contiene tutti i valori passati dal form, dopo aver verificato che i dati siano esatti e puliti da tentativi di injection
* Ora vanno controllati quei dati che non possono essere false o vuoti.
*/
$errNum = []; $errInd = []; // Array di comodo. si veda più avanti
foreach( $input as $nomeCampo => $valore )
{
switch( $nomeCampo )
{
// Metto solo ciò che non funziona bene o che da strani errori e problemi, per semplificare lo script.
// Dati indirizzo.
case 'azienda':
case 'cod_fiscale':
case 'p_iva':
case 'mansione':
case 'ufficio':
case 'via':
case 'cap':
case 'citta':
case 'provincia':
if ( $valore == false ) $valore = ''; // Se si incontra un valore che è false, lo trasformo in una stringa vuota, mi semplificherà il salvataggio dei dati.
if ( empty($valore) === true )
$errInd[$nomeCampo] = 'vuoto'; // L'array indica un valore che dovrebbe esserci ma non c'è è vuoto.
else
$errInd[$nomeCampo] = 'pieno'; // Bene. l'utente ha inserito un valore per questo campo.
break;
// Dati telefono
case 'telefono':
case 'telefono_ufficio':
case 'cellulare':
case 'cellulare_ufficio':
case 'fax':
case 'email':
case 'pec':
case 'email_ufficio':
case 'pec_ufficio':
if ( $valore == false ) $valore = ''; // Come Sopra
if ( empty($valore) === true )
$errNum[$nomeCampo] = 'vuoto';
else
$errNum[$nomeCampo] = 'pieno';
break;
}
}
var_dump( $errNum, $errInd ); // In debugging verifico che cosa ho scritto e cosa risulta dal controllo errore.
// Controllo cosa c'è nei due array, se viene trovato anche una sola chiave a 'pieno' salto, altrimenti manderò un warning all'utente e non registrerò il dato.
if ( ( array_search( 'pieno', $errNum ) === false ) && ( array_search( 'pieno', $errInd ) === false ) )
{
$warning .= '<dt>Numeri e/o e-mail</dt><dd>Questi campi non sono obbligatori, ma inserirne almeno uno sarebbe utile.</dd>';
}
unset( $errNum ); // Svuoto l'array $errNum che non mi serve più.
Qui finisce il controllo di quanto inserito e in allegato qui sotto c'è quanto evidenziato nel browser.
Nei due array, almeno un campo è a pieno e la funzione array_search li trova, in questo modo non verrà presentato nessun warning e posso registrare quanto è stato passato.
Quindi codice della fase 2
PHP:
// Se non ci sono errori, salvo i dati.
if ( $errore === false && $warning === false )
{
$numeri = new CRUDNumeri();
$input['id_ute'] = $datiSessione['id_ute'];
$input['id_num'] = $numeri->createNumero( $input ); // Ritorna l'ID del tabella numeri da riportare nella tabella indirizzi.
// Questo è il punto incriminato. Non c'è verso di fargli capire che c'è almeno un campo a pieno nell'array $arrInd.
if ( array_search( 'pieno', $errInd ) === false )
{
// Se c'è qualcosa tra gli indirizzi, li salva, ma non arriva mai fino a qui.
echo '<p>Inserimento valori ( INPUT ):</p><pre>'; var_dump( $input ); echo '</pre>';
$indirizzi = new CRUDIndirizzi();
$indLastID = $indirizzi->createIndirizzo( $input );
unset( $indirizzi );
}
unset( $obj );
}
In pratica, anche se l'array $errInd contiene almeno un campo a 'pieno', array_search() non sembra trovarlo e quindi salta a piè pari non registrando mai un indirizzo, ma nella fase di controllo lo trova senza problemi.
Ma non l'ho cancellato con unset(), il confronto è fatto esattamente come sopra e funziona ( sopra ) ma qui, niente.