Web

Пример использования bind_result/get_result

Я хотел бы увидеть пример вызова с использованием bind_result и get_result и узнать, какова цель использования одного над другим. Также плюсы и минусы использования каждого из них. Каковы ограничения при использовании каждого из них и есть ли разница.

 

Ответ 1

Решающим фактором для меня является то, буду ли я вызывать столбцы запроса, используя «*».

Использование bind_result() было бы лучше для этого:

// Использование bind_result() с fetch()

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

 Использование get_result() было бы лучше для этого:

// Используйте get_result() с fetch_assoc() 

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

 Пример 1 для $query1 с использованием bind_result()

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

$id = 5;

if($stmt = $mysqli->prepare($query)){

   /*

        Связывает переменные с подготовленным оператором

 

        i соответствующая переменная имеет тип integer

        d соответствующая переменная имеет тип double

        s соответствующая переменная имеет тип string

        b соответствующая переменная имеет тип blob и будет отправлена в пакетах.

   */

   $stmt->bind_param('i',$id);

   /* выполнить запрос */

   $stmt->execute();

 

   /* Сохраните результат (для получения свойств) */

   $stmt->store_result();

   /* Получение количества строк */

   $num_of_rows = $stmt->num_rows;

   /* Привязка результата к переменным */

   $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>';

   }

   /* свободные результаты */

   $stmt->free_result();

   /* закрытие операторов */

   $stmt->close();

}

/* закрыть соединение */

$mysqli->close();

 

Пример 2 для $query2 с использованием get_result()

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

$id = 5;

if($stmt = $mysqli->prepare($query)){

   /*

        Связывает переменные с подготовленным оператором

        i соответствующая переменная имеет тип integer

        d соответствующая переменная имеет тип double

        s соответствующая переменная имеет тип string

        b соответствующая переменная имеет тип blob и будет отправлена в пакетах.

   */

   $stmt->bind_param('i',$id);

   /* выполнить запрос */

   $stmt->execute();

   /* Получение результата */

   $result = $stmt->get_result();

   /* Получение количества строк */

   $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>';

   }

   /* свободные результаты */

   $stmt->free_result();

   /* закрытие операторов */

   $stmt->close();

}

/* закрыть соединение */

$mysqli->close();

 Как вы видите, вы не можете использовать bind_result с «*». Однако get_result работает для обоих вариантов, но bind_result проще и избавляет от некоторой путаницы с $row['name'].

bind_result()

Плюсы:

 

  1. Проще.

  2. Нет необходимости возиться с $row['name'].

  3. Использует fetch().

Минусы:

  1. Не работает с SQL запросами, использующими *.

get_result()

Плюсы:

  1. Работает со всеми SQL-запросами.

  2. Использует fetch_assoc().

Минусы:

  1. Приходится возиться с переменными массива $row[].

  2. Не так аккуратно.

  3. Требуется родной драйвер MySQL (mysqlnd).

 

 Ответ 2

Примеры вы можете найти на страницах соответствующих руководств. Хотя все «за» и «против» довольно просты:

  1. get_result единственный разумный способ обработки результатов;

  2. но он не всегда доступен, и ваш код должен иметь запасной вариант с использованием bind_result.

В любом случае, если ваша идея состоит в том, чтобы использовать любую из этих функций прямо в коде приложения, — эта идея ошибочна. Но пока они инкапсулированы в каком-то методе для возврата данных из запроса, не имеет значения, какую из них использовать, за исключением того, что для реализации bind_result вам потребуется в десять раз больше кода.



Ответ 3

Основное отличие, которое я заметил, заключается в том, что bind_result() выдает ошибку 2014, когда вы пытаетесь закодировать вложенный $stmt внутри другого $stmt, который используется (без mysqli::store_result() ):

 Prepare failed: (2014) Commands out of sync; you can't run this command now

 Пример:

Функция, используемая в основном коде:

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

    /* выполнение оператора */

    $stmt->execute();

    /* связывание переменных результата */

    $stmt->bind_result($from, $to, $text);

    /* выборка значений */

    while ($stmt->fetch()) {

        echo "<li>";

            echo "<p>Message from: ".GetUserName($from)."</p>";

            echo "<p>Message content: ".$text."</p>";

        echo "</li>";

    }

    /* закрытие операторов */

    $stmt->close();

} else {

    echo "Ошибка: (" . $conn->errno . ") " . $conn->error;

}

 

Ответ 4

Я думаю, что предыдущий ответ будет работать только так, потому что store_result и get_result оба получают информацию из таблицы. Поэтому удалите:

/* Сохраните результат (для получения свойств) */

$stmt->store_result();

 И немного измените порядок кода. Вот конечный результат:

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

$id = 5;

if($stmt = $mysqli->prepare($query)){

/*

    Связывает переменные с подготовленным оператором

 

    i соответствующая переменная имеет тип integer

    d соответствующая переменная имеет тип double

    s соответствующая переменная имеет тип string

    b соответствующая переменная имеет тип blob и будет отправлена в пакетах.

 */

$stmt->bind_param('i',$id);

/* выполнить запрос */

$stmt->execute();

/* Получение результата */

$result = $stmt->get_result();

/* Получение количества строк */

$num_of_rows = $result->num_rows;

while ($row = $result->fetch_assoc()) {

    echo 'ID: '.$row['id'].'<br>';

    echo 'Имя: '.$row['first_name'].'<br>';

    echo 'Фамилия: '.$row['last_name'].'<br>';

    echo 'Логин: '.$row['username'].'<br><br>';

}

/* освобождение результатов */

$stmt->free_result();

 

Схожие статьи

Web

Как вставить новый элемент в массив в любую позицию на PHP

Web

Где PHP хранит журнал ошибок?

Web

Применение выражения eval в php

Web

Удаление из массива PHP по значению (не по ключу)