2015-08-02 15 views
6

Kluczową kwestią jest tutaj wiedzieć, kiedy PDO zwraca wartość true, a kiedy false.pdo zwraca wartość true dla wielu zapytań, nawet jeśli jedna z nich nie powiedzie się.

Dokumentacja mówi "prawda", jeśli pomyślnie "fałsz" po niepowodzeniu. Co więc oznacza sukces i porażkę w MySQL?

Oto mój obecny pytanie: Mam wysłaniu zapytania wszystko razem w jednym PDO wykonania i zwraca true nawet foreign_id nie powinny być NULL:

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

ale jeśli mam wysłać tylko

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

false jest poprawnie zwracane.

N.B. NULL służy wyłącznie do celów testowych, zwykle jest zastępowane przez @id.

próbowałem dalej, aby zobaczyć zachowanie PDO:

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

Oto pierwsza wkładka jest prawidłowa, nie drugi i PDO zwraca true .. Dostaję myśleć, że PDO zwraca true gdy tylko jedno zapytanie się uda.

Czy możesz mi to wyjaśnić, więc raz wiem, jak sobie poradzić z moją bazą danych. bo cały mój program oparty na tej zasadzie:

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

Przypuszczam, że podobnie jak każdego innego adaptera bazy danych PDO wykonuje tylko pierwsze oświadczenie. Reszta jest ignorowana, więc nie powoduje błędu. Jak inaczej powinno działać powiązanie parametru? – arkascha

+0

Używanie biblioteki PDO do transakcji http://php.net/manual/en/pdo.begintransaction.php – Mihai

+0

@arkascha faktycznie działa, możemy wysyłać wiele zapytań i wszystkie są wykonywane. ale pdo zwraca tylko false, jeśli pierwsze zapytanie się nie powiedzie. –

Odpowiedz

0

widzę PDO nie obsługuje, że zawsze zwraca true, jeśli pierwsza instrukcja powiedzie niezależny od pozostałych zapytań .. wciąż widzę, że to błąd, ponieważ w celu skorygowania z mojego punktu widzenia kodowanie będzie lżejsze i prawdopodobnie szybsze, jeśli podamy, co php do php, a co sql do mysql. daję tutaj następujący przykład, aby zobaczyć, gdzie to może być łatwiejsze do kodowania wielu zapytań ze sobą, czy to możliwe:

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 tutaj przygotowuje oświadczenie wykonuje go i wyświetla błąd (jeśli w ogóle do debugowania zostanie wyłączony później). a gdy wszystkie zapytania się powiedzie, to je popełnia. inaczej cofnięcie

Dobrze, aby było prawdziwe, nie można tego zrobić. z powodu, że każde z tych pytań musi być złożone i sprawdzone indywidualnie z kodem więcej ..

lub w tym przypadku

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

gdzie zmienna jest potrzebny od pierwszego zapytania do drugiego. z php należy zażądać pobrania, a następnie wstawić z powrotem do drugiej linii. Nie jestem ekspertem ani w php, ani w sql może być tylko ja myślę. Ja po prostu lubię mieć ogólną funkcję, że mogę polegać na rzeczy do zrobienia razem, więc można przejść na inne problemy .. może to nie jest dobry sposób, ale ja przyszedłem z tego obejść:

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 wyśle ​​transakcję, a następnie przeprowadź pętlę przez przekazaną tabelę i wyślij każde zapytanie. Jeśli coś się nie powiedzie, to się zepsuje i wykona powrót. Jeśli wszystko pójdzie dobrze, to się potwierdzi.

czekam na suggesstion o tym, jak skuteczne jest to

Powiązane problemy