web-dev-qa-db-ja.com

bind_resultとget_resultの使用例

bind_resultget_resultを使用して呼び出す方法の例と、一方を他方の上で使用する目的を確認したいと思います。

また、それぞれを使用することの長所と短所もあります。

どちらを使用する場合の制限は何ですか?違いがあります。

72
Arian Faurtosh

私にとっての決定要因は、*を使用してクエリ列を呼び出すかどうかです。

これにはbind_result()を使用することをお勧めします。

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

これにはget_result()を使用することをお勧めします。

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

bind_result()を使用した$query1の例1

$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();

get_result()を使用した$query2の例2

$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();

ご覧のとおり、bind_result*を併用することはできません。ただし、get_resultは両方で機能しますが、bind_resultはより単純で、$row['name']の混乱を取り除きます。


bind_result()

長所:

  • よりシンプル
  • $row['name']をいじる必要はありません
  • fetch()を使用します

短所:

  • *を使用するSQLクエリでは機能しません

get_result()

長所:

  • すべてのSQLステートメントで動作します
  • fetch_assoc()を使用します

短所:

  • 配列変数$row[]をいじる必要があります
  • きれいではない
  • mySQLネイティブドライバーが必要です( mysqlnd
170
Arian Faurtosh

それぞれのマニュアルページで見つけることができる例。

長所と短所は非常に簡単ですが、

  • get_resultは結果を処理する唯一の正しい方法です
  • しかし、常に利用できるとは限らず、コードはいbind_resultを使用してフォールバックする必要があります。

とにかく、もしあなたのアイデアがアプリケーションコードの中でどちらかの機能を使うことなら、このアイデアは間違っています。それでも、クエリからデータを返すメソッドにカプセル化されている限り、実際に使用するのは重要ではありません。bind_resultを実装するために10倍のコードが必要になるという事実を除きます。

2

私が気づいた主な違いは、bind_result()がエラー2014を与えることです。ネストされたコードをしようとすると$ stmtが他の$ stmtの中にあり、それはfetchedmysqli::store_result()なし):

準備に失敗しました:(2014)コマンドが同期していません。今このコマンドを実行することはできません

例:

  • メインコードで使用される関数。

    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;
        }
    }
    
  • メインコード。

    $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;
    }
    
1
Norman Edance

get_result()は、MySQLネイティブドライバー(mysqlnd)をインストールすることにより、PHPでのみ使用できるようになりました。環境によっては、mysqlndのインストールが不可能または望ましくない場合があります。

それにもかかわらず、mysqliを使用して 'select *'クエリを実行し、フィールド名を使用して結果を取得できます-get_result()を使用するよりも少し複雑で、phpのcall_user_func_array()関数を使用する必要があります phpでget_result()の代わりにbind_result()を使用する方法 の例を参照してください。これは単純な 'select *'クエリを実行し、結果を(列名とともに)HTMLテーブルに出力します。

0
mti2935

Store_resultとget_resultは両方ともテーブルから情報を取得するため、例2はこのようにしか機能しないと思います。

だから削除

/* Store the result (to get properties) */
$stmt->store_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();
0
Coolen