2012-01-08 30 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(); 
} 

Làm cách nào để kiểm tra lỗi mysql cho truy vấn trong trường hợp trên?Cách xem lỗi truy vấn trong PDO PHP

Trả lời

11

Tôi đoán rằng khiếu nại của bạn là ngoại lệ không kích hoạt. PDO rất có thể được cấu hình để không ném ngoại lệ. Giúp họ với điều này:

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

Nope vẫn không hoạt động, tôi biết truy vấn của mình sai, nhưng tôi muốn hiển thị lỗi đó. – TPSstar

+0

Bạn có thể thấy rằng có lỗi với lệnh gọi 'new PDO (... '. Hãy thử tăng mức độ error_reporting bằng cách đặt ví dụ' error_reporting (E_ALL) '. –

22

Tôi đang sử dụng này mà không cần bất kỳ cài đặt thêm:

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

Bạn cần phải thiết lập thuộc tính chế độ lỗi PDO :: ATTR_ERRMODE để PDO :: ERRMODE_EXCEPTION.
Và vì bạn mong đợi ngoại lệ được ném bởi phương thức chuẩn bị(), bạn nên tắt tính năng PDO :: ATTR_EMULATE_PREPARES * . Nếu không, máy chủ MySQL không "nhìn thấy" câu lệnh cho đến khi nó được thực thi.

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

in (trong trường hợp của tôi)

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

thấy http://wezfurlong.org/blog/2006/apr/using-pdo-mysql/
EMULATE_PREPARES = true có vẻ là thiết lập mặc định cho người lái xe pdo_mysql ngay bây giờ. Điều bộ nhớ cache truy vấn đã được sửa/thay đổi kể từ đó và với trình điều khiển mysqlnd tôi đã không gặp sự cố với EMULATE_PREPARES = false (mặc dù tôi chỉ là một người thích chơi php, đừng dùng từ ngữ của tôi ...)

*) và sau đó có PDO::MYSQL_ATTR_DIRECT_QUERY - tôi phải thừa nhận rằng tôi không hiểu sự tương tác của hai thuộc tính (chưa), vì vậy tôi đặt cả hai, như

$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

một cách nhanh chóng để xem lỗi của bạn? trong khi thử nghiệm:

+0

Tôi nghĩ đây là cách rất dễ dàng – NaveenDA

-1

công việc này cho tôi nếu bạn nhận được lỗi này:

Fatal error: Call to undefined phương pháp mysqli :: lỗi()

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

https://stackoverflow.com/a/32045823

+0

Tại sao downvote, có bất kỳ vấn đề với mã của tôi? –

1

/* gây lỗi - bảng BONES không tồn tại */

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

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

đầu ra

Array 
(
    [0] => 42S02 
    [1] => -204 
    [2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N "DANIELS.BONES" is an undefined name. SQLSTATE=42704 
) 
Các vấn đề liên quan