2015-08-02 12 views
6

La domanda profonda qui è sapere quando PDO restituisce vero e quando falso.pdo restituisce true su più query anche se una di esse non riesce

La documentazione dice true se l'esito è corretto in caso di errore. Allora, cosa c'è successo e fallimento in MySQL?

Ecco la mia domanda attuale: sto trasmettendo questa query tutti insieme in un PDO esecuzione e restituisce vero anche foreign_id non dovrebbe essere NULL:

SET @id := NULL; SELECT id INTO @id FROM ? WHERE id = ? AND to_user = ?; 
INSERT INTO hidden_notifications(table_name, foreign_id) VALUES (?, NULL); 

ma se mando solo

INSERT INTO hidden_notifications(table_name, foreign_id) VALUES (?, NULL); 

false è correttamente restituito.

N.B. NULL è solo per scopi di test normalmente è sostituito da @id.

ho cercato ulteriormente per vedere il comportamento della DOP:

INSERT INTO hidden_notifications(table_name, foreign_id) VALUES (?, ?); 
INSERT INTO hidden_notifications(table_name, foreign_id) VALUES (?, NULL); 

Ecco il primo inserto è corretta la seconda e la non DOP ritorna vero .. mi sto a pensare che PDO restituisce true quando solo una query riesce.

Potete spiegarmelo, quindi so una volta per tutte come gestire il mio database. perché ho basato tutto il mio programma su questo principio:

execute('BEGIN') 
execute(myquery) // which can be many selections, insertions updates together in one string 
if succed execute('COMMIT') 
else execute('ROLLBACK') 
+1

Parto dal presupposto che, come qualsiasi altro adattatore di database PDO viene eseguito solo la prima istruzione. Il resto viene ignorato, quindi non genera un errore. In che altro modo dovrebbe funzionare il binding dei parametri? – arkascha

+0

Utilizzare la libreria PDO per le transazioni http://php.net/manual/en/pdo.begintransaction.php – Mihai

+0

@arkascha in realtà funziona, è possibile inviare più query e tutte vengono eseguite. ma pdo restituisce solo false se la prima query non riesce. –

risposta

0

vedo DOP non supporta che restituisce sempre vero se la prima dichiarazione riesce indipendente dalle altre query .. vedo ancora che un bug per correggere perché dal mio punto di vista la codifica sarà più leggera e probabilmente più veloce se diamo cosa php a php e cosa a sql a mysql. dò qui l'esempio seguente per vedere dove potrebbe essere più facile da codificare molte domande insieme, se fosse possibile:

pdoQuery("INSERT INTO users SELECT * FROM temp_users WHERE user_id = ? LIMIT 0, 1; 
      DELETE FROM temp_users WHERE user_id = ?; 
      DELETE FROM sign_up_confirm_urls WHERE user_id = ?; 
      INSERT INTO actions(user_id, code, foreign_id) VALUES (?, ?, ?);", 
      Array($user_id, $user_id, $user_id, $user_id, $user_id, $actions_ini['create_account'], $user_id)); 

pdoQuery qui prepara la dichiarazione lo esegue e di errore (se presente per il debug verrà disattivato in seguito). e quando tutte le domande riescono, le impegna. altrimenti rollback

Bene a bene per essere vero, questo non può essere fatto. a causa di tale ciascuno di tali domande deve essere presentata e controllati individualmente con più codice ..

o in questo caso

SET @id := NULL; SELECT id INTO @id FROM ? WHERE id = ? AND to_user = ?; 
       INSERT INTO hidden_notifications(table_name, foreign_id) VALUES (?, NULL); 

in cui è necessaria la variabile dalla prima query al secondo. con php deve essere richiesto con fetch e poi inserito nella seconda riga. non sono esperto né in php né in sql potrebbe essere io sono l'unico a pensare come. Mi piace solo avere funzione generale che posso contare su di fare cose tutti insieme in modo che io possa passare sopra altri problemi .. può essere non è un buon modo, ma io sono venuto con questa soluzione:

pdoQuery(array(
      array("INSERT INTO users SELECT * FROM temp_users WHERE user_id = ? LIMIT 0, 1;", array($user_id)), 
      array("DELETE FROM temp_users WHERE user_id = ?;", array($user_id)), 
      array("DELETE FROM sign_up_confirm_urls WHERE user_id = ?;", array($user_id)), 
      array("INSERT INTO actions(user_id, code, foreign_id) VALUES (?, ?, ?);", array($user_id, $actions_ini['create_account'], $user_id)) 
); 

pdoQuery invierà una transazione, quindi passerà in loop attraverso la tabella passata e invierà ogni query .. se fallisce, si interrompe e fa un rollback .. se tutto va bene, commette.

Sto aspettando suggesstion su come efficace questo è

Problemi correlati