2009-08-07 35 views
9

Đây là câu hỏi tương tự với số này "When not to use Prepared statements?", nhưng với "cách thực hiện" và đối với PostgreSQL.Để sử dụng các câu lệnh đã được chuẩn bị bởi PHP cho Postgres

Tôi biết rằng tôi cần các câu lệnh chuẩn bị vì tôi thực hiện nhiều cuộc gọi đến cơ sở dữ liệu của mình trong một tập lệnh.

Tôi muốn để có được ví dụ cụ thể về Look following sentence

tại typecasting, xác nhận và khử trùng các biến và sử dụng PDO với báo cáo được chuẩn bị.

Tôi biết ý ông là gì bằng cách xác thực và vệ sinh các biến. Tuy nhiên, tôi không hoàn toàn chắc chắn về các phát biểu đã được chuẩn bị. Làm thế nào để chúng tôi chuẩn bị báo cáo? Bởi bộ lọc, đó là do vệ sinh? Hoặc bởi một số lớp PDO? Định nghĩa của lớp là gì?

Báo cáo chuẩn bị có ý nghĩa gì trong tuyên bố? Vui lòng sử dụng các ví dụ cụ thể.

+0

Cảm ơn câu trả lời của bạn! –

Trả lời

5

làm chuẩn bị phát biểu có ý nghĩa gì trong báo cáo kết quả?

Từ documentation:

Tính năng này cho phép các lệnh sẽ được sử dụng nhiều lần để được phân tích và lên kế hoạch chỉ một lần, thay vì mỗi lần họ được thực thi.

Xem pg_prepare

Ví dụ từ trang liên kết ở trên:

<?php 
// Connect to a database named "mary" 
$dbconn = pg_connect("dbname=mary"); 

// Prepare a query for execution 
$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1'); 

// Execute the prepared query. Note that it is not necessary to escape 
// the string "Joe's Widgets" in any way 
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets")); 

// Execute the same prepared query, this time with a different parameter 
$result = pg_execute($dbconn, "my_query", array("Clothes Clothes Clothes")); 
?> 

Các MySQL documentation for Prepared Statements độc đáo trả lời các câu hỏi sau:

  • Tại sao sử dụng chuẩn bị phát biểu?
  • Khi nào bạn nên sử dụng câu lệnh chuẩn bị ?
+0

Các ví dụ của bạn có cùng chức năng với Robot không? Chúng rõ ràng hơn rất nhiều so với Robot. Anh ấy có vẻ sử dụng rất nhiều mảng khiến họ khó đọc cho tôi. –

+1

@Masi - các ví dụ tôi đã cung cấp đến từ trang tài liệu pg_prepare. Chúng dễ theo dõi hơn, nhưng tôi sẽ nói các ví dụ của @Glass Robot là thực tế hơn (ví dụ, các dấu hiệu được đặt tên). Tôi đề nghị bạn có được bàn tay của bạn bẩn ASAP. Không có 'một ví dụ để thống trị tất cả'. – karim79

+1

Câu trả lời của bạn không sử dụng PDO. Điều này gợi ý cho tôi rằng bạn có thể sử dụng các câu lệnh chuẩn bị mà không cần PDO. PDO dường như chỉ cung cấp độc lập cho cơ sở dữ liệu. –

0

Làm thế nào để chúng ta chuẩn bị báo cáo:

Bạn định nghĩa một truy vấn một thời gian, và có thể gọi nó là thường xuyên như bạn muốn với giá trị khác nhau.

$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1'); 
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets")); 
$result = pg_execute($dbconn, "my_query", array("row two")); 
$result = pg_execute($dbconn, "my_query", array("row three")); 

See (ví dụ như trong một vòng lặp.): http://us2.php.net/manual/en/function.pg-execute.php

6

Điều đó có nghĩa là nó sẽ giúp bạn ngăn chặn các cuộc tấn công SQL injection bằng cách loại bỏ sự cần thiết phải trích dẫn các tham số theo cách thủ công.

Thay vì đặt biến vào sql, bạn sử dụng điểm đánh dấu có tên hoặc dấu chấm hỏi cho giá trị thực sẽ được thay thế khi câu lệnh được thực hiện.

Định nghĩa của PDO từ hướng dẫn sử dụng PHP:
'Phần mở rộng đối tượng dữ liệu PHP (PDO) xác định giao diện gọn nhẹ, nhất quán để truy cập cơ sở dữ liệu trong PHP.'

Xem hướng dẫn sử dụng php trên PDOPDO::prepare.

Một ví dụ về một tuyên bố chuẩn bị với các đánh dấu tên:

<?php 
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432'); 

$sql = "SELECT username, password 
FROM users 
WHERE username = :username 
AND password = :pass"; 

$sth = $pdo->prepare($sql); 
$sth->execute(array(':username' => $_POST['username'], ':pass' => $_POST['password'])); 
$result = $sth->fetchAll(); 

Một ví dụ về một tuyên bố chuẩn bị với các dấu hiệu dấu chấm hỏi:

<?php 
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432'); 

$sql = "SELECT username, password 
FROM users 
WHERE username = ? 
AND password = ?"; 

$sth = $pdo->prepare($sql); 
$sth->execute(array($_POST['username'], $_POST['password'])); 
$result = $sth->fetchAll(); 
+0

Các lệnh của bạn dường như chọn tên người dùng và mật khẩu của cột từ người dùng bảng khi, ví dụ: username = a và password = a. Điều này cho thấy rằng mã không thực tế trong cuộc sống thực bởi vì không có ý nghĩa trong việc chọn hai tên cột khi bạn biết chúng. Tuy nhiên, nếu bạn chọn cột thứ ba theo hai, thì cách của bạn dường như hoạt động. Dường như các đầu vào của người dùng được xử lý sao cho một lỗi/tai nạn trong việc thực hiện các truy vấn với đầu vào của người dùng không thay đổi dữ liệu ban đầu, do đó không cần tiêm SQL: ví dụ, dừng nếu không chuẩn bị ... –

0

Trả lời câu trả lời Karim79 của

này

$result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users WHERE email = $1'); 

có vẻ là giống như này

$result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users WHERE email = ?'); 

Kết luận: việc sử dụng pg_preparepg_execute làm cho PHP hiệu quả hơn, vì bạn không cần phải xem xét khử trùng. Nó cũng giúp bạn trong việc sử dụng PDO.

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