ฉันจะได้รับเพียงผลเดียวโดยใช้ db_query () ได้อย่างไร


28

ฉันกำลังเปลี่ยนจากวิธีการใช้ MySQL ของโรงเรียนเก่าmysql_fetch_array()และฉันพยายามที่จะใช้ Drupally มากขึ้นโดยใช้ Database API ในโมดูลของฉัน

ฉันแค่ต้องการคืนและพิมพ์ค่า ตัวอย่างเช่น:

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

ฉันรู้ว่ามีค่าฉันสามารถเข้าถึงและพิมพ์โดยใช้วิธีการดั้งเดิมนอกฐานข้อมูล API

print $query->zip ไม่ทำงาน.

เอกสาร API นั้นชัดเจนเหมือนโคลน

ใครสามารถบอกวิธีที่ถูกต้องในการเข้าถึงค่าเหล่านี้ได้ไหม

มีการสอนที่ดีที่ใคร ๆ ก็สามารถแนะนำเช่นกัน?

คำตอบ:


38

หากคุณต้องการดึงผลลัพธ์เดียวคุณสามารถใช้fetchFieldด้วยdb_queryเพื่อดึงผลลัพธ์เช่น:

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

นอกจากนี้คุณยังสามารถดึงค่าที่ดึงมาจากแหล่งผลลัพธ์ที่ส่งคืนของแบบสอบถามโดยใช้ตัวเลือกเช่นfetchObject ()คล้ายกับวิธีการmysql_fetch_objectเข้ารหัสแบบเดิมของ PHP ( ) เช่นการใช้และรับผลลัพธ์


1
การวิจารณ์เชิงสร้างสรรค์เกี่ยวกับ downvote จะค่อนข้างมีประโยชน์
optimusprime619

ไม่มีฟังก์ชั่นหรือวิธีการที่คุณอธิบายใน Drupal 7 ตัวอย่างของคุณจะทำให้เกิดข้อผิดพลาดร้ายแรง ดูเหมือนว่าคุณกำลังผสม Drupal 6 และ Drupal 7 code ดังนั้นการโหวต
Clive

2
@ ไคลเอนต์โอ๊ะ .... เลือดไหล ... ดีที่รู้เหตุผลแม้ว่า .. ขอบคุณ!
optimusprime619

1
ไม่ต้องกังวลถ้าคุณแก้ไขคำตอบฉันยินดีลบ downvote
Clive

1
@Clive ทำตอนนี้ ... :)
optimusprime619

15

นี่คือวิธีการใช้ Database API ใน Drupal 7 โดยไม่ต้องเขียนคำสั่ง 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

คุณต้องวนลูปคิวรีของคุณคุณไม่สามารถสมมติว่าคุณมีผลลัพธ์เดียวกับคิวรีที่ระบุด้านบน

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

หากคุณรู้ว่าคุณมีผลลัพธ์เดียวคุณสามารถโทร fetchObject จากคิวรีของคุณ ->

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

พิมพ์ $ query-> zip จากนั้นให้สิ่งที่คุณต้องการ


4
หมายเหตุ: แทนที่จะ จำกัด การเข้ารหัสฮาร์ดโค้ดคุณควรใช้ db_query_range ()
Berdir

3

ฉันจะทำ

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

หากคุณต้องการหนึ่งแถวจากชุดผลลัพธ์ มิฉะนั้นการวนซ้ำด้วย foreach เป็นตัวเลือกที่ดีที่สุดตามที่แนะนำไว้ก่อนหน้านี้


2

ฉันรู้ว่านี่เก่า แต่คุณสามารถและควรทำ:

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

0

คุณต้องหาวิธีที่จะทำสิ่งนี้ให้ถูกต้องใน Drupa 7:

  1. db_select - ใน Drupal มีฟังก์ชั่นที่ส่งกลับวัตถุที่คุณสร้างกับเขาแบบสอบถาม SQL ต์ - https://api.drupal.org/api/drupal/includes%21database%21database.inc/function/db_select/7 คุณมีวิธีการในวัตถุที่เรียกว่าช่วง คุณสามารถใช้มัน

  2. Entity แบบสอบถามข้อมูลซึ่งเป็นชั้นเรียนที่สร้างแบบสอบถาม SQL เมื่อ entites: https://www.drupal.org/node/1343708 นี่คือยังมีวิธีการช่วง


0

Drupal 7

ใช้การค้นหานี้สำหรับผลลัพธ์เดียว:

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

แทนที่จะใช้สิ่งนี้

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

เพราะมันสร้างคำเตือน


-2

Drupal 6

$query จะเป็นผลลัพธ์ของคุณคุณต้องดึงค่าจากมันในกรณีของคุณหากดึงข้อมูลเพียง 1 แถวและ 1 คอลัมน์เช่น zip แล้วจะได้รับโดยตรง

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

$query->zipจะไม่ทำงานเนื่องจากมีการตั้งค่า $ query ไม่ใช่วัตถุที่โหลดหรืออาร์เรย์ ดังนั้นสิ่งนี้ควรทำ

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

หมายเหตุ: db_fetch_arrayเป็นอีกAPIหนึ่งในการดึงค่าในรูปแบบอาร์เรย์


1
db_result db_fetch_array และ db_fetch_object ใช้สำหรับ Drupal 6 และรุ่นก่อนหน้า
jenlampton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.