Decydującym czynnikiem dla mnie jest to, czy wywołuję kolumny zapytań przy użyciu *
.
Użycie bind_result()
byłoby lepsze do tego:
// Use bind_result() with fetch()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
Użycie get_result()
byłoby lepsze do tego:
// Use get_result() with fetch_assoc()
$query2 = 'SELECT * FROM table WHERE id = ?';
Przykład 1 $query1
użyciabind_result()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
$id = 5;
if($stmt = $mysqli->prepare($query)){
$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();
Przykład 2 $query2
użyciaget_result()
$query2 = 'SELECT * FROM table WHERE id = ?';
$id = 5;
if($stmt = $mysqli->prepare($query)){
$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();
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']
.
bind_result ()
Plusy:
- Prostsze
- Nie ma potrzeby zadzierać
$row['name']
- Używa
fetch()
Cons:
- Nie działa z zapytaniami SQL, które używają
*
get_result ()
Plusy:
- Działa ze wszystkimi instrukcjami SQL
- Używa
fetch_assoc()
Cons:
- Trzeba bawić się zmiennymi tablicowymi
$row[]
- Nie tak schludnie
- wymaga natywnego sterownika MySQL ( mysqlnd )
$row[]
. Dziękuję za szczegółowe wyjaśnienie! Jedna uwaga; zgodnie z instrukcją get_result () jest dostępna tylko z mysqlnd.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.
źródło
Główna różnica, którą zauważyłem, polega na tym, że
bind_result()
powoduje to błąd2014
, gdy próbujesz zakodować zagnieżdżone $ stmt w innym $ stmt , które jest pobierane (bezmysqli::store_result()
):Przykład:
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; }
źródło
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.
źródło
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();
źródło