2013-09-06 91 views
32

Mở cuộc phiêu lưu của mình thông qua những khu rừng của PHP: Data Objects tôi đã gặp phải một vấn đề với thực hiện các truy vấn MySQL thông qua báo cáo được chuẩn bị.PDO với INSERT INTO thông qua báo cáo chuẩn bị

Quan sát đoạn mã sau:

$dbhost = "localhost"; 
$dbname = "pdo"; 
$dbusername = "root"; 
$dbpassword = "845625"; 

$link = new PDO("mysql:host=$dbhost;dbname=$dbname","$dbusername","$dbpassword"); 

$statement = $link->prepare("INSERT INTO testtable(name, lastname, age) 
     VALUES('Bob','Desaunois','18')"); 

    $statement->execute(); 

Đây là tôi, và tôi muốn có trong cơ sở dữ liệu của tôi. Tuy nhiên tôi tiếp tục bị lạc trong .. well .. Tôi không biết! Theo google đây là cách để làm điều đó, mặc dù cơ sở dữ liệu của tôi vẫn trống.

Tôi có thiếu gì đó ở đây không? Bởi vì tôi đã bị mắc kẹt trong một giờ tốt và muốn tiếp tục học PDO!

+1

Tôi không hiểu tại sao mọi người lại miễn cưỡng sử dụng sách hướng dẫn này. Nếu bạn tra cứu [Prepare()] (http://php.net/manual/en/pdo.prepare.php), bạn có hai ví dụ gần như đã sẵn sàng để sao chép và dán. –

+0

@ ÁlvaroG.Vicario đây có thể là lỗi báo cáo vấn đề. Bob, bạn có quen thuộc với báo cáo lỗi trong PHP không? Bạn có thể thấy lỗi nếu xảy ra không? –

Trả lời

71

Bạn nên sử dụng nó như vậy

<?php 
$dbhost = "localhost"; 
$dbname = "pdo"; 
$dbusername = "root"; 
$dbpassword = "845625"; 

$link = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbusername, $dbpassword); 

$statement = $link->prepare("INSERT INTO testtable(name, lastname, age) 
    VALUES(:fname, :sname, :age)"); 
$statement->execute(array(
    "fname" => "Bob", 
    "sname" => "Desaunois", 
    "age" => "18" 
)); 

tuyên bố đã chuẩn bị được sử dụng để khử trùng đầu vào của bạn, và để làm điều đó bạn có thể sử dụng :foomà không bất kỳ dấu nháy đơn trong SQL để bind biến, và sau đó trong hàm execute() bạn chuyển vào một mảng kết hợp của các biến mà bạn đã xác định trong câu lệnh SQL.

Bạn cũng có thể sử dụng ? thay vì :foo và sau đó chuyển vào một mảng chỉ các giá trị để nhập như vậy;

$statement = $link->prepare("INSERT INTO testtable(name, lastname, age) 
    VALUES(?, ?, ?)"); 

$statement->execute(array("Bob", "Desaunois", "18")); 

Cả hai cách đều có ưu điểm và nhược điểm của chúng. Cá nhân tôi thích ràng buộc các tên tham số vì nó dễ đọc hơn.

+0

Đây có phải là cách "tốt" để làm điều này không? $ statement = $ link-> preparation ("INSERT INTO testtable (tên, họ, tuổi) VALUES (?,?,?)"); $ statement-> execute (mảng ($ this-> name, $ this-> lastname, $ this-> age)); –

+0

Đúng, đó là một cách hay để làm điều đó. – Novocaine

+0

Tôi chỉ thử BOTH phương pháp, một với câu hỏi đánh dấu trước đó bởi vì tôi stumbled khi nó, cả hai đều không có avail. Tôi bắt đầu lo lắng lỗi ở một nơi khác, tôi sẽ cố gắng viết lại những gì tôi có bây giờ. –

-2

Vui lòng thêm cố gắng nắm bắt cũng trong mã của bạn để bạn có thể chắc chắn rằng có không có ngoại lệ.

try { 
    $hostname = "servername"; 
    $dbname = "dbname"; 
    $username = "username"; 
    $pw = "password"; 
    $pdo = new PDO ("mssql:host=$hostname;dbname=$dbname","$username","$pw"); 
    } catch (PDOException $e) { 
    echo "Failed to get DB handle: " . $e->getMessage() . "\n"; 
    exit; 
    } 
+1

Người ta có thể chắc chắn ngay cả khi không bị bắt. Ngoại lệ không bắt buộc gây ra lỗi nghiêm trọng, bạn biết đấy. –

+0

Tôi không biết về ngoại lệ không bị bắt buộc gây ra lỗi nghiêm trọng .... nếu bạn có bất kỳ liên kết nào vui lòng chia sẻ với tôi ... cho pdo tôi đã đọc nó từ đây http://php.net/manual/en/ pdo.connections.php – rohitcopyright

+0

chỉ cần chạy nó và xem. –

3

Tôi vừa viết lại đoạn code như sau:

$dbhost = "localhost"; 
    $dbname = "pdo"; 
    $dbusername = "root"; 
    $dbpassword = "845625"; 

    $link = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbusername, $dbpassword); 
    $link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $statement = $link->prepare("INSERT INTO testtable(name, lastname, age) 
     VALUES(?,?,?)"); 

    $statement->execute(array("Bob","Desaunois",18)); 

Và có vẻ như để làm việc bây giờ. NHƯNG. nếu tôi có mục đích gây ra một lỗi xảy ra, nó không nói có bất kỳ lỗi nào. Mã hoạt động, nhưng vẫn còn; nên tôi gặp phải nhiều lỗi hơn, tôi sẽ không biết tại sao.

+0

'error_reporting (E_ALL); ini_set ('display_errors', 1); ' –

+0

Hm. Có vẻ như [bạn đã biết nó] (http://stackoverflow.com/questions/17560144/mysqli-error-does-not-work#comment25546310_17560277) nhưng vì một lý do nào đó vẫn không sử dụng. –

+0

Tôi thành thật hoàn toàn quên về init_set(); Xin lỗi chân thành của tôi. –

-5

Nhờ câu trả lời Novocaine88 để sử dụng một vòng lặp cố gắng nắm bắt Tôi đã thành công nhận được một thông báo lỗi khi tôi gây ra một.

<?php 
    $dbhost = "localhost"; 
    $dbname = "pdo"; 
    $dbusername = "root"; 
    $dbpassword = "845625"; 

    $link = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbusername, $dbpassword); 
    $link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    try { 
     $statement = $link->prepare("INERT INTO testtable(name, lastname, age) 
      VALUES(?,?,?)"); 

     $statement->execute(array("Bob","Desaunois",18)); 
    } catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 
    ?> 

Trong mã sau thay vì INSERT INTO nó nói INERT.

đây là lỗi tôi nhận.

SQLSTATE [42000]: Lỗi cú pháp hoặc vi phạm truy cập: 1064 Bạn có lỗi trong cú pháp SQL; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MariaDB của bạn để có cú pháp đúng để sử dụng gần giá trị 'INERT INTO testtable (tên, họ, tuổi)' ('Bob', 'Desaunoi' tại dòng 1

Khi tôi "sửa chữa "vấn đề, nó hoạt động như nó phải. Cảm ơn rất nhiều tất cả mọi người!

+1

Bạn có nghĩ rằng có quá nhiều câu trả lời cho câu hỏi này không? –

+1

Chưa kể điều này là sai –

+0

Tôi rất tiếc khi thấy rằng số lượng câu trả lời đã gây ra sự cố này, tuy nhiên thay vì thừa nhận rằng câu trả lời là không hợp lệ, tôi rất muốn bạn giải thích tại sao đây là câu trả lời sai. –