Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: Gestione errori

  1. #1

    Gestione errori

    Buon giorno.
    Ho una funzione nella quale eseguo due operazioni.
    La prima è di Update di una tabella, la seconda è di invio di una mail.

    Codice PHP:
    public function InSegnalazioni(&$id,&$email,&$risposta,&$archivia){
    mysqli_autocommit($this->connectfalse);
    $query$this->connect->query("UPDATE ".TB_SEGNALAZIONI." SET "
    ." cRisposta=\"".$risposta."\""
    .",dRisposta=\"".date("Y-m-d H:i:s")."\""
    .",archiviato=\"".$archivia."\""
    .",cUserNameRisposta='m.nardi'"
    ." WHERE nIdSegnalazione=".$id."");

    if (
    $query === false) {                
    mysqli_rollback($this->connect);                
    return 
    false;            
    }
    else{                
    #invia email in caso di esito positivo                
    include '../phpmailer/phpmailer-contatta.php';
    return 
    true;
    }

    Al momento gestisco soltanto l'errore della query, e fin qui tutto ok.
    Ma il mio intento è quello di aggiungere anche un eventuale errore dell'invio della mail.
    Mi spiego.
    Se non riesce ad inviare la mail, non esegue nemmeno l'UPDATE, perché le due cose sono legate.
    Come faccio?
    Grazie dell'aiuto.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    783
    Puoi usare le transactions di mysql per farlo (come hai già provato a fare), esegui le query e l'invio della mail, se entrambi non hanno dato errori procedi con il commit della query, altrimenti fai un rollback. Io metterei tutto dentro ad un blocco try catch, facendo generare una exception a phpmailer-contatta.php e a mysql in caso di errore, così da uscire dal try prima di arrivare al commit.

    Questo codice non funziona, ci sono solo le parti utili a farti capire cosa farei io:

    codice:
    try {
    
    
    $this->connect->query($sql);
    include '../phpmailer/phpmailer-contatta.php';
    
    
    /** 
     * Se qui siamo ancora dentro al try significa che tutto è andato a buon fine.
     * Quindi facciamo il commit.
     */
     
    mysqli_commit($this->connect);
    
    
    } catch( Exception $e ) {
    
    
    mysqli_rollback($this->connect); 
    
    
    }
    L'unico problema qui è far generare a phpmailer-contatta.php e a mysqli delle Exception in caso di errore, io solitamente uso pdo quindi non ne sono certo ma dovrebbe bastare usare questa funzione:

    codice:
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    Phpmailer invece dovrebbe generare delle exception di default sugli errori, quindi non dovresti avere grossi problemi, magari controlla che siano passate correttamente dallo script esterno.

  3. #3
    adesso provo...grazie mille

  4. #4
    grazie per la risposta.
    Ho una ulteriore curiosità.
    Come hai notato includo, dopo l'esecuzione della query, la pagina phpmailer-contatta.php
    Codice PHP:
    public function InSegnalazioni(&$id,&$email,&$risposta,&$archivia){
    try{    
    $this->connect->query($sql);
    //vorrei passare la variabile $email a phpmailer-contatta.php
    include '../phpmailer/phpmailer-contatta.php'
    Tra i valori che passo alla funzione InSegnalazioni c'è &$email.
    Vorrei utilizzarla all'interno della pagina phpmailer-contatta.php, ma come faccio?

    Ho provato in questo modo e funziona:
    Codice PHP:
    //prima di include creo la variabile di sessione
    $_SESSION['email'] = $email;

    //in questo modo riesco ad avere l'email dentro phpmailer. 
    Ma c'è un altro modo senza utilizzare $_SESSION?
    Grazie.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    783
    Quando fai un include il codice che includi ha lo scope della linea in cui viene inserito.

    In pratica quando tu chiamo l'include la variabile $email è visibile, quindi lo sarà anche nel codice dentro phpmailer-contatta.php senza dover fare nulla di strano. Ma perchè a InSegnalazioni() passi le variabili per riferimento?

    Un consiglio che mi sento di darti, visto che stai provando a programmare ad oggetti è di iniziare ad usare i namespace, composer e l'autoloading, così da evitarti scomodi include e require ed avere un codice oop migliore.

  6. #6
    per il momento e ti ringrazio, puoi spiegarmi solo questa frase?

    Quando fai un include il codice che includi ha lo "scope della linea" in cui viene inserito.
    Grazie ancora.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    783
    Vuol dire che tutte le variabili a cui hai accesso nello script principale nel momento in cui includi il file esterno, saranno accessibili anche nel file esterno. Ovvero, se $email puoi usarla nulla riga subito precedente all'include, allora puoi usarla anche dentro a phpmailer-contatta.php

  8. #8
    Buon giorno.
    No purtroppo, dentro la pagina phpmailer-contatta.php l'indirizzo email è visibile prima della dichiarazione della classe, ma all'interno no:
    Codice PHP:
    include("phpunit.php");
    require(
    "class.phpmailer.php");
    error_reporting(E_ALL);
    echo 
    $email;//qui è ok
    class phpmailerTest extends TestCase{

    function 
    test_Html() {
    echo 
    $email;//qui NO
    }


    Ultima modifica di ANTAGONIA; 27-11-2017 a 10:44

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    783
    Certo, ma quello è perfettamente normale.

    Dichiarando una nuova classe all'interno di essa cambia lo scope, e quindi la variabile non puoi più vederla (dentro alla classe, fuori la vedi ancora).

    Tu stai facendo confusione anche con phpunit, il mio consiglio è lasciar perdere il testing (e quindi phpunit) per il momento e focalizzarti sull'imparare le basi del linguaggio e la programmazione ad oggetti. Ti manca un po' di teoria ed è difficile spiegarti le cose senza quelle basi.

    Quella libreria phpmailer dove l'hai presa? E' questa https://github.com/PHPMailer/PHPMailer?

  10. #10
    tutto il pacchetto l'ho scaricato qualche annetto fa.
    Però io devo risolvere al volo sta situazione.
    Certo devo studiare ed approfondire, ma al momento non è possibile, l'unica cosa che devo fare al volo se è fattibile è passare quella c...o di variabile $email, all'interno della classe.
    Altrimenti come ho risolto per altre volte, glie la passo con una variabile di sessione e amen.
    Codice PHP:
    try{    
    $this->connect->query($sql);
    $_SESSION['email'] = $email;
    include 
    '../phpmailer/phpmailer-contatta.php'
    in questo modo, la vedo anche dentro la classe ed ho risolto.

    Altrimenti?
    Grazie ancora della pazienza.

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.