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 для идентификации вредоносного кода

Какой выбрать CDN для сайта. Оптимизируем скорость загрузки
Web

Какой выбрать CDN для сайта. Оптимизируем скорость загрузки

Web

Как сохранить изображение PNG на стороне сервера из URI данных base64

Приложение Синтезатор речи Google: как пользоваться и как отключить?
Web

Приложение Синтезатор речи Google: как пользоваться и как отключить?

×