Ví dụ về cách sử dụng bind_result và get_result


83

Tôi muốn xem một ví dụ về cách gọi bằng cách sử dụng bind_resultso với get_resultvà mục đích của việc sử dụng cái này hơn cái kia.

Cũng là ưu và nhược điểm của việc sử dụng từng cái.

Hạn chế của việc sử dụng một trong hai là gì và có sự khác biệt không.

Câu trả lời:


198

Yếu tố quyết định đối với tôi là liệu tôi có gọi các cột truy vấn của mình bằng cách sử dụng hay không *.

Sử dụng bind_result()sẽ tốt hơn cho điều này:

// Use bind_result() with fetch()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';

Sử dụng get_result()sẽ tốt hơn cho điều này:

// Use get_result() with fetch_assoc() 
$query2 = 'SELECT * FROM table WHERE id = ?';

Ví dụ 1 để $query1sử dụngbind_result()

$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
$id = 5;

if($stmt = $mysqli->prepare($query)){
   /*
        Binds variables to prepared statement

        i    corresponding variable has type integer
        d    corresponding variable has type double
        s    corresponding variable has type string
        b    corresponding variable is a blob and will be sent in packets
   */
   $stmt->bind_param('i',$id);

   /* execute query */
   $stmt->execute();

   /* Store the result (to get properties) */
   $stmt->store_result();

   /* Get the number of rows */
   $num_of_rows = $stmt->num_rows;

   /* Bind the result to variables */
   $stmt->bind_result($id, $first_name, $last_name, $username);

   while ($stmt->fetch()) {
        echo 'ID: '.$id.'<br>';
        echo 'First Name: '.$first_name.'<br>';
        echo 'Last Name: '.$last_name.'<br>';
        echo 'Username: '.$username.'<br><br>';
   }

   /* free results */
   $stmt->free_result();

   /* close statement */
   $stmt->close();
}

/* close connection */
$mysqli->close();

Ví dụ 2 để $query2sử dụngget_result()

$query2 = 'SELECT * FROM table WHERE id = ?'; 
$id = 5;

if($stmt = $mysqli->prepare($query)){
   /*
        Binds variables to prepared statement

        i    corresponding variable has type integer
        d    corresponding variable has type double
        s    corresponding variable has type string
        b    corresponding variable is a blob and will be sent in packets
   */
   $stmt->bind_param('i',$id);

   /* execute query */
   $stmt->execute();

   /* Get the result */
   $result = $stmt->get_result();

   /* Get the number of rows */
   $num_of_rows = $result->num_rows;



   while ($row = $result->fetch_assoc()) {
        echo 'ID: '.$row['id'].'<br>';
        echo 'First Name: '.$row['first_name'].'<br>';
        echo 'Last Name: '.$row['last_name'].'<br>';
        echo 'Username: '.$row['username'].'<br><br>';
   }

   /* free results */
   $stmt->free_result();

   /* close statement */
   $stmt->close();
}

/* close connection */
$mysqli->close();

Như bạn có thể thấy, bạn không thể sử dụng bind_resultvới *. Tuy nhiên, get_resulthoạt động cho cả hai, nhưng bind_resultđơn giản hơn và loại bỏ một số lộn xộn $row['name'].


bind_result ()

Ưu điểm:

  • Đơn giản hơn
  • Không cần phải gây rối với $row['name']
  • Sử dụng fetch()

Nhược điểm:

  • Không hoạt động với truy vấn SQL sử dụng *

get_result ()

Ưu điểm:

  • Hoạt động với tất cả các câu lệnh SQL
  • Sử dụng fetch_assoc()

Nhược điểm:

  • Phải lộn xộn với các biến mảng $row[]
  • Không gọn gàng
  • yêu cầu trình điều khiển gốc MySQL ( mysqlnd )

8
OMG, tôi ước gì tôi tìm thấy Câu hỏi & Đáp này TRƯỚC KHI tôi ràng buộc mọi thứ với a $row[]. Cảm ơn bạn đã giải thích chi tiết! Một thận trọng; theo hướng dẫn get_result () chỉ có sẵn với mysqlnd.
Sablefoste

2
@SableFoste Đúng! Và điều đó có nghĩa là ... bạn phải lộn xộn với các cấu hình ... vì vậy ... hãy sử dụng bind_result.
kiểm tra

1
cho tất cả những nơi mà phương thức get_result () không hoạt động: stackoverflow.com/questions/8321096/…
Karl Adler

3
get_result () cũng không hoạt động đối với tôi trong ví dụ thứ hai - tiếp tục trả về False và errno = 0 (không có lỗi). Xóa lệnh gọi store_result () đã khắc phục được sự cố.
winwaed

1
@Black nó sẽ lưu các thuộc tính của truy vấn ... như số hàng trả lại, vv
Arian Faurtosh

2

Các ví dụ bạn có thể tìm thấy trên các trang hướng dẫn tương ứng.

Mặc dù ưu và nhược điểm khá đơn giản:

  • get_result là cách lành mạnh duy nhất để xử lý kết quả
  • tuy nhiên, nó không phải lúc nào cũng có sẵn và mã của bạn phải có một dự phòng bằng cách sử dụng bind_result xấu xí.

Dù sao, nếu ý tưởng của bạn là sử dụng một trong hai chức năng ngay trong mã ứng dụng - thì ý tưởng này là sai. Tuy nhiên, miễn là bạn có chúng được đóng gói trong một số phương thức để trả về dữ liệu của bạn từ truy vấn, điều đó không thực sự quan trọng, bạn nên sử dụng phương thức nào, tiết kiệm cho thực tế là bạn sẽ cần gấp mười lần mã để triển khai bind_result.


1
<b> Fatal error </ b>: Gọi phương pháp mysqli_stmt không xác định :: get_result () các mã trên cho lỗi như vậy
Kissa Mia

1
Xin lỗi nhưng tôi không thấy bind_result () là xấu ... Bạn có thể vui lòng giải thích vị trí xấu là do đâu?
Samuel Ramzan

1

Sự khác biệt chính mà tôi nhận thấy là nó gây bind_result()ra lỗi cho bạn 2014, khi bạn cố gắng viết mã $ stmt lồng nhau bên trong $ stmt khác , nó đang được tìm nạp (không có mysqli::store_result()):

Chuẩn bị không thành công: (2014) Các lệnh không đồng bộ; bạn không thể chạy lệnh này bây giờ

Thí dụ:

  • Hàm được sử dụng trong mã chính.

    function GetUserName($id)
    {
        global $conn;
    
        $sql = "SELECT name FROM users WHERE id = ?";
    
        if ($stmt = $conn->prepare($sql)) {
    
            $stmt->bind_param('i', $id);
            $stmt->execute();
            $stmt->bind_result($name);
    
            while ($stmt->fetch()) {
                return $name;
            }
            $stmt->close();
        } else {
            echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
        }
    }
    
  • Mã chính.

    $sql = "SELECT from_id, to_id, content 
            FROM `direct_message` 
            WHERE `to_id` = ?";
    if ($stmt = $conn->prepare($sql)) {
    
        $stmt->bind_param('i', $myID);
    
        /* execute statement */
        $stmt->execute();
    
        /* bind result variables */
        $stmt->bind_result($from, $to, $text);
    
        /* fetch values */
        while ($stmt->fetch()) {
            echo "<li>";
                echo "<p>Message from: ".GetUserName($from)."</p>";
                echo "<p>Message content: ".$text."</p>";
            echo "</li>";
        }
    
        /* close statement */
        $stmt->close();
    } else {
        echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
    }
    

Điều này thực sự không hoàn toàn đúng ... bạn đang sử dụng không bind_resultđúng cách
Arian Faurtosh

1
Nếu bạn sử dụng $stmt->store_result()nó sẽ cho phép bạn làm lồng $stmtbên trong khác$stmt
Arian Faurtosh

@ArianFaurtosh, tôi đang làm gì sai vậy? Tài liệu về mysqli_stmt::bind_resultPHP.net không cho tôi biết bất cứ điều gì về lỗi của tôi ... Hay đó là một cách sử dụng tốt $stmt->store_result()?
Norman Edance

@ArianFaurtosh, tôi nghĩ rằng nếu mysql_store_result ()gửi một tập hợp kết quả lớn, nó có thể trở thành một vấn đề, hay tôi đã nhầm? Yeah, ví dụ này có lẽ nó không quá quan trọng, tuy nhiên ... Dù sao, thnx cho sửa chữa tôi :)
Norman Edance

1

get_result () hiện chỉ có sẵn trong PHP bằng cách cài đặt trình điều khiển gốc MySQL (mysqlnd). Trong một số môi trường, có thể không cài đặt được mysqlnd.

Mặc dù vậy, bạn vẫn có thể sử dụng mysqli để thực hiện các truy vấn 'select *' và nhận kết quả với tên trường - mặc dù nó phức tạp hơn một chút so với sử dụng get_result () và liên quan đến việc sử dụng hàm call_user_func_array () của php. Xem ví dụ tại Cách sử dụng bind_result () thay vì get_result () trong php , thực hiện một truy vấn 'select *' đơn giản và xuất kết quả (với tên cột) vào một bảng HTML.


0

Tôi nghĩ ví dụ 2 sẽ chỉ hoạt động như thế này, vì store_result và get_result đều lấy thông tin từ bảng.

Vì vậy, loại bỏ

/* Store the result (to get properties) */
$stmt->store_result();

Và thay đổi thứ tự một chút. Đây là kết quả cuối cùng:

$query2 = 'SELECT * FROM table WHERE id = ?'; 
$id = 5;

if($stmt = $mysqli->prepare($query)){
 /*
    Binds variables to prepared statement

    i    corresponding variable has type integer
    d    corresponding variable has type double
    s    corresponding variable has type string
    b    corresponding variable is a blob and will be sent in packets
 */
$stmt->bind_param('i',$id);

/* execute query */
$stmt->execute();

/* Get the result */
$result = $stmt->get_result();

/* Get the number of rows */
$num_of_rows = $result->num_rows;

while ($row = $result->fetch_assoc()) {
    echo 'ID: '.$row['id'].'<br>';
    echo 'First Name: '.$row['first_name'].'<br>';
    echo 'Last Name: '.$row['last_name'].'<br>';
    echo 'Username: '.$row['username'].'<br><br>';
}

/* free results */
$stmt->free_result();
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.