2009-07-24 35 views
9

Tôi gặp một chút rắc rối khi chèn vào cơ sở dữ liệu sqlite3 với pdo. Bạn sẽ phải tha thứ cho sự thiếu hiểu biết của tôi với PDO, có vẻ như nước ngoài đến từ giao diện cơ sở dữ liệu của Python.Làm cách nào để chèn vào PDO (sqllite3)?

Vì vậy, đây là vấn đề của tôi. Tôi có một chèn đơn giản:

$dbh = new PDO('sqlite:vets.db'); 
    $count = $dbh->exec("INSERT INTO vets(name,email,clinic,streetname,citystatezip,link,phone,fax,animal,region,visible) VALUES ($name,$email,$clinic,$streetname,$citystatezip,$link,$phone,$fax,$animal,$region,$visible)"); 
    $dbh = null; 

Tôi chỉ muốn thực thi lệnh SQL đó trên cơ sở dữ liệu của mình và được thực hiện với nó. Mặc dù thực thi tập lệnh này không gây ra lỗi, nhưng nó không bao giờ cập nhật cơ sở dữ liệu. Tôi đã thử tất cả các loại quyền trên cơ sở dữ liệu chính nó, thậm chí đã làm cho nó 777 nhưng nó không tạo sự khác biệt.

Ai đó có thể giúp tôi không?

+0

giống như một sidenote (có thể không liên quan đến vấn đề của bạn), bạn có nghĩ về việc thoát khỏi dữ liệu mà bạn đang tiêm trong truy vấn không? (xem PDO :: trích dẫn); hoặc sử dụng các câu lệnh chuẩn bị (xem PDO :: chuẩn bị + PDO :: thi hành). Bạn đã thử kiểm tra không có lỗi SQL? (xem http://php.net/manual/fr/pdo.errorinfo.php) –

+0

Bạn đã có các truy vấn thành công khác với bộ điều hợp PDL sqlite chưa? – sixthgear

+0

Ngoài ra, bạn xuất hiện không có dấu ngoặc kép trong câu lệnh SQL của bạn xung quanh mỗi giá trị. (Trừ khi tất nhiên các báo giá được chứa trong mỗi biến) – sixthgear

Trả lời

21

Một trong những lợi ích to lớn của PDO là bạn có thể tạo các câu lệnh chuẩn bị sẵn sàng. Dưới đây là một số mã từ một dự án PHP của tôi:

$qry = $db->prepare(
    'INSERT INTO twocents (path, name, message) VALUES (?, ?, ?)'); 
$qry->execute(array($path, $name, $message)); 

Như bạn thấy, tôi sử dụng ? nơi tôi muốn chèn một giá trị, sau đó tôi thực hiện truy vấn với một mảng các giá trị đó phải được đặt ở vị trí của dấu hỏi. Nếu bạn làm điều này, truy vấn của bạn sẽ an toàn hơn nhiều và có nhiều khả năng hoạt động hơn (vì giá trị bị thiếu sẽ ngăn truy vấn của bạn hoạt động nếu bạn chèn các biến trực tiếp trong truy vấn như bạn.)

+0

Cảm ơn bạn rất nhiều vì đã giải phóng cho tôi. Tôi đã không thực sự hiểu những tuyên bố chuẩn bị này. Cảm ơn bạn! – kodai

+0

Tôi không bao giờ có thể nhớ tại sao nó yêu cầu các tham số được bao bọc trong một mảng() (ngay cả đối với một tham số!). Tại sao không chỉ chấp nhận một danh sách các thông số? –

+1

Câu hỏi hay ... Có nhiều khả năng hỗ trợ/cư xử giống như thư viện cơ bản cho PDO. Nó chắc chắn có thể, vì PHP hỗ trợ một số lượng các đối số. Bạn có thể tạo sub-class của riêng bạn với một 'execute' gọi' parent :: execute (func_get_args()) ' – Blixt

2

Bạn có thể gặp lỗi trong truy vấn SQL của mình. Bạn có thể in nó và sau đó thử thực hiện nó trong một số giao diện GUI của SQLite như SQLite Database Browser.

// you can skip PDO part for now, because we know it doesn't work 
// $dbh = new PDO('sqlite:vets.db'); 
$query = "INSERT INTO vets(name,email,clinic,streetname,citystatezip,link,phone,fax,animal,region,visible) VALUES ($name,$email,$clinic,$streetname,$citystatezip,$link,$phone,$fax,$animal,$region,$visible)"; 
echo $query; 
// $count = $dbh->exec($query); 
// $dbh = null; 

Tôi thấy rằng bạn không bao gồm giá trị của mình trong dấu ngoặc kép, có thể đó là nguồn gốc của sự cố. Có lẽ một số lỗi chính tả trong tên trường bảng là tốt. Tất cả sẽ xuất hiện khi bạn thực sự thấy truy vấn.

+1

Bạn đã đúng, tôi đã quên trích dẫn dữ liệu của mình. Cảm ơn bạn. – kodai

Các vấn đề liên quan