2010-07-08 12 views
5

Tôi đang cố gắng sử dụng fetchAll trên truy vấn có 2 biến. Tôi không thể tìm ra cú pháp. tôi có thể quản lý với chỉ 1 biến:[zend] [db] fetchAll với nhiều biến

$sql = "SELECT * FROM mytable WHERE field1 = ?"; 
$this->_db->fetchAll($sql,$value1); # that works 

Tuy nhiên tôi đang gặp một số vấn đề khi truy vấn có nhiều biến

$sql = "SELECT * FROM mytable WHERE field1 = ? AND field2 = ?"; 
$this->_db->fetchAll($sql,$value1,$value2); # doesn't work 
$this->_db->fetchAll($sql,array("field1"=>$value1,"field2"=>$value2)); # doesn't work either 

Lý do tại sao tôi muốn sử dụng không? thay vì đặt các biến trực tiếp vào truy vấn là tôi đã học được rằng sử dụng? cho phép truy vấn được biên dịch tổng thể bằng công cụ db và cải thiện hiệu suất.

Trả lời

11

Có hai loại tham số, được đặt tên theo thông số và thông số vị trí. Bạn đang trộn hai loại và điều đó sẽ không hoạt động.

Thông số được đặt tên khớp với trình giữ chỗ theo tên. Tên được bắt đầu bằng biểu tượng :. Tên tham số không giống như tên của các cột bạn tình cờ sử dụng chúng. Bạn cung cấp các giá trị tham số trong một mảng kết hợp, sử dụng tên tham số (không phải tên cột) làm các khóa mảng. Ví dụ:

$sql = "SELECT * FROM mytable WHERE field1 = :param1 AND field2 = :param2"; 
$this->_db->fetchAll($sql,array("param1"=>$value1,"param2"=>$value2)); 

Thông số vị trí sử dụng biểu tượng ? cho trình giữ chỗ. Bạn cung cấp các giá trị tham số bằng cách sử dụng mảng đơn giản (không liên kết) và thứ tự của các giá trị trong mảng phải khớp với thứ tự của trình giữ chỗ thông số trong truy vấn của bạn. Ví dụ:

$sql = "SELECT * FROM mytable WHERE field1 = ? AND field2 = ?"; 
$this->_db->fetchAll($sql,array($value1,$value2)); 

Hầu hết các thương hiệu của cơ sở dữ liệu SQL natively chỉ hỗ trợ một phong cách này hay cách khác, nhưng PDO nỗ lực để hỗ trợ cả hai, bằng cách viết lại các SQL nếu cần thiết trước khi chuẩn bị các truy vấn. Vì Zend_Db được mô hình hóa sau PDO, Zend_Db cũng hỗ trợ cả hai kiểu tham số.

+0

tuyệt vời hoạt động. thankx – Max

2

Hãy thử điều này:

$sql = "SELECT * FROM mytable WHERE field1 = ? AND field2 = ?"; 
$statement = $this->_db->query($sql,array("field1"=>$value1,"field2"=>$value2)); 
$data = $statement->fetchAll(); 

$ this -> _ db phải là một thể hiện của Db adapter.

+0

mà không hoạt động. – Max

5

Câu hỏi này hơi cũ, nhưng tôi nghĩ tôi chỉ thêm vào nó để tham khảo.

Tôi khuyên bạn nên bắt đầu sử dụng Zend_Db_Select với Zend_Db. Tôi đã làm rất nhiều với Zend_Db gần đây. Thêm từ Zend_Db_Select reference guide.

Hãy giả sử bạn có một bộ chuyển đổi Zend_Db: $ this -> _ db

# this will get the Zend_Db_Select object 
$select = $this->_db->select(); 

# now you build up your query with Zend_Db_Select functions 
$select->from('mytable'); 
$select->where('field1 = ?', $field1); 
$select->where('field2 = ?', $field2); 
[...] 

# echo to see the SQL (helps in debugging) 
# SELECT * FROM mytable WHERE field1 = ? AND field2 = ? [...] 
echo '<p>My SQL: ' . $select . '</p>'; 

# Execute the SQL/Fetch results 
$results = $select->query()->fetchAll(); 

Đó là những điều cơ bản từ ví dụ cho bạn, nhưng hướng dẫn tham khảo Zend Framework trên đối tượng lựa chọn có rất nhiều thông tin hữu ích về cách để xây dựng các truy vấn phức tạp hơn với JOINS, UNIONS, GROUP BY, LIMIT, HAVING, v.v.

Nếu bạn muốn sử dụng một cái tên bí danh cho một bảng hoặc các thông số, bạn sử dụng một mảng kết hợp với tên bí danh là giá trị chỉ số:

# SELECT p.* FROM products AS p 
$select->from('p' => 'products'); 

Nếu bạn muốn quay trở lại lĩnh vực duy nhất được lựa chọn, bạn thêm một loạt các tên trường như một tham số thứ hai:

# SELECT model FROM products 
$select->from(products, array(model)); 

trên thực tế, ở trên có thể sẽ sản xuất SQL đầy đủ như:

SELECT 'products'.model FROM 'products' 

nhưng tôi đã viết ở trên cho ngắn gọn và rõ ràng trong ví dụ.

Một điều tôi vừa xem là sử dụng AND và OR trong điều kiện WHERE.

# WHERE a = $a 
$select->where('a = ?', $a); 

# WHERE a = $a AND b = $b 
$select->where('a = ?', $a); 
$select->where('b = ?', $b); 

# WHERE a = $a OR b = $b 
$select->where('a = ?', $a); 
$select->orWhere('b = ?', $b); 

# WHERE a = $a AND b = $b 
$select->orWhere('a = ?', $a); 
$select->where('b = ?', $b); 

Lưu ý rằng mọi chức năng "nơi" bạn sử dụng sẽ kết hợp với câu lệnh trước đó làm toán hạng đó. Ok, điều đó nghe có vẻ khó hiểu.

Nếu "vị trí" thứ hai là "OR" thì đó là điều kiện "OR". Nếu "vị trí" thứ hai là "AND", câu lệnh sẽ là "VÀ".

Nói cách khác, hàm WHERE đầu tiên bị bỏ qua về điều kiện sử dụng.

Trong thực tế, tôi vừa hỏi một câu hỏi về Stack Overflow ngày hôm qua liên quan đến việc thực hiện một complex WHERE using select.

Hy vọng điều đó sẽ hữu ích! Chúc mừng!

0

Heres cách Zend thực tế để mã hóa cho điều này.

$ sql = "SELECT * FROM mytable WHERE field1 =: param1 AND field2 =: param2"; $ this -> _ db-> fetchAll ($ sql, mảng ("param1" => $ value1, "param2" => $ value2));

$where = $this->_db->select() 
->from('mytable') 
->where('field1 = ?',$value1) 
->where('field2 = ?',$value2); 

$rowSet = $this->_db->fetchAll($where); 

này hoạt động tuyệt vời đối với tôi