[PHP] problema con xml

Dairon

Nuovo Utente
27 Ago 2017
9
0
1
64
Ciao a tutti!
Mi sono appena iscritto perché ritengo che solo qui posso trovare la soluzione al mio problema, con ili vostro aiuto. Ho visto che siete molto bravi!
Premetto che il discorso è un po' complicato, vedrò di spiegarmi al meglio.
In una pagina php raccolgo dei dati con un form che poi elaboro nel seguente modo: invio una mail con i dati e contemporaneamente, per sicurezza, li faccio scrivere in un file .txt sul server.
Dalla stessa pagina, naturalmente si può ripetere l'operazione. Si riapre la stessa pagina e dopo aver rimesso dati diversi (ho controllato diverse volte) ricevo la mail con i nuovi dati ed anche nel file di testo ci sono i nuovi dati.
Ora ho l'esigenza di controllare un dato immesso, che corrisponda ad un valore prestabilito. Ho creato un foglio .xml e, da una pagina in php creata apposta per sperimentare il tutto, funziona perfettamente: se trova il dato immesso, avvisa che esiste il dato relativo. Se non lo trova, non dice nulla.
Inserisco la routine nella pagina php dove dovrebbe lavorare e, se immetto il dato che non è presente nella lista del foglio xml va tutto bene, mentre se immetto un dato che è presente nel foglio, lo stampa a video e, quando clicco per confermare l'invio, questo non avviene perché non trova più il nome (è un dato essenziale che faccio controllare da una seconda pagina php, insieme ad altri dati e dove, se tutto va bene parte la mail e scrive sul file txt, mentre se non c'è un dato essenziale come il nome, ritorna nella prima pagina con la variabile errore settata a "Il nome non è presente". Ma il nome c'è!!! Se tolgo la routine della lettura del foglio xml, funziona alla perfezione.
Ho provato in 2 modi a leggere il foglio. Anche con il primo modo mi faceva lo stesso problema. Ho trovato un altro modo ancora più semplice, ma anche con questo secondo sistema ho lo stesso problema.

Per leggere il file xml, uso questa routine:

PHP:
$xml=simplexml_load_file("../swift.xml");
        foreach($xml->indice as $dati){
               if (substr($dati->bic, 0, 8) == substr($b_bic, 0, 8)){
                     $b_trovata = $dati->banca;
                            //echo "codice id ".$dati['id']." - BIC: ".$b_iban." corrisponde alla banca ".$b_trovata."<br />";
                        }
                    }
Ho lasciato l'echo per dimostrare che il tutto funziona, per quanto riguarda l'xml. Ma il problema sorge quando lo inserisco nella pagina dove dovrebbe fare il "suo" lavoro. Ovvero, la variabile $b_trovata la si vede a schermo, ma poi perdo le variabili immesse con input. Ho pure creato una sessione per renderle visibili anche nell'altra pagina, ma niente.

Qualcuno ha pratica di questo tipo di problema?

Ringrazio sin d'ora tutti coloro che vorranno intervenire.
 

linoma

Utente Attivo
1 Mar 2017
79
4
8
A prima vista sembra essere un problema di path, ../swift.xml potrebbe creare problemi. Prova a controllare
 

Dairon

Nuovo Utente
27 Ago 2017
9
0
1
64
Macché! Il file si trova in una cartella superiore perché è accessibile anche ad altri.
Comunque la routine l'ho messa dapprima in una pagina apposta nella stessa cartella dove c'è la pagina nella quale poi l'ho inserita. Funziona alla perfezione: immettendo un dato in input, se lo trova carica il dato relativo.
 

linoma

Utente Attivo
1 Mar 2017
79
4
8
Vedendo il path mi era venuto il dubbio, cm il fatto che manca il break all'interno del foreach in caso la ricerca abbia buon esito. Intanto userei strncmp o la versione insensitive, al post dei 2 substr. Forse sarebbe meglio che postassi anche l'altra parte di codice.
 

Dairon

Nuovo Utente
27 Ago 2017
9
0
1
64
Ho provato anche con break... ma ho lo stesso problema. Che poi non è la routine in se stessa, ma è che combinata con il php della pagina dove lo metto che crea problemi alle variabili prese dal post e non le ricorda, nemmeno avendo rimesso session_star().
Questa routine l'ho trovata in internet e ho solo aggiunto l'if di controllo per controllare che se il dato immesso esiste nella lista, preleva il secondo valore.
Io posterei anche il codice della pagina php dove deve lavorare la routine, ma è lunghissimo e c'è qualche dato riservato...
Potresti postere tu il codice di questa routine con le variazioni che suggerisci? Così lo provo e forse non intacca le variabili del post generale...
 

Dairon

Nuovo Utente
27 Ago 2017
9
0
1
64
Aggiungo che, nella pagina in php dove dovrebbe fare il suo lavoro che svolge egregiamente nella pagina a sé, se non viene richiamata (perché non c'è la variabile che la mette in funzione) tutto va bene, mentre se deve fare la ricerca nel foglio xml (perché è stata inserita la variabile che la riguarda) e trova o no la corrispondenza, crea il problema facendo perdere le variabili del form/pos. Infatti ritorna la pagina dell'invio con un controllo "Non c'è il nome" che ho messo io, mentre il nome c'è. Fra l'altro è un input obbligatorio. Solo nel caso in cui si inseriscano degli spazi (che vengono accettati dall'input) poi il controllo in php li toglie e se non rimane nulla dice appunto che non c'è il nome.
 

linoma

Utente Attivo
1 Mar 2017
79
4
8
Se dici che il codice che posti funziona bene evidentemente l'errore è altrove. Non so come aiutarti senza vedere tutto il flusso del tuo codice. D'altronde non so neanche cosa tu vorresti fare tanto da poterti scrivere qualcosa. Poi di solito si cerca di aiutare sul codice non di scriverlo ex-novo. C'è la sezione Offerte di lavoro :)
 

Dairon

Nuovo Utente
27 Ago 2017
9
0
1
64
Certo non chiedevo di riscriverlo di nuovo. La mia domanda era se qualcuno aveva già riscontrato problemi di gestione file xml in php. Ho postato il codice che legge, per "mostrare" il tipo, visto che ne avevo usato un altro e faceva lo stesso problema. Certo che il problema l'interazione col codice della pagina in php esistente che, senza questa routine che legge il file xml, funziona perfettamente.
Per essere più preciso, riassumo cosa fa l'altra pagina:
1) Chiede degli input che bisogna inserire;
2) una volta inseriti tramite form, si richiama la stessa pagina dove si stampano a video. Qui dovrebbe esserci la routine incriminata che cerca nel file xml per un confronto che se lo inserisce fra i dati e si attende la conferma;
3) se si conferma, parte la mail con i dati inseriti e la pagina conclude ringraziando l'aver immesso i dati.
Purtroppo non arrivano i dati corretti ed alcune volte proprio si azzerano le variabili. Senza il codice incriminato, funziona bene.

Potrei provare a postare il codice della pagina in php, magari togliendo le parti riservate. Che ne dici?
 

linoma

Utente Attivo
1 Mar 2017
79
4
8
L'importante che ci sia tutto il flusso che il tuo codice esegue. Ovviamente togli la parte che non puoi lasciare e anche quella che non serve.
 

Dairon

Nuovo Utente
27 Ago 2017
9
0
1
64
PHP:
<!DOCTYPE HTML>

<html>
    <head>
        <meta name="robots" content="NOINDEX, NOFOLLOW" />
    </head>
    <body>
       <div id="page-wrapper">
          <!-- Header -->
            <header id="header">
                <h1>Titolo</h1>
                <nav id="nav">
                    <ul>
                        <li><a href="testinizia.php">Home</a></li>
                        <li>
                            <a href="" class="icon fa-angle-down">Per uscire</a>
                            <ul>
                                <li><a href="../destroy.php">Logout&nbsp;&nbsp;&nbsp;<img src="../images/logout.png" alt="" /></a></li>
                            </ul>
                        </li>
                    </ul>
                </nav>
            </header>

        <!-- Main -->
            <section id="main" class="container 75%">

                <header>
                    <h2>Richiesta</h2>
                    <?php
                    if (!$b_ok){
                    ?>
                    <p>Per favore, indichi tutti i dettagli richiesti</p>
                    <?php
                    }
                    ?>
                </header>
 
            <!-- Box bianco -->
            <div class="box">
                <?php
                if (!$b_ok){
                ?>
                <form method="post" action='<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>'>        
                <div class="row uniform 50%">
                    <?php @include("../inserisci_bon.html");?>
                    <div class="12u">
                        <ul class="actions fit">
                            <li><input type="submit" class="button fit" name="conferma" value=" conferma " /></li>
                        </ul>
                    </div>
                </div>
                </form>
                    <?php
                    if ($b_err){
                        echo '<img src="../images/note.png" />'.' '.'<font style="color:#ba0d0d";>'.$b_err.'</font>';
                    }?>
                <?php
                if(isset($_POST['conferma'])){
                    $b_banca = $_POST['b_banca'];
                    $b_bic = $_POST['b_bic'];
                    $b_iban = $_POST['b_iban'];
  //qui c'è la routine di lettura del file xml che non trasmette le variabili alla pagina richiamata
                       $xml=simplexml_load_file("../swift.xml");
                  //il file swift.xml si trova nella cartella superiore perché è accessibile da altre pagine simili a questa
                   foreach($xml->indice as $dati){
                           if (substr($dati->bic, 0, 8) == substr($b_bic, 0, 8)){
                             $b_trovata = $dati->banca;
                             //echo "codice id ".$dati['id']." - BIC: ".$b_iban." corrisponde alla banca ".$b_trovata."<br />";
                         break;
                        }
                    }
                ?>
                <h4>Controllare i dati immessi:</h4>
                    <div class="table-wrapper">
                        <table>
                            <tbody>
                                <tr>
                                    <td><b>Banca</b></td>
                                    <td><?php echo $b_banca;?></td>
                                    <td></td>
                                </tr>
                                <?php
                                if ($b_trovata){
                                ?>
                                <tr>
                                    <td><b>Banca trovata con il BIC inserito</b></td>
                                    <td><?php echo $b_trovata;?></td>
                                    <td></td>
                                </tr>
                                <?php
                                }?>
                                <tr>
                                    <td><b>BIC/SWIFT</b></td>
                                    <td><?php echo $b_bic;?></td>
                                    <td></td>
                                </tr>
                            </tbody>    
                        </table>
                        <p><i class="fa fa-question-circle-o" aria-hidden="true"></i>&nbsp;&nbsp;I dati sopraelencati sono corretti?</p>
                    </div>
                <?php
                $b_ok = "";
                // Start the session
                session_start();
                $_SESSION["b_banca"] = $b_banca;
                $_SESSION["b_trovata"] = $b_trovata;
                $_SESSION["b_bic"] = $b_bic;
                ?>
                <form method="post" action="controllo_bon.php">
                <div class="12u">
                    <ul class="actions fit">
                        <li><input type="submit" class="button fit" name="invio" value=" Invio dati " /></li>
                        <li><a href="richiesta_bon.php" class="button alt fit icon fa-undo">Annulla</a></li>
                    </ul>
                </div>
                </form>
                <?php
                }?>
            </div>
                <?php
                }else{
                       echo '<img src="../images/tick.png" />'.' '.$b_err;
                    echo "</br>".$b_ok;
                }
                ?>
 
            </section>
         
        <!-- Footer -->

        </div>

        <!-- Scripts -->


    </body>
</html>
 

linoma

Utente Attivo
1 Mar 2017
79
4
8
Intanto session_start() va all'inizio della pagina se nn la prima la primissima riga. I controlli della variabile $_POST vanno fatti immediatamente a session_start e nel codice usi le variabili che setti. Puoi usare anche l'array $_POST ma session_start deve stare all'inizio.
Presumo che i vari input b_banca b_bic e b_iban siano omessi, cmq ti incollo la parte iniziale di come dovrebbe essere il tuo file

Codice:
<?php
$b_ok = "";
// Start the session
session_start();
if(isset($_POST['conferma'])){
   $b_banca = $_POST['b_banca'];
   $b_bic = $_POST['b_bic'];
   $b_iban = $_POST['b_iban'];
   $_SESSION["b_banca"] = $b_banca;
   $_SESSION["b_trovata"] = $b_trovata;
   $_SESSION["b_bic"] = $b_bic;

   $xml=simplexml_load_file("../swift.xml");
   foreach($xml->indice as $dati){
         if (substr($dati->bic, 0, 8) == substr($b_bic, 0, 8)){
           $b_trovata = $dati->banca;
           //echo "codice id ".$dati['id']." - BIC: ".$b_iban." corrisponde alla banca ".$b_trovata."<br />";
           break;
         }
   }
   
}
?>
 

Dairon

Nuovo Utente
27 Ago 2017
9
0
1
64
Grazie mille, proverò stasera. Avevo il sentore che session_start() dovevo metterlo all'inizio!
Sì, gli input b_banca b_bic e b_iban qui non si vedono perché sono in un file che includo.
Spero proprio che così si risolva...
 

Dairon

Nuovo Utente
27 Ago 2017
9
0
1
64
Provato come mi hai consigliato: funziona!
Io non avevo messo all'inizio il session_start() perché dapprima non lo utilizzavo, poi mi si è reso indispensabile utilizzarlo per passare le variabili alla pagina che invia la mail con i dati e, siccome analizzavo i dati "lì", l'avevo messo "lì". Non lo uso spesso questo comando ed ho dimenticato che bisogna utilizzarlo all'inizio, pena il mal funzionamento delle variabili!
Ora pare che lo faccia bene, sia se trova il bic sia se non lo trova.
Riprovo tutta la sera variando dati immessi, bic che ci sono nell'archivio e bic che non ci sono... ti farò sapere.
Grazie mille! :);)
 

Dairon

Nuovo Utente
27 Ago 2017
9
0
1
64
Controllato e ricontrollato: funziona tutto tranne il trasmettere la variabile che ha letto nell'archivio xml. E' il male minore, perché è un dato che non è importante ai fini dello scopo. A video la mette, se la trova. Ed è quello lo scopo. A me arriva la mail senza (ho controllato il file che invia la mail e lì c'è la variabile :))

Siccome legge il file xml dopo aver settato la variabile globale, ho messo
Codice:
   $_SESSION["b_trovata"] = $b_trovata;
sotto la lettura del file xml, ma niente.
Ho provato a mettere fuori dall'if la routine di lettura file xml, ma niente...
Insomma, ora funziona a video, quindi il 99,9% è risolto e ne sono felicissimo!
Anche se rimane così, va bene lo stesso.
Se ti dovesse venire un'idea, la proverò... ma ripeto, va bene anche così.

Rinnovo ancora i ringraziamenti... ;)