[OT?] [PHP-PDO-CLASS] controllo incrociato tra due funzioni
Salve a tutti, mi scuso per l'eventuale OT. Vado subito al dunque: ho un form per la creazione di un nuovo utente, i dati vengono salvati tramite PDO in un db postgres. Poiché alcuni dati vengono salvati in una tabella (rubrica) mentre altri in una tabella specifica (utenti), utilizzo le funzioni PDO per le transazioni. Salvati i dati nel db, utilizzo phpMailer per inviare all'utente la password generata automaticamente dal sistema. Allo stato attuale ho 4 possibili risultati: 1. entrambe le operazioni vanno a buon fine: dati salvati, mail spedita 2. nessuna delle operazioni va a buon fine: errore nella transazione dei dati, errore nell'invio della mail 3. l'utente viene creato ma la mail non viene spedita 4. la mail viene spedita ma l'utente non viene creato Esiste un modo per evitare i punti 3 e 4? Cioé, se c'è un errore nell'invio della mail non salvare i dati nel db, oppure se c'è un errore nella query non inviare la mail. Ho provato a gestire la cosa con try - catch ma non ho risolto. Consigli? Grazie a tutti e buona serata -- *Giuseppe Naponiello* *A**rc-**T**eam srl* piazza Navarrino, 13 - 38023Cles (TN) C.F. e P. IVA IT-01941600221 cell. +393476846599 mail: beppen...@arc-team.com pec: arc-t...@pec.it 101 | www.arc-team.com 110 | http://arc-team-open-research.blogspot.it/ 000 | https://independent.academia.edu/GiuseppeNaponiello
Re: [OT?] [PHP-PDO-CLASS] controllo incrociato tra due funzioni
On 09/08/2018 16:20, Giuseppe Naponiello wrote: ho un form per la creazione di un nuovo utente, i dati vengono salvati tramite PDO in un db postgres. Allo stato attuale ho 4 possibili risultati: 1. entrambe le operazioni vanno a buon fine: dati salvati, mail spedita 2. nessuna delle operazioni va a buon fine: errore nella transazione dei dati, errore nell'invio della mail 3. l'utente viene creato ma la mail non viene spedita 4. la mail viene spedita ma l'utente non viene creato Esiste un modo per evitare i punti 3 e 4? perché evitare 3? se l'utente è creato devi impostare, all'interno della transazione un flag che dice utente creato, mail da inviare. Poi un job ogni tot manda la mail a tutti quelli che hanno lo stato creato, ma mail non inviata e se riesce ad inviare la mail cambia lo stato, altrimenti mette in un log l'errore d'invio. In questo modo risolveresti anche il punto 4. Poi non è capito il tuo discorso, forse perché non conosco PHP, ma se l'utente non viene creato non potevi semplicemente verificare quanti record erano stati inseriti nella tabella con l'ultima insert fatta e se ti ritornava 1, allora spedivi la mail? Ciao Davide -- Dizionari: http://linguistico.sourceforge.net/wiki Motivi per non comprare/usare ms-windows-vista: http://badvista.fsf.org/ Non autorizzo la memorizzazione del mio indirizzo su outlook
Re: [OT?] [PHP-PDO-CLASS] controllo incrociato tra due funzioni
On 09/08/18 15:30, Giuseppe Naponiello wrote: > Salvati i dati nel db, utilizzo phpMailer per inviare all'utente la > password generata automaticamente dal sistema. > Allo stato attuale ho 4 possibili risultati: > 1. entrambe le operazioni vanno a buon fine: dati salvati, mail spedita > 2. nessuna delle operazioni va a buon fine: errore nella transazione dei > dati, errore nell'invio della mail > 3. l'utente viene creato ma la mail non viene spedita > 4. la mail viene spedita ma l'utente non viene creato > > Esiste un modo per evitare i punti 3 e 4? Cioé, se c'è un errore > nell'invio della mail non salvare i dati nel db, oppure se c'è un errore > nella query non inviare la mail. Per prima cosa: non hai modo di sapere se ci sono stati errori nell'invio della mail. L'unica cosa che puoi controllare (parzialmente) è che il server SMTP che hai impostato per spedire mail non torni un errore. In questo caso, e solo in questo caso, puoi provare con: if (false === $pdo->beginTransaction()) { exit; } $res1 = $pdo->exec('insert into rubrica...'); $res2 = $pdo->exec('insert into utenti...'); $mailres = false; if ($res1 > 0 && $res2 > 0) { $mailres = mail(...); } if ($mailres === false) { $pdo->rollBack()); } else { $pdo->commit(); } Bye.
Re: [OT?] [PHP-PDO-CLASS] controllo incrociato tra due funzioni
Il giorno gio 9 ago 2018 alle ore 21:24 Davide Prina ha scritto: > > On 09/08/2018 16:20, Giuseppe Naponiello wrote: > > > ho un form per la creazione di un nuovo utente, i dati vengono salvati > > tramite PDO in un db postgres. > > > perché evitare 3? > se l'utente è creato devi impostare, all'interno della transazione un > flag che dice utente creato, mail da inviare. > > Poi un job ogni tot manda la mail a tutti quelli che hanno lo stato > creato, ma mail non inviata e se riesce ad inviare la mail cambia lo > stato, altrimenti mette in un log l'errore d'invio. > > In questo modo risolveresti anche il punto 4. > > Poi non è capito il tuo discorso, forse perché non conosco PHP, ma se > l'utente non viene creato non potevi semplicemente verificare quanti > record erano stati inseriti nella tabella con l'ultima insert fatta e se > ti ritornava 1, allora spedivi la mail? > la butto lì, non ho grande esperienza, ma perché non fare la procedura di creazione dell'utente, in un task successivo controllare se l'utente è stato creato, e solo a quel punto inoltrare la mail. oltretutto presentare in fase di login, il link per richiedere la mail con la password se non si è già ricevuta, sposti il problema all'utente (molti mandano una mail di certificazione dell'account, per verificare la mail, se non viene verificata, entro 48 ore cancelli l'utente, perché se dovessero aver messo la mail sbagliata, avresti altrimenti bruciato lo username, così invece l'utente può procedere a rifare la procedura diregistrazione). e ti toglieresti dalle cosidette tutti i controlli incrociati che devi fare (e che non sempre puoi verificare, tu puoi aver inviato la mail, ma l'utente potrebbe non averla ricevuta per problemi suoi). Byez -- Gollum1 - http://www.gollumone.it Tesoro, dov'é il mio teoro...