Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysqli] prepared statements
Forum PHP.pl > Forum > Bazy danych
ciano
Jaka jest korzyść z prepared statements jeśli wykonuję zapytanie typu: dodaj pojedyńczy rekord do bazy.

Czy chodzi o to, że typ zapytania jest jakby zapamiętany przez bazę i później to zapytanie jest szybciej wyonywane, gdyż jest już znane?
wijet
Prepared statements przyspiesza wykonywanie zapytan, podczas przygotowania zapytanie jest parsowane (serwer oblicza jak najkorzystniej je wykonac), stosuje sie je w zapytaniach tego "samego" typu,
gdzie np. zmienia sie tylko jakas zmienna natomiast logika zapytania zostaje ta sama.
prepared statements
SongoQ
Jak to jest w bazie MySQL czy PG to dokladnie nie wiem trzeba by doczyta. Ale wyjasnie CI na przykladzie ORACLE.

Zapytanie gdzie sa parametry bindowane trafia do bazy nastepnie jest kilka etapow zanim przejdzie do exekucji tego zapytania. Sprawdzanie poprawosci, wyciaganie odpowiednich obiektow, sprawdzanie czy te obiekty istnieja, nastepnie sa wykonywane plany wykonan takiego zapytania (ile to trudno powiedziec) wybierany jest oczywiscie najlepszy plan wykonania. Nastepnie taki plan jest zapisywany w library cache (mam nadzieje ze nie pomylilem miejsca) i nastepuje bindowanie parametrow i wykonanie zapytania, zwrocenie kursora a nastepnie to juz sie mozna domyslec.

Teraz gdy wysylasz 2 raz takie samo zapytanie o tych samych parametrach gdzie zamiast wartosci masz binda nastepuje porownianie z library cache i jesli znak po znaku takie zapytanie wystepuje (w 10g wazne sa nawet puste znaki, komentarze itd) to pewien etap przetwazania zapytania jest pomijany i nastepuje etap exekucji zapytania.

Pytanie nasowa sie czy zawsze sie tak stosuje? Otoz nie. Sa przypadki w ktorych nie nalezy bindowac, poniewaz optymalizator dobiera plan wykonania dla okreslonych parametow gdzie wazny jest index, rozklad rekordow itd. I jesli jest plan obliczony 1 zapytania dla jednego konkretnego rekordu a my w parametrze bindowanym podamy zupelnie inny, ktory bedzie zwrocony w bardzo wielkim czasie. Takie sytuacje sa zadkoscia w bazach danych ale sie zdarzaja. Tak czy inaczej warto miec je w pamieci.

Odnosnie bazy MySQL czy PG az tak sie w to nie wgryzalem, na pewno jakis tak cache jest (domyslam sie ze po zresetowaniu bazy pewnie jest czyszczony). PDO z prepare i bindem powstalo wsumie na potrzebe ORACLE, na stronie ORACLE mozna troche szczegolow znalezc, choc bledy tez sie pojawiaja.

Jesli znajdziesz ciekawy art na temat bind i prepare w MySQLu to bardzo prosze o linka, warto poczytac jak to sie odbywa w tej bazie.

Mam nadzieje ze pewne rzeczy wyjasnilem jak bys mial pytania to pisz.


@wijet Hehe troszeczke mnie ubiegles. Czyli podobnie jak ORACLE.


Na swoim blogu zamiscilem post z wiekszymi szczegolami jak to przebiega:
http://blog.chylek.pl/pdo-prepared-stateme...sc-zapytan-sql/
ciano
Mam takie pytanie na temat pobierania przez prepared statements ...

Chcę sprawdzić czy użytkownik podał poprawny login i hasło, jeśli tak to chcę dowiedzieć się czy jest aktywny.

Mam taki kod:

  1. <?php
  2. if ($stmt = $mysqli->prepare("SELECT id_uzytkownika, aktywny FROM Loginy WHERE login = ? AND haslo = ?"))
  3.  {
  4. $stmt->bind_param("ss", $_POST[Login], $_POST[Haslo]);
  5. $stmt->execute();
  6.  
  7. $Id_Uzytkownika = false;
  8. $Aktywny = false;
  9. echo"$Id_Uzytkownika";
  10. $stmt->bind_result($Id_Uzytkownika, $Aktywny);
  11. $stmt->fetch();
  12.  
  13. $stmt->close();
  14.  
  15.  ...
  16. ?>


Problem jest taki, że jeśli nie ma użytkownika, to obydwie wiązane(bindowane) zmienne przyjmują wartość 0, a metoda bind_param() zwraca true.

Troche to dla mnie bez sensu, chyba że źle rozumuje ...
SongoQ
Zgodnie z manualem http://pl.php.net/manual/en/function.mysql...-bind-param.php jesli sie powiedzie bind to zwraca true.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.