Saya menggunakan PDO untuk memasukkan catatan (mysql dan php)
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
Adakah cara untuk mengetahui apakah itu berhasil disisipkan, misalnya jika catatan tidak dimasukkan karena merupakan duplikat?
Sunting: tentu saja saya dapat melihat database, tapi maksud saya umpan balik terprogram.
if ($stmt->execute()) { //true }
PDOStatement->execute()
danPDOStatement->errorCode()
sepenuhnya konsisten satu sama lain? Apakah ada keadaan ketikaPDOStatement->errorCode()
memiliki sesuatu tetapiPDOStatement->execute()
kembali benar? Atau ketikaPDOStatement->execute()
mengembalikan false tetapiPDOStatement->errorCode()
tidak memiliki apa-apa?Mengingat mode kesalahan yang paling direkomendasikan untuk PDO adalah
ERRMODE_EXCEPTION
, tidak adaexecute()
verifikasi hasil langsung yang akan berfungsi . Karena eksekusi kode bahkan tidak akan mencapai kondisi yang ditawarkan di jawaban lain.Jadi, ada tiga skenario yang mungkin untuk menangani hasil eksekusi query di PDO:
try..catch
operator.Untuk pengguna PHP biasa kedengarannya agak asing - bagaimana, bukan untuk memverifikasi hasil langsung dari operasi? - tetapi beginilah tepatnya cara kerja pengecualian - Anda memeriksa kesalahan di tempat lain. Sekali untuk semua. Sangat nyaman.
Jadi, singkatnya: dalam kode biasa Anda tidak memerlukan penanganan error sama sekali. Simpan saja kode Anda apa adanya:
Jika berhasil, ia akan memberi tahu Anda demikian, jika ada kesalahan ia akan menampilkan halaman kesalahan biasa bahwa aplikasi Anda ditampilkan untuk acara seperti itu.
Hanya jika Anda memiliki skenario penanganan selain hanya melaporkan kesalahan, letakkan pernyataan insert Anda di
try..catch
operator, periksa apakah itu kesalahan yang Anda harapkan dan menanganinya; atau - jika kesalahannya berbeda - lemparkan kembali pengecualian, untuk memungkinkan penanganan kesalahan di seluruh situs dengan cara biasa. Di bawah ini adalah contoh kode dari artikel saya tentang penanganan kesalahan dengan PDO :Dalam kode di atas kami memeriksa kesalahan tertentu untuk mengambil beberapa tindakan dan mengembalikan pengecualian untuk kesalahan lainnya (tidak ada tabel seperti itu misalnya) yang akan dilaporkan ke programmer.
Sementara lagi - hanya untuk memberi tahu pengguna sesuatu seperti "Penyisipan Anda berhasil", tidak ada ketentuan yang diperlukan.
sumber
query()
fungsinya? Dapatkah saya menggunakan coba-tangkap untukquery()
alih - alihprepared()->execute()
?Coba lihat nilai pengembalian
execute
, yaituTRUE
pada kesuksesan, danFALSE
pada kegagalan.sumber
Jika kueri pembaruan dijalankan dengan nilai yang cocok dengan catatan database saat ini, maka tidak
$stmt->rowCount()
akan0
ada baris yang terpengaruh. Jika Anda memilikiif( rowCount() == 1 )
untuk menguji keberhasilan, Anda akan mengira pembaruan gagal ketika tidak gagal tetapi nilainya sudah ada di database jadi tidak ada yang berubah.Ini tidak berhasil untuk saya ketika saya mencoba memperbarui rekaman dengan bidang kunci unik yang dilanggar. Kueri kembali berhasil tetapi kueri lain mengembalikan nilai bidang lama.
sumber
if($stmt->execute() && ($stmt->rowCount()>0))
Anda dapat menguji rowcount
sumber
SELECT
kueri (dan bahkan di sana, dokumen berbicara tentang beberapa kueri). Ia tidak mengatakan apa-apa tentangDELETE
,INSERT
atauUPDATE
, yang tampaknya baik-baik saja untuk bekerja (pertanyaannya adalah tentangINSERT
kueri). Namun, saya baru mengenal PDO dan jika saya salah dan seseorang memiliki referensi lain, silakan tulis di sini. Saya tertarik untuk melihat apakah ada kerugian nyata untuk 3 perintah di atas.Gunakan id sebagai kunci utama dengan penambahan otomatis
incremental id selalu lebih besar dari nol bahkan pada record pertama sehingga itu berarti akan selalu mengembalikan nilai sebenarnya untuk id karena lebih besar dari nol berarti benar dalam PHP
sumber
PDOStatement-> execute () dapat memunculkan pengecualian
jadi yang bisa kamu lakukan adalah
sumber