Я хотел бы увидеть пример вызова с использованием 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()
Плюсы:
Проще.
Нет необходимости возиться с $row['name'].
Использует fetch().
Минусы:
Не работает с SQL запросами, использующими *.
get_result()
Плюсы:
Работает со всеми SQL-запросами.
Использует fetch_assoc().
Минусы:
Приходится возиться с переменными массива $row[].
Не так аккуратно.
Требуется родной драйвер MySQL (mysqlnd).
Ответ 2
Примеры вы можете найти на страницах соответствующих руководств. Хотя все «за» и «против» довольно просты:
get_result — единственный разумный способ обработки результатов;
но он не всегда доступен, и ваш код должен иметь запасной вариант с использованием 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