2012-09-20 11 views
7

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

Odpowiedz

4
  • $ stmt-> free_result() robi dość dużo, co nazwa mówi: uwalnia pamięć związaną z wynikiem.

  • $ stmt-> close zamyka uchwyt instrukcji (faktycznie kursor), uniemożliwiając przejście przez zestaw wyników (ponownie).

Chociaż manual stanów: „Zawsze należy uwolnić swój wynik z mysqli_free_result(), gdy przedmiot wynik nie jest już potrzebne”, powszechną praktyką jest, aby nie używać free_result i blisko na oświadczeniu. Po zamknięciu nie można już użyć zestawu wyników lub użyć go ponownie, a gdy php umrze, pamięć i tak zostanie zwolniona.

+0

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

+2

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

+0

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

Powiązane problemy