Przykład użycia bind_result vs get_result

84

Chciałbym zobaczyć przykład, jak wywołać using bind_resultvs. get_resulti 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.

Arian Faurtosh
źródło

Odpowiedzi:

200

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 $query1uż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();

Przykład 2 $query2uż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_resultz *. Jednak get_resultdziała w obu przypadkach, ale bind_resultjest 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 )
Arian Faurtosh
źródło
8
OMG, żałuję, że nie znalazłem tego pytania i odpowiedzi, ZANIM wszystko związałem z plikiem $row[]. Dziękuję za szczegółowe wyjaśnienie! Jedna uwaga; zgodnie z instrukcją get_result () jest dostępna tylko z mysqlnd.
Sablefoste
2
@SableFoste Correct! A to oznacza ... musisz majstrować przy konfiguracjach ... więc ... użyj bind_result.
test
1
dla wszystkich, w których metoda get_result () nie działa: stackoverflow.com/questions/8321096/ ...
Karl Adler
3
get_result () również nie działało dla mnie w drugim przykładzie - ciągle zwracało False i errno = 0 (brak błędu). Usunięcie wywołania store_result () naprawiło to.
winwaed
1
@Black przechowuje właściwości zapytania ... takie jak liczba zwróconych wierszy itp.
Arian Faurtosh
2

Przykłady można znaleźć na odpowiednich stronach podręcznika.

Chociaż zalety i wady są dość proste:

  • get_result to jedyny rozsądny sposób obsługi wyników
  • jednak nie zawsze jest dostępny, a twój kod musi mieć rezerwę przy użyciu brzydkiego bind_result.

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.

Twój zdrowy rozsądek
źródło
1
<b> Błąd krytyczny </b>: wywołanie niezdefiniowanej metody mysqli_stmt :: get_result () powyższy kod daje taki błąd
Kissa Mia
1
Przepraszam, ale nie uważam bind_result () za brzydkie ... Czy możesz wyjaśnić, gdzie jest brzydota?
Samuel Ramzan,
1

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

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;
    }
    
Norman Edance
źródło
To właściwie nie jest do końca prawda ... nie używasz bind_resultpoprawnie
Arian Faurtosh
1
Jeśli $stmt->store_result()go użyjesz , pozwoli ci to zagnieżdżać się $stmtw innym$stmt
Arian Faurtosh
@ArianFaurtosh, co ja robię źle? Dokumentacja dotycząca mysqli_stmt::bind_resultPHP.net nie mówi mi nic o moim błędzie ... A może jest to dobra praktyka w użyciu $stmt->store_result()?
Norman Edance
@ArianFaurtosh, myślałem, że jeśli 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 :)
Norman Edance
1

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.

mti2935
źródło
0

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();
Coolen
źródło