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

Cara melihat kesalahan kueri di PDO PHP

Anda perlu menyetel atribut mode kesalahan PDO::ATTR_ERRMODE ke PDO::ERRMODE_EXCEPTION.
Dan karena Anda mengharapkan pengecualian dilemparkan oleh metode prepare(), Anda harus menonaktifkan fitur PDO::ATTR_EMULATE_PREPARES* . Jika tidak, server MySQL tidak "melihat" pernyataan tersebut sampai dijalankan.

<?php
try {
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);


    $pdo->prepare('INSERT INTO DoesNotExist (x) VALUES (?)');
}
catch(Exception $e) {
    echo 'Exception -> ';
    var_dump($e->getMessage());
}

cetakan (dalam kasus saya)

Exception -> string(91) "SQLSTATE[42S02]: Base table or view not found: 
1146 Table 'test.doesnotexist' doesn't exist"

lihat http://wezfurlong.org/blog/2006/apr/using -pdo-mysql/
EMULATE_PREPARES=true tampaknya menjadi pengaturan default untuk driver pdo_mysql sekarang. Masalah cache kueri telah diperbaiki/diubah sejak saat itu dan dengan driver mysqlnd saya tidak memiliki masalah dengan EMULATE_PREPARES=false (meskipun saya hanya penghobi php, jangan ambil kata-kata saya ...)

*) dan kemudian ada PDO::MYSQL_ATTR_DIRECT_QUERY - Saya harus mengakui bahwa saya tidak mengerti interaksi dari kedua atribut tersebut (belum?), jadi saya mengatur keduanya, seperti

$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
    PDO::ATTR_EMULATE_PREPARES=>false,
    PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
    PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
));


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mendapatkan perbedaan tahun dari dua tanggal yang berbeda?

  2. Pernyataan TABEL MySQL

  3. Tips Upgrade Percona XtraDB Cluster ke 8.0

  4. Praktik Terbaik untuk Membuat Indeks di Tabel MySQL Anda – Rolling Index Builds

  5. Kapan menggunakan tanda kutip tunggal, tanda kutip ganda, dan tanda kutip di MySQL