Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    PDO Gestione errori non funziona

    Salve a tutti, come mi e' stato suggerito sto' cercando di utilizzare PDO al posto di MYSQL.

    Dopo lungo lavoro sono riuscito a scrivere questo codice :

    <PHP>

    <?php


    try {
    $db = new PDO('mysql:host=localhost;dbname=xxxx;charset=utf8 mb4',"root", ""); }
    catch (PDOException $EXCEPTIONS) {
    echo $EXCEPTIONS->getMessage(); }

    try {
    $db->setAttribute (PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); }
    catch (PDOException $EXCEPTIONS) {
    echo $EXCEPTIONS->getMessage(); }



    $email="roma@libero.it";

    try {
    $stmt= $db->prepare("Select * FROM anagrafe WHERE anaEmai=:anaEmai"); }
    catch (PDOException $EXCEPTIONS) {
    echo $EXCEPTIONS->getMessage(); }

    try {
    $stmt->bindvalue(':anaEmai', $email, PDO::PARAM_STR); }
    catch (PDOException $EXCEPTIONS) {
    echo $EXCEPTIONS->getMessage(); }

    try {
    $stmt->execute();
    } catch (PDOException $EXCEPTIONS) {
    echo $EXCEPTIONS->getMessage(); }

    $righe=$stmt->rowCount();
    echo "righe " . $righe;
    unset($db);
    ?>

    </PHP>

    Funziona bene, pero' riscontro una anomalia, se modifico la query :
    "Select * FROM anagrafe WHERE anaEmai=:anaEmai"
    in "Select * anagrafe WHERE anaEmai=:anaEmai"

    il gestore degli errori interviene solo sulla riga di execute e non in PREPARE e
    BIND, questo sebbene anche questi comandi dovrebbero generare (letto dal manuale)
    errori.

    Ho provato anche a controllare se tornano FALSE, possibilita' sempre prevista dal
    manuale, ma neppure questo funziona.

    E' vero che posso utilizzare il codice cosi' come e', magari eliminando i TRY/CATCH su PREPARE
    e BIND che sono inutili, ma mi piacerebbe capire perche' ho questo risultato.

    Spero qualcuno sia in grado di darmi un suggerimento.

    Grazie.

    p.s. dico lungo lavoro perche' oltre a scrivere il codice (aiutato da web) ho cercato di capirlo, cosa per me non proprio semplicissima.
    Ultima modifica di curzio.maria; 19-05-2017 a 15:18

  2. #2
    Prova a dare uno sguardo qui, parla della gestione degli errori di PDO

    http://php.net/manual/en/pdo.error-handling.php

    Saluti

  3. #3
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    OT: per postare il codice hai messo i tag
    <PHP> e </PHP>
    devi usare le parentesi quadre [ ] altrimenti non funziona.

  4. #4
    @Alhazred
    .... ho anche letto due volte le istruzioni nel post iniziale ... che posso dire .. sono un pirla.
    @bauleviaggiante
    Grazie controllo subito.

  5. #5

    Controllato

    Ho controllato il manuale del PDO per quanto attiene le eccezioni.
    Da quanto leggo ho due possibilita' : settare il gestore o usare quello previsto di defaul (SILENT).

    Con SILENT il comando errato ( mi riferisco a PREPARE) torna FALSE, con il gestore settato torna una eccezione gestibile da TRY / CATCH.

    Bene nell'esempio che segue il gestore e' abilitato, ma non torna alcuna eccezione

    Codice PHP:

        
    try {       
           
    $db = new PDO("mysql:host=localhost;dbname=sac;charset=utf8"DB_USER  DB_PW); }        catch (PDOException $EXCEPTIONS
             {        
    handle_error $EXCEPTIONS->getMessage()); }    
        try {        
    $db->setAttribute (PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); } 
        catch (
    PDOException $EXCEPTIONS) { handle_error $EXCEPTIONS->getMessage()); }                   $email="roma@libero.it"
        try {    
    $stmt$db->prepare("Select * anagrafe  anaEmai=:anaEmai");  }  
        catch (
    PDOException $EXCEPTIONS) {handle_error $EXCEPTIONS->getMessage()); }    
        try { 
    $stmt->bindvalue(':anaEmai'$emailPDO::PARAM_STR); }
        catch (
    PDOException $EXCEPTIONS
        {        
    handle_error $EXCEPTIONS->getMessage()); }
        try {        
    $stmt->execute();  }  
        catch (
    PDOException $EXCEPTIONS) { handle_error $EXCEPTIONS->getMessage());     }    $righe=$stmt->rowCount();    echo "righe " $righe;unset($db); 

    Nel caso del codice del post la stringa SQL "Select * anagrafe WHERE anaEmai=:anaEmai"
    e' sicuramente sbagliata.
    Eppure nessuna eccezione viene generata.

    Idem per il comando di BIND, ma questo puo' anche essere normale, assolutamente meno normale
    per l'execute che anch'essa non torna eccezioni.

    L'unico segnale che qualcosa non ha funzionato e' il valore numrow = 0 perche' io so che
    per forza deve essere 1.

    Mi sembra assai poco rassicurante.

    Poiche' il manuale afferma che se il gestore degli errori e' settato su SILENT non viene generata alcuna eccezione ma il comando PREPARE torna FLASE ho provato anche questo :


    Codice PHP:
        try { $db = new PDO("mysql:host=localhost;dbname=sacradomus;charset=utf8"DB_USER                DB_PW); }  
      catch (
    PDOException $EXCEPTIONS) {        handle_error $EXCEPTIONS->getMessage());  }   $email="roma@libero.it";   
      
    $stmt$db->prepare("Select * anagrafe WHERE anaEmai=:anaEmai");  
       if (!
    $stmt)    
            { echo 
    "Errore ";       
            }      
       else   
            { echo 
    "corretto ";      
         }
         
    $stmt->bindvalue(':anaEmai'$emailPDO::PARAM_STR);   
         
    $stmt->execute();    $righe=$stmt->rowCount();     
        echo 
    "righe " $righe;    unset($db); 
    Tutto uguale arriva alla fine, stampando "corretto" e righe 0.

    Posso rileggere ancora il manuale ma non credo possa essermi utile.
    Osservo inoltre, ho scritto (copiato) 4 comandi :

    OPEN
    STRINGA CON PARAMETRI
    ASSEGNAZIONE DEI PARAMETRI
    ESECUZIONE DELLA QUERY

    ogni comando e' stato inserito in TRY/CATCH e nonostante questo arrivo alla
    fine dello script.
    DI CERTO SBAGLIO IO, pero' mi pare tutto assai bizzarro, concludo dicendo che il gestore degli errori PHP e' settato al massimo error_reporting(E_ALL);.

    Grazie
    Ultima modifica di curzio.maria; 20-05-2017 a 16:28

  6. #6
    prova :

    Codice PHP:
    $db->setAttribute (PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION
    inoltre non c'e bisogno di piazzare 10 try/catch per 10 istruzioni, puoi mettere 10 instruzioni dentro un try catch

    Codice PHP:
    try {       
       
    $db = new PDO("mysql:host=localhost;dbname=sac;charset=utf8"DB_USER  DB_PW);
       
    $db->setAttribute (PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    }
    catch (
    PDOException $EXCEPTIONS) {
       echo 
    'qualcosa non ha funzionato '.$EXCEPTIONS->getMessage();
    }  
      
    try {
       
    $email="roma@libero.it"
        
    $stmt$db->prepare("Select * anagrafe  anaEmai=:anaEmai");
       
    $stmt->bindvalue(':anaEmai'$emailPDO::PARAM_STR);
       
    $stmt->execute();
       
    $righe $stmt->rowCount();
       echo 
    "righe " $righe;
       unset(
    $db);
    }   
    catch (
    PDOException $EXCEPTIONS){
      echo 
    'anche qui qualcosa non ha funzionato:'$EXCEPTIONS->getMessage();

    un po meglio no?

  7. #7
    Che diavolo è la funzione handle_error() ?

  8. #8
    @bauleviaggiante
    Innanzi tutto grazie, per la pazienza e per l'aiuto.
    Il tuo codice funziona, ho provato a modificare (inserendo errori ) le stringhe di PREPARE e BINDVALUE e puntualmente è scattato l'errore con relativo messaggio.

    Doverosamente riconosciuto il giusto merito mi piacerebbe capire cosa è successo.
    Allora, il tuo primo suggerimento era di provare :
    Codice PHP:
    $db->setAttribute (PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION
    bene nella versione pre post io utilizzavo questo attributo, cambiato poi in " ERRMODE_WARNING " solo prima del post, quindi non puo' essere questa la causa del problema.

    Controllando il codice da te inviato ho riscontrato che l'unica differenza ( che pero' determina il non funzionamento del codice ) e' la diversa struttura try/catch.

    E' assolutamente vero che la struttura da me usata è, usando un eufemismo, ridondante, ma mai e poi mai sarei arrivato anche solo a ipotizzare che tale (ab)uso potesse creare un simile disastro.


    La funzione handle_error e' la seguente :
    Codice PHP:

    function handle_error($user_error_message$system_error_message
      { 
          
    session_start(); 
          
    $_SESSION['primomessa] = $user_error_message;  
          $_SESSION['
    secondomessaggio'] = $system_error_message; 
          header("Location: script/show_error.php"); 
          exit();
      } 
    Da PHP e MYSQL (Brett MCLaughlin / Tecniche nuove) ho modificato il tuo codice
    utilizzando questa funzione e tutto funziona bene.

    Grazie ancora.

  9. #9
    Sono contento funzioni.

    Senmpre in handle_error, controlla gli apici degli indici sell'array $_SESSION, magari è un errore di trascrizione qui nel forum, magari no.

    Cerca di organizzare la gestione della sessione in maniera diversa, come una cosa a se, e da richiamare tra le primissime cose all'inizio di ogni script.

    Saluti.

  10. #10
    @bauleviaggiante
    Grazie per i suggerimenti, controllo e approfondisco la questione delle sessioni.
    Grazie

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.