Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menangani pengecualian kunci asing di PHP

Cara saya menangani ini adalah dengan mengatur kelas pembungkus basis data saya untuk selalu memberikan pengecualian ketika Anda menemukan kesalahan basis data. Jadi, misalnya, saya mungkin memiliki kelas bernama MySQL dengan fungsi sebagai berikut:

public function query($query_string)
{
    $this->queryId = mysql_query($query_string,$this->connectionId);
    if (! $this->queryId) {
        $this->_throwException($query_string);
    }
    return $this->queryId;
}

private function _throwException($query = null)
{
    $msg = mysql_error().".  Query was:\n\n".$query.
                "\n\nError number: ".mysql_errno();
    throw new Exception($msg,mysql_errno());
}

Setiap kali kueri gagal, pengecualian PHP biasa dilemparkan. Perhatikan bahwa saya akan membuang ini dari dalam tempat lain juga, seperti connect() fungsi atau selectDb() fungsi, tergantung pada apakah operasi berhasil atau tidak.

Dengan pengaturan itu, Anda siap melakukannya. Di tempat mana pun yang Anda harapkan mungkin perlu menangani kesalahan basis data, lakukan sesuatu seperti berikut:

//assume $db has been set up to be an instance of the MySQL class

try {
    $db->query("DELETE FROM parent WHERE id=123");
} catch (Exception $e) {
    //uh-oh, maybe a foreign key restraint failed?
    if ($e->getCode() == 'mysql foreign key error code') {
        //yep, it failed.  Do some stuff.
    }
}

Sunting

Menanggapi komentar poster di bawah, Anda memiliki beberapa informasi terbatas yang tersedia bagi Anda untuk membantu mendiagnosis masalah kunci asing. Teks kesalahan yang dibuat oleh pembatasan kunci asing yang gagal dan dikembalikan oleh mysql_error() terlihat seperti ini:

Cannot delete or update a parent row:
a foreign key constraint fails
(`dbname`.`childtable`, CONSTRAINT `FK_name_1` FOREIGN KEY
(`fieldName`) REFERENCES `parenttable` (`fieldName`));

Jika kunci asing Anda cukup kompleks sehingga Anda tidak yakin apa yang mungkin menyebabkan kesalahan kunci asing untuk kueri tertentu, Anda mungkin dapat menguraikan teks kesalahan ini untuk membantu mengetahuinya. Perintah SHOW ENGINE INNODB STATUS mengembalikan hasil yang lebih detail untuk kesalahan kunci asing terbaru juga.

Jika tidak, Anda mungkin harus menggali sendiri. Kueri berikut akan memberi Anda daftar kunci asing pada tabel tertentu, yang dapat Anda periksa untuk mendapatkan informasi:

select * from information_schema.table_constraints
WHERE table_schema=schema() AND table_name='table_name';

Sayangnya, menurut saya tidak ada solusi ajaib untuk solusi Anda selain memeriksa kesalahan dan kendala dengan sangat hati-hati.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. gagal membuka streaming:Tidak ada file atau direktori seperti itu di

  2. JSON menyandikan hasil MySQL

  3. Tampilkan semua kunci saat ini dari get_lock

  4. Bagaimana cara menginstal paket MySQLdb? (ImportError:Tidak ada modul bernama setuptools)

  5. Bagaimana cara menjalankan beberapa kueri SQL di MySQL Workbench?