Я хотів би побачити приклад того, як дзвонити за допомогою bind_result
vs. get_result
та яка буде мета використання одного над іншим.
Також плюси і мінуси використання кожного.
Яке обмеження використання будь-якого і чи є різниця.
Я хотів би побачити приклад того, як дзвонити за допомогою bind_result
vs. get_result
та яка буде мета використання одного над іншим.
Також плюси і мінуси використання кожного.
Яке обмеження використання будь-якого і чи є різниця.
Відповіді:
Вирішальним фактором для мене є те, чи викликати я свої стовпці запиту за допомогою *
.
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 = ?';
$query1
використанняbind_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();
$query2
використанняget_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();
Як ви можете бачити , ви не можете використовувати bind_result
з *
. Однак get_result
працює і для обох, але bind_result
простіше і призводить до неприємностей $row['name']
.
Плюси:
$row['name']
fetch()
Мінуси:
*
Плюси:
fetch_assoc()
Мінуси:
$row[]
Приклади ви можете знайти на відповідних сторінках керівництва.
Хоча плюси і мінуси досить прості:
У будь-якому випадку, якщо ваша ідея полягає у використанні будь-якої функції прямо в коді програми - ця ідея помилкова. Але поки у вас є їх інкапсульовані в якомусь методі для повернення ваших даних із запиту, насправді не має значення, який із них використовувати, крім того, що для реалізації bind_result вам знадобиться в десять разів більше коду.
Основна різниця, яку я помітив, полягає в тому , що при спробі кодувати вкладений $ stmt всередині іншого $ stmt , який отримується (без ), bind_result()
виникає помилка :2014
mysqli::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;
}
bind_result
неправильно
$stmt->store_result()
це, це дозволить вам робити вкладені $stmt
всередину інші$stmt
mysqli_stmt::bind_result
PHP.net не говорить мені нічого про мою помилку ... Або це хороша практика $stmt->store_result()
?
mysql_store_result ()
надсилає великий набір результатів, це може стати проблемою, або я помиляюся? Так, для цього прикладу, можливо, це не так важливо, однак ... У будь-якому випадку, thnx за виправлення мене :)
get_result () тепер доступний лише в PHP, встановивши власний драйвер MySQL (mysqlnd). У деяких середовищах встановлення mysqlnd може бути неможливим або бажаним.
Незважаючи на це, ви все ще можете використовувати mysqli для виконання запитів 'select *' та отримання результатів з іменами полів - хоча це дещо складніше, ніж використання get_result (), і передбачає використання функції php call_user_func_array (). Див. Приклад у розділі Як використовувати bind_result () замість get_result () у php, який робить простий запит 'select *' і виводить результати (з іменами стовпців) до таблиці HTML.
Я думаю, що приклад 2 буде працювати лише так, оскільки store_result та get_result отримують інформацію з таблиці.
Тож прибирайте
/* 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();
$row[]
. Дякую за детальне пояснення! Одна обережність; відповідно до інструкції get_result () доступний лише з mysqlnd.