Szukałem informacji o przygotowanych oświadczeniach mysqli i mam 2 pytania na ten temat.mysqli przygotowane oświadczenie, jak zapętlić zestaw wyników
Jak czytałem, i dowiedzieć się, że kolejność wykonywania przygotowanym oświadczeniu wygląda mniej więcej tak:
$sql = 'SELECT image_id, filename, caption FROM images WHERE image_id = ?';
// connect to the database
$conn = ....
$stmt = $conn->stmt_init();
$stmt->prepare($sql);
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->bind_result($image_id, $filename, $caption);
// optional: get total of records in the result set
$stmt->store_result();
$numRows = $stmt->num_rows;
// loop through the result set
while ($stmt->fetch()) {
// code goes here...
}
or
// fetch the result for one record
$stmt->fetch()
// free & close
$stmt->free_result();
$stmt->close;
$conn->close();
Oto moje pierwsze pytanie:
Jak czytałem, ale również wymienia następujące:
Jeśli nie wiążisz wyniku do zmiennych, użyj $ row = $ stmt-> fetch() i uzyskaj dostęp do każdej zmiennej jako $ row ['column_name']. Tak więc,
Czy są jakieś plusy/minusy, używając jednej z dwóch metod, aby zapętlić zestaw wyników? Jeśli nie ma różnicy, to po co zawracać sobie głowę wynikami za pomocą $ stmt-> bind_result w pierwszej kolejności? Jaki jest sens, jeśli mogę zamiast tego użyć $ row = $ stmt-> fetch()?
Oto moje drugie pytanie:
- $ stmt-> free_result(); co dokładnie uwalnia? the prepare() lub store_result() lub inaczej?
- $ stmt-> close; co dokładnie zamykam? the stmt_init() lub the prepare() czy inaczej?
Mam nadzieję, że twoje odpowiedzi pozwoli mi zrozumieć lepiej przygotowanych sprawozdań, więc można zbudować bezpieczną coś ...
Dzięki
co zrobić, jeśli chcę wykonać inne zapytanie? czy zwolnić pamięć i pozostawić uchwyt oświadczenia otwarty? lub czy absolutnie muszę zamknąć uchwyt instrukcji i ponownie otworzyć nowy za pomocą $ stmt = $ conn-> stmt_init(); ? – Marco
Po prostu wykonaj kolejne zapytanie i nie rób nic z bliska i za darmo. Przypisując nowy wynik do wyciągu, stare zostaną zamknięte i zwolnione automatycznie. – JvdBerg
ok, więc po więcej zapytań, w zasadzie muszę się przygotować, bind_param, execute, bind_result. Nie trzeba stmt_init dla każdego nowego zapytania, tylko jeden raz, tak samo jak połączenie z bazą danych, tylko jeden raz. dobrze? – Marco