array_search(), ora va, ora no!

MarcoGrazia

Utente Attivo
15 Dic 2009
785
16
18
58
Udine
www.stilisticamente.com
Sul sito che sto creando, ci sono due tabelle correlate, ma nella seconda vanno inseriti dei valori solo se questi esistono :p 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 :p
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.
Clipboard01.jpg

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 );
                    }
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.
 

MarcoGrazia

Utente Attivo
15 Dic 2009
785
16
18
58
Udine
www.stilisticamente.com
si ho visto che sono uguali ma il secondo per funzionare deve essere opposto ( TRUE ) o sbaglio ?
Può essere che il sonno mi abbia reso le idee meno chiare e potresti aver ragione, ma alla fine ho risolto tagliando la testa al toro e visto che per ora funziona, lo lascio così.
In pratica ho evitato di mettere un valore a vuoto, se manca il dato nel POST, così ora l'array contiene dati solo se ci sono valori in POST.
In questo modo posso contare e vedere se l'array contiene qualchecosa, a quel punto vado oltre. Insomma uso la funzione count() al posto di array_search().