Làm cách nào để tôi chỉ nhận được một kết quả bằng db_query ()


28

Tôi đang chuyển đổi từ các phương pháp sử dụng PHP của 'trường học cũ' mysql_fetch_array(), v.v. và tôi đang cố gắng trở nên Drupally hơn bằng cách sử dụng API cơ sở dữ liệu trong các mô-đun của mình.

Tôi chỉ đơn giản muốn trả lại và in ra một giá trị. Ví dụ:

$query = db_query("SELECT zip FROM {zipcodes} WHERE city = :city LIMIT 1", array(":city" => $city));

Tôi biết giá trị là ở đó, tôi có thể truy cập và in nó bằng cách sử dụng các phương thức truyền thống bên ngoài API cơ sở dữ liệu.

print $query->zip không hoạt động.

Tài liệu API rõ ràng như bùn.

Ai đó có thể cho tôi biết cách chính xác để truy cập các giá trị này?

Có một hướng dẫn tốt mà bất cứ ai cũng có thể giới thiệu là tốt?

Câu trả lời:


38

Nếu bạn chỉ muốn tìm nạp một kết quả, bạn có thể sử dụng fetchField với db_queryđể tìm nạp kết quả, ví dụ:

$zip_code = db_query("SELECT zip from {zipcodes} WHERE city = :city LIMIT 1", array(":city" => $city))->fetchField();

Bạn cũng có thể tìm nạp các giá trị được lấy từ nguồn kết quả được trả về của truy vấn bằng các tùy chọn như fetchObject () tương tự như các phương pháp mysql_fetch_objectmã hóa PHP ( ) thông thường như sử dụng và nhận kết quả.


1
một số lời chỉ trích mang tính xây dựng trên downvote sẽ khá hữu ích
Optimusprime619

Không có chức năng hoặc phương pháp nào bạn mô tả có sẵn trong Drupal 7. Ví dụ của bạn sẽ tạo ra lỗi nghiêm trọng. Ngoài ra, bạn dường như đang trộn lẫn mã Drupal 6 và Drupal 7, do đó bỏ phiếu giảm giá
Clive

2
@Clive oops .... máu vội vàng ... thật tốt khi biết lý do mặc dù..cảm ơn!
Optimusprime619

1
Đừng lo lắng, nếu bạn sửa chữa câu trả lời, tôi sẽ vui lòng xóa downvote
Clive

1
@Clive đã hoàn thành ngay bây giờ ... :)
Optimusprime619

15

Dưới đây là cách sử dụng API cơ sở dữ liệu trong Drupal 7 mà không cần viết truy vấn MySQL:

$query = db_select('zipcodes', 'z')
  ->fields('z', array('zip'))
  ->condition('z.city', $city)
  ->range(0, 1)
  ->execute();
$result = $query->fetchObject();
print $result->zip;

9

Bạn phải lặp lại truy vấn $ của mình, bạn không thể cho rằng bạn chỉ có một kết quả với truy vấn đã cho ở trên.

foreach ($query as $row) {
  print $row->zip;
}

Nếu bạn biết bạn chỉ có một kết quả, bạn có thể gọi fetchObject trên truy vấn của mình ->

$query = db_query("select zip from {zipcodes} where city = :city limit 1", array(":city" => $city))->fetchObject();

in $ query-> zip sau đó sẽ cung cấp cho bạn những gì bạn muốn.


4
Lưu ý: Thay vì mã hóa giới hạn, bạn nên sử dụng db_query_range ().
Berdir

3

tôi sẽ làm

$row = (object)db_query('Your SQL here')->fetchAssoc();

nếu bạn muốn chính xác một hàng từ tập kết quả. Mặt khác, lặp với foreach là lựa chọn tốt nhất, như được đề xuất trước đây.


2

Tôi biết điều này đã cũ, nhưng bạn có thể và nên làm:

$zip_code = db_select('zipcodes', 'z')
    ->fields('z', array(
        'zip'
    ))
    ->condition('city', $city)
    ->range(0, 1)
    ->execute()
    ->fetchField();

0

Vâng, bạn phải có cách để làm điều này đúng trong Drupa 7:

  1. db_select - trong Drupal có một hàm trả về một đối tượng mà bạn xây dựng với anh ta truy vấn SQL - https://api.drupal.org/api/drupal/includes%21database%21database.inc/feft/db_select/7 . Bạn có một phương thức trên đối tượng được gọi là phạm vi. bạn co thể sử dụng no.

  2. Truy vấn trường thực thể là một lớp xây dựng truy vấn SQL khi được mời: https://www.drupal.org/node/1343708 . Điều này cũng có phương pháp phạm vi.


0

Drupal 7

Sử dụng truy vấn này cho kết quả duy nhất:

$zip_code = db_query("SELECT zip from {zipcodes} WHERE city = :city", array(":city" => $city))->fetchField();

Thay vì sử dụng cái này

$zip_code = db_query("SELECT zip from {zipcodes} WHERE city = :city LIMIT 1", array(":city" => $city))->fetchField();

bởi vì nó tạo ra cảnh báo.


-2

Drupal 6

$query sẽ là kết quả của bạn Bạn cần tìm nạp các giá trị từ nó, Trong trường hợp của bạn Nếu nó chỉ tìm nạp 1 hàng và 1 cột tức là zip thì để lấy trực tiếp

$zip = db_result(db_query("YOUR SQL QUERY"));

$query->zipsẽ không hoạt động vì $ query là tập kết quả không phải là một đối tượng được tải hoặc một mảng. Vì vậy, điều này nên làm

while($row = db_fetch_object($res)){
  $row->zip ; // etc
}

Lưu ý: db_fetch_arraylà một API khác để tìm nạp các giá trị ở định dạng mảng


1
db_result db_fetch_array và db_fetch_object dành cho Drupal 6 trở về trước.
jenlampton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.