Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [mysqli] prepared statements
ciano
post 20.09.2006, 21:37:54
Post #1





Grupa: Zarejestrowani
Postów: 61
Pomógł: 0
Dołączył: 31.10.2005

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
wijet
post 20.09.2006, 21:45:15
Post #2





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 20.12.2005
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
SongoQ
post 20.09.2006, 21:59:53
Post #3





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


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/


--------------------
Go to the top of the page
+Quote Post
ciano
post 21.09.2006, 18:04:23
Post #4





Grupa: Zarejestrowani
Postów: 61
Pomógł: 0
Dołączył: 31.10.2005

Ostrzeżenie: (0%)
-----


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 ...
Go to the top of the page
+Quote Post
SongoQ
post 25.09.2006, 17:35:03
Post #5





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Zgodnie z manualem http://pl.php.net/manual/en/function.mysql...-bind-param.php jesli sie powiedzie bind to zwraca true.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 16:44