2012-01-08 19 views
49
try { 
    $db = new PDO("mysql:host=".HOST.";dbname=".DB, USER, PW); 
    $st = $db->prepare("SELECT * FROM c6ode"); 
} 
catch (PDOException $e){ 
    echo $e->getMessage(); 
} 

Yukarıdaki örnekte bulunan sorgu için mysql hatasını nasıl kontrol edebilirim?PDO'da sorgu hatası nasıl görüntülenir

cevap

11

Şikayetinizin, istisnanın ateşleme yapmadığı yönünde olduğunu tahmin ediyorum. PDO, büyük olasılıkla istisnalar atmayacak şekilde yapılandırılmıştır. Bu onları etkinleştirme: Ben herhangi bir ek ayar yapmadan bu kullanıyorum

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
+0

Hayır hala benim sorgu yanlış olduğunu biliyorum, çalışmıyor, ama o hatayı görüntülemek istiyor. – TPSstar

+0

Sen 'yeni PDO (...' kendisine Aramayla ilgili bir hata olduğunu fark edebilirsiniz. (E_ALL) 'error_reporting' örneğin ayarlayarak error_reporting düzeyini artırmayı deneyin. –

22

:

if (!$st->execute()) { 
    print_r($st->errorInfo()); 
} 
42

hata modu PDO PDO :: ATTR_ERRMODE bağlıyor :: ERRMODE_EXCEPTION ayarlamanız gerekir.
Ve istisna hazırlamak() metodu ile atılmış olmasını bekliyoruz beri PDO :: ATTR_EMULATE_PREPARES * özelliğini devre dışı bırakmalısınız. Aksi takdirde, MySQL sunucusu çalıştırılana kadar ifadeyi "görmez". (Benim durumumda)

<?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()); 
} 

baskılar

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

http://wezfurlong.org/blog/2006/apr/using-pdo-mysql/
EMULATE_PREPARES = true şu anda pdo_mysql sürücüsü için varsayılan ayar olarak görünmektedir görüyoruz. sorgu önbellek şey o zamandan beri/değişim düzeltildi ve mysqlnd sürücüsü ile ben EMULATE_PREPARES ile değil sorunları vardı = (Ben sadece bir php hobisi değilim ama, ... üzerinde söz almak yok)

yanlış

*) ve daha sonra PDO::MYSQL_ATTR_DIRECT_QUERY var? - I) henüz bu iki özelliğin (etkileşimini anlamadığını itiraf etmeliyim, bu yüzden

$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 
)); 
6

gibi, hataları görmek için hızlı bir yol ikisini de set test ederken, bu iş benim için

+0

bu çok kolay bir şekilde – NaveenDA

-1

Bu hatayı alıyorum:

Ölümcül hata: tanımlanmamış yöntemi mysqli çağır :: hata()

if(! empty($db->error)){ 
    echo $db->error; // <- this is not a function call error() 
} 

https://stackoverflow.com/a/32045823

+0

neden olduğunu düşünüyorum downvote, benim koduyla herhangi bir sorun var mı? –

1

/* Bir hata oluşmasını - KEMİKLER tablo * mevcut değil/

$sth = $dbh->prepare('SELECT skull FROM bones'); 
$sth->execute(); 

echo "\nPDOStatement::errorInfo():\n"; 
$arr = $sth->errorInfo(); 
print_r($arr); 

çıkış

Array 
(
    [0] => 42S02 
    [1] => -204 
    [2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N "DANIELS.BONES" is an undefined name. SQLSTATE=42704 
) 
İlgili konular