PHP, PDO e visualizzazioni errori e/o eccezioni

frankz

Nuovo Utente
27 Dic 2017
9
0
1
65
Qualcuno mi puo' dire come fare ad aprire finestra visualizzando gli errori sql del DB (mysql).
il codice nel file conn.php
PHP:
<?php
session_start();
$_SESSION['dbinuso']="ottica";
    $hostname="localhost";
    $dbname= $_SESSION['dbinuso'];

    $user="root";
    $pass="pippo";
    $dboptions = array(
        PDO::ATTR_PERSISTENT => FALSE,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
    );
    
    try {
        $DBsel= new PDO("mysql:host=$hostname;dbname=$dbname", $user, $pass, $dboptions);
        
    }
    catch (PDOException $ex){
        echo "ERRORE:  ". $ex->getMessage();
        die();
    }
    
?>
mi funziona tutto, tranne se NON viene inserito correttamente il nome del DB, mi compare semplicemente una pagina bianca.

mentre nel seguente caso, dove i dati provengono da un form ( e anche da JS) non segnala nessun errore del DB.
mi spiego :il campo codfisc deve essere univoco (con phpmuadmin, in effetti mi da l'errore)
PHP:
<?php
include 'conn.php';

$cognome = $_POST['cognome'];
$nome = $_POST['nome'];
$codfisc = $_POST['codfisc'];
$indirizzo = $_POST['indirizzo'];
$citta = $_POST['citta'];
$cap = $_POST['cap'];
$tel = $_POST['tel'];
$tipo = $_POST['tipo'];
$email = $_POST['email'];
$piva = $_POST['piva'];
$telcell = $_POST['telcell'];
$pr = $_POST['pr'];
$qualifica = $_POST['qualifica'];
$note = $_POST['note'];

$sql=" INSERT INTO clienti(
        cognome,
        nome,
        codfisc,
        indirizzo,
        citta,
        cap,
        tel,
        tipo,
        email,
        piva,
        telcell,
        pr,
        qualifica,
        note) VALUES (
        :cognome,
        :nome,
        :codfisc,
        :indirizzo,
        :citta,
        :cap,
        :tel,
        :tipo,
        :email,
        :piva,
        :telcell,
        :pr,
        :qualifica,
        :note)";

try {
    $stmt = $DBsel->prepare($sql);
    
        $stmt->bindParam(':cognome',$cognome);
        $stmt->bindParam(':nome',$nome);
        $stmt->bindParam(':codfisc',$codfisc);
        $stmt->bindParam(':indirizzo',$indirizzo);
        $stmt->bindParam(':citta',$citta);
        $stmt->bindParam(':cap',$cap);
        $stmt->bindParam(':tel',$tel);
        $stmt->bindParam(':tipo',$tipo);
        $stmt->bindParam(':email',$email);
        $stmt->bindParam(':piva',$piva);
        $stmt->bindParam(':telcell',$telcell);
        $stmt->bindParam(':pr',$pr);
        $stmt->bindParam(':qualifica',$qualifica);
        $stmt->bindParam(':note',$note);
        
        $stmt->execute();
       // header("location: ../views/errore.html");
} catch (Exception $ex) {
    //printErrorMessage($ex->getMessage());
   // header("location: ../views/errore.html");
    echo "ERRORE:  ". $ex->getMessage();
    die ('ERRORE');
}
il codice JS relativo alle istruzioni sopra è:
Codice:
    $('#fanacli').form('submit');
    window.location.href = '../views/clienti.php';
qualcuno mi puo' aiutare o indicarmi come risolvere il problema?
grazie.
 

macus_adi

Utente Attivo
5 Dic 2017
1.327
89
48
IT/SW
Ciao @frankz, non capisco perchè inserisci il nome del database nella sessione, solitamente si usa un file di configurazione....
$stmt = $DBsel->prepare($sql);

$stmt->bindParam(':cognome',$cognome);
$stmt->bindParam(':nome',$nome);
$stmt->bindParam(':codfisc',$codfisc);
$stmt->bindParam(':indirizzo',$indirizzo);
$stmt->bindParam(':citta',$citta);
$stmt->bindParam(':cap',$cap);
$stmt->bindParam(':tel',$tel);
$stmt->bindParam(':tipo',$tipo);
$stmt->bindParam(':email',$email);
$stmt->bindParam(':piva',$piva);
$stmt->bindParam(':telcell',$telcell);
$stmt->bindParam(':pr',$pr);
$stmt->bindParam(':qualifica',$qualifica);
$stmt->bindParam(':note',$note);

$stmt->execute();

Quando effettui le chiamate in ajax, dovresti prevedere i casi possibili e le relative rispose.... Va bene il preparedstatement, me se hai dei vincoli dovresti gestirli in modo differente....

Altra nota, prevedi una mappatura nel modello, così quando invii i dati (che sia js o no) non devi metterci mano....
Mi spiego...
$('#fanacli').form('submit');

Cosa produce?
Sicuramente valorizzi la variabile POST, credi convenga mappare i dati a mano? Ad ogni modifica del DB e/o della view dovrai ricordarti di inserire i valori mancanti nella insert/update/select.
Secondo me le cose da fare sono :
  1. Creare il modello per recuperare, modificare e inserire i dati
  2. Insert
    1. Prevedere i vincoli e nel caso gestire l'eccezioni, tipo (codfiscale univoco)
      1. Prevedi un metodo che verifica il codice fiscale
      2. Nel caso in cui il codice fiscale risulta già inserito non prosegui con il codice
    2. Mappa il modello dati con la view a modi array
PHP:
$map_insert=['nome'=>'view_name','cognome'=>'my_cognome'....etc]
In questo modo sleghi effettivamente i nomi degli input con i reali campi del DB. Naturalmente nel modello devi prevedere tutte le eccezioni....

Cmq tornando alla tua richiesta.....
PHP:
print_r($DBsel->errorInfo());
http://php.net/manual/en/pdo.errorinfo.php

Spero sia utile, e soprattutto spero si capisca...
 

marino51

Utente Attivo
28 Feb 2013
3.017
174
63
Lombardia
per la tua specifica richiesta, considera che,

un errore non dovrebbe mai essere generato dalla gestione del db in "produzione",
se ciò dovesse mai succedere,

credo sia necessario interrompere quella transazione per evitare inconsistenze nel db stesso

se poi il messaggio di errore arriva all'utente, quasi sicuramente viene perso e non comunicato nei dovuti modi a chi deve provvedere

da queste considerazioni, ti suggerisco di registrare il messaggio di errore nel log di php, modificando il file conn.php con,
PHP:
try { $DBsel= new PDO("mysql:host=$hostname;dbname=$dbname", $user, $pass, $dboptions); }
catch (PDOException $ex) { sql_errors("PDO : ERRORE connessione al db", $ex); }

function sql_errors($sql, $e)
{
    error_log("SQL cmd    : ".$sql, 0);
    error_log("error code : ".$e->getCode(), 0);
    error_log("error info : ".$e->getMessage(), 0);

    die("ERRORE INATTESO, contatta l'amministratore del sistema");
}

ed allo stesso modo puoi usare la funzione che è stata inserita nei successivi script php che includono "conn.php"

PHP:
    $stmt->execute();
}
catch (PDOException $ex) { sql_errors($sql, $ex); }

certo è utile avere anche il contenuto delle variabili che alimentano la query,
puoi ampliare la funzione "sql_errors" affinchè affinchè le possa trattare (magari attraverso un'array)
 

frankz

Nuovo Utente
27 Dic 2017
9
0
1
65
Scuatemi per il ritardo della risposta, ma ero impossibilitato a rispondere.
Il DB lo metto in sessione perche' ogni anno devo svuotare alcune tabelle contabili, matenere lo storico dei clienti. facendo la copia a fine anno, in seguito posso richiamare il DB di qull'anno specifico. Sperando che possa aprire il DB in sola lettura (non ci avevo ancora pensato a questo particolare).
Ho risolto facendo un Submit "normale" e NON con ajax (che ho capito solo il principio).
Per quanto riguarda le MAp hai ragione, ma non le conosco.
Mi puoi dare dei link o libri per approfondire gli argomenti di ajax e Map ?
Grazie.
 
Discussioni simili
Autore Titolo Forum Risposte Data
K [PHP] PDO.bindingParam PHP 2
M [PHP] Interrompere DROP TABLE con PDO PHP 0
M [PHP] Alternativa a datagrid con PDO PHP 6
M [PHP] Creare un menu a tendina con pdo PHP 18
M [PHP] Array di array - PDO PHP 2
W [PHP] Creazione classe PDO PHP 4
3_g [PHP] mvc, pdo e classi... PHP 7
F php PDO mysql connessione(select_db) PHP 3
Fredyss redirect a altra pagina php dopo commit su postgresql con PDO PHP 1
C [PHP] PDO prepared statement - select query errore PHP 7
ANDREA20 [PHP] Errore $this->db_connection = new PDO PHP 0
MarcoGrazia [PHP][PDO][MySQL] Non registra ma non da nemmeno errori. PHP 0
MarcoGrazia [PHP][PDO] Come connettersi al database Snippet PHP 0
MarcoGrazia [PDO][PHP[MySQL] Piccolo modulo di ricerca in un sito tramite l'operatore LIKE Snippet PHP 0
neo996sps [PHP e funzioni con PDO] Funzione per generare corpo tabella PHP 1
R Organizzazione PHP Mysql PDO PHP 15
voldemort PHP PDO: non c'ho capito niente PHP 1
T fatture con voci fattura in php PHP 0
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
M Collegamento tra form html e script php PHP 4
M Problemi con la stampa dei valori in php PHP 1
W [Cerco collaborazioni] Sviluppatore Web (PHP) Offerte e Richieste di Lavoro e/o Collaborazione 0
D passare valori da database sql a php PHP 1
L Ricezione dei dati su file php da modulo html PHP 6
E Inviare variabile a PHP da ciclo in JS Javascript 0
A form PHP prenotazione tramite query PHP 2
A Form php prenotazione di un azienda sanitaria locale presso studio medico PHP 1
F menù select dinamico da db in php PHP 3
L Problemi form Pagina php HTML e CSS 3
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
F Il codice php è giusto? PHP 2
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
A invio massivo dati a file php Javascript 4
Z MySql injection PHP PHP 1
V PHP form intersecate PHP 0
I [Offro][Retribuito] Programmatore Php Offerte e Richieste di Lavoro e/o Collaborazione 0
P Funzione jQuery Ajax invio file a php jQuery 1
C Dopo chiusura del tag php la stringa html va a capo PHP 1
E Transaction php PHP 11
B ciclare file xml con PHP PHP 1
L Estrazione dati php Database 6
A Aiuto per pagina php PHP 0
E Php select option e ajax PHP 23
I Aiuto php Dependent Lookup PHP 0
T arretramento versione PHP... PHP 3
D problema php mysql PHP 1
D problema php mysql PHP 1
E Barra di avanzamento codice PHP PHP 4
G creazione menu a tendina e invio a pagina php PHP 1

Discussioni simili