Chciałbym zobaczyć przykład, jak wywołać using bind_result
vs. get_result
i jaki byłby cel używania jednego nad drugim.
Również zalety i wady korzystania z każdego z nich.
Jakie są ograniczenia używania jednego z nich i czy istnieje różnica.
Chciałbym zobaczyć przykład, jak wywołać using bind_result
vs. get_result
i jaki byłby cel używania jednego nad drugim.
Również zalety i wady korzystania z każdego z nich.
Jakie są ograniczenia używania jednego z nich i czy istnieje różnica.
Odpowiedzi:
Decydującym czynnikiem dla mnie jest to, czy wywołuję kolumny zapytań przy użyciu *
.
bind_result()
byłoby lepsze do tego:// Use bind_result() with fetch()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
get_result()
byłoby lepsze do tego:// Use get_result() with fetch_assoc()
$query2 = 'SELECT * FROM table WHERE id = ?';
$query1
użyciabind_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
użyciaget_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();
Jak widać, nie można używać bind_result
z *
. Jednak get_result
działa w obu przypadkach, ale bind_result
jest prostszy i usuwa trochę bałaganu $row['name']
.
Plusy:
$row['name']
fetch()
Cons:
*
Plusy:
fetch_assoc()
Cons:
$row[]
Przykłady można znaleźć na odpowiednich stronach podręcznika.
Chociaż zalety i wady są dość proste:
W każdym razie, jeśli Twoim pomysłem jest użycie jednej z funkcji bezpośrednio w kodzie aplikacji - ten pomysł jest błędny. Jednak dopóki masz je zamknięte w jakiejś metodzie zwracania danych z zapytania, tak naprawdę nie ma znaczenia, której z nich użyć, z wyjątkiem faktu, że będziesz potrzebować dziesięć razy więcej kodu, aby zaimplementować bind_result.
Główna różnica, którą zauważyłem, polega na tym, że bind_result()
powoduje to błąd 2014
, gdy próbujesz zakodować zagnieżdżone $ stmt w innym $ stmt , które jest pobierane (bez mysqli::store_result()
):
Przygotowanie nie powiodło się: (2014) Polecenia niezsynchronizowane; nie możesz teraz uruchomić tego polecenia
Funkcja używana w głównym kodzie.
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;
}
}
Kod główny.
$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
poprawnie
$stmt->store_result()
go użyjesz , pozwoli ci to zagnieżdżać się $stmt
w innym$stmt
mysqli_stmt::bind_result
PHP.net nie mówi mi nic o moim błędzie ... A może jest to dobra praktyka w użyciu $stmt->store_result()
?
mysql_store_result ()
wyśle duży zestaw wyników, może to stać się problemem, czy się mylę? Tak, dla tego przykładu może to nie jest takie ważne, jednak ... W każdym razie dziękuję za poprawienie mnie :)
Funkcja get_result () jest teraz dostępna tylko w PHP po zainstalowaniu natywnego sterownika MySQL (mysqlnd). W niektórych środowiskach instalacja mysqlnd może nie być możliwa lub pożądana.
Niezależnie od tego, nadal możesz używać mysqli do wykonywania zapytań 'select *' i otrzymywania wyników z nazwami pól - chociaż jest to nieco bardziej skomplikowane niż użycie get_result () i wymaga użycia funkcji call_user_func_array () php. Zobacz przykład w Jak używać bind_result () zamiast get_result () w php, który wykonuje proste zapytanie „select *” i wyświetla wyniki (z nazwami kolumn) do tabeli HTML.
Myślę, że przykład 2 zadziała tylko w ten sposób, ponieważ store_result i get_result pobierają informacje z tabeli.
Więc usuń
/* Store the result (to get properties) */
$stmt->store_result();
I trochę zmień kolejność. Oto efekt końcowy:
$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[]
. Dziękuję za szczegółowe wyjaśnienie! Jedna uwaga; zgodnie z instrukcją get_result () jest dostępna tylko z mysqlnd.