Pokaż wyniki od 1 do 6 z 6

Wątek: [PDO] Podstawy

  1. #1
    Zarejestrowany Awatar Mati
    Dołączył
    May 2012
    Posty
    53

    Thumbs up [PDO] Podstawy

    Poradnik PDO - Podstawy.
    PDO - PHP Data Objects.



    Co to jest te PDO ?
    PDO to interfejs języka PHP używany do komunikacjami z różnymi bazami danych np. MySql, PostgreSQL bądź Oracle.
    W PDO użyte zostały obiektowe mechanizmy PHP to oznacza, że przydatna jest znajomość OOP - obiektowego PHP.

    Dlaczego stosować PDO, a nie MySQL?
    PDO po pierwsze jest szybsze i bezpieczniejsze od mysql_ , lecz można było by się sprzeczać w kwestii mysqli_.
    PDO jest bardziej przydatne to tworzenia stron itp. na sprzedaż, ponieważ nie każdy posiada bazę danych MySQL.

    Mniej więcej już wiemy co to jest PDO i do czego służy. Jeżeli nie to odsyłam do google.


    1. Łączymy się z serwer i bazą danych.


    Kod php:
    <?php
     
               
    try {
                      
    $PDO = new PDO('mysql:host=localhost;dbname=nazwabazy''użytkownik''hasło');
                }

               catch(
    PDOException $e) {
                     echo 
    'Wystąpił błąd w połączeniu: ' $e->getMessage();
                }
        
    ?>



    W skrócie:

    Łączymy się z bazą danych, jeżeli się połączymy to do zmiennej $PDO przypisujemy nasz nowy obiekt PDO.
    Jeżeli połączenie z bazą nie powiedzie się tzn. podasz złe dane do połączenia, uruchomi nam się funkcja catch(), która zwraca nam błąd.

    Wyżej podałem przykład łączenia się z bazą MySql.

    Jeżeli chcemy się połączyć z inną bazą danych np. Postgresql
    Zamieniamy linikę z przypisywaniem do zmiennej obiektu PDO.

    Kod php:
     $PDO = new PDO("pgsql:host=localhost port=x dbname=nazwabazy user=użytkownik password=hasło"




    2. Wykonywanie zapytań.



    PDO udostępnia kilka metod do wykonywania zapytań, z których każda jest przystosowana do możliwie jak najbardziej efektywnego działania w określonych sytuacjach.

    Polecenia, które nie zwracają wyniku: polecenia SQL INSERT, UPDATE oraz DELETE. Do wykonywania takich zapytań możemy używać metody exec(), która zwraca liczbę wierszów zmodyfikowanych przy wykonywaniu danego polecenia.

    Polecenia wykonywane jednokrotnie: w przypadku wykonywania polecenia SQL np. SELECT, które zwraca zbiór wyników, bądź gdy liczba rekordów zmodyfikowanych przy wykonywaniu polecenia nie ma znaczenia, należy stosować metodę query().


    3. Dodajemy rekord. np. dodajemy nowego użytkownika naszej strony.


    Kod php:
      //tworzymy i przygotowujemy polecenie
        
    $query "INSERT INTO users SET login = ?, password = ?, email = ?";
        
    $r $PDO->prepare($query);

        
    $login 'Jan';
        
    $password 'aKowalski';
        
    $email 'kowalski@jan.pl';

        
    // powiązujemy parametry    
        
    $r->bindParam(1$login);
        
    $r->bindParam(2$password);
        
    $r->bindParam(3$email);

        
    //wykonujemy polecenie
        
    $r->execute();
        
    $r->closeCursor(); // kończymy połączenie 
    lub

    Kod php:
    //tworzymy i przygotowujemy polecenie
        
    $query "INSERT INTO users SET login = :login, password = :pass, email = :email";
        
    $r $PDO->prepare($query);

        
    $login 'Jan';
        
    $password 'aKowalski';
        
    $email 'kowalski@jan.pl';

        
    // powiązujemy parametry    
        
    $r->bindParam(':login'$login);
        
    $r->bindParam(':pass'$password);
        
    $r->bindParam(':email'$email);

        
    //wykonujemy polecenie
        
    $r->execute();
        
    $r->closeCursor(); // kończymy połączenie 
    Można też robić to w tradycyjny sposób bez powiązywania parametrów.



    4. Modyfikujemy nasz rekord.

    Kod php:
        $query "UPDATE users SET email = 'JanKowalski@gmail.com' WHERE login = 'Jan'";
        
    $r $PDO->exec($query);
        echo 
    'Zmodyfikowanych użytkowników o logine Jan: '.$r;
        
    $r->closeCursor(); // kończymy połączenie 


    Zapytanie zwróci nam następujący wynik:
    Zmodyfikowanych użytkowników o logine Jan: 1


    Jeżeli w naszej bazie istnieje 5 użytkowników o loginie Jan wszystkim zmieni się email na podany w powyższym zapytaniu, a wynik będzie następujący:

    Zmodyfikowanych użytkowników o logine Jan: 5


    5. Kasujemy nasz rekord, czyli naszego Jana :P .
    Kod php:
        $query "DELETE FROM users WHERE login = 'Jan'";
        
    $r $PDO->exec($query);
        echo 
    'Usuniętych użytkowników: '.$r;
        
    $r->closeCursor(); // kończymy połączenie 
    Zapytanie zwróci nam następujący wynik:
    Usuniętych użytkowników: : 1


    Jeżeli w naszej bazie istnieje 5 użytkowników o loginie Jan, wynik będzie następujący:
    Usuniętych użytkowników: : 5


    6. Zaznaczamy rekord, czyli naszego Jana

    Tabelka:

    Kod php:
    ID Login Password |        Email          |
    -------------------------------------------------
    |  
    Jan   |  jan1234 JanKowalski@gmail.com |
    |  
    | ...   |  ...     |          ...          | 




    Kod php:
        $query "SELECT * FROM users WHERE login = 'Jan'";
        
    $r $PDO->query($query);
        
    $User $r->fetch(PDO::FETCH_ASSOC); // zwróci nam rekord w postaci tablicy asocjacyjnej
    // W mysql wygląda to tak $User = mysql_fetch_array(mysql_query($query));
        
    $r->closeCursor(); // kończymy połączenie
      
        
    echo 'Login: '.$User['login']; // wyświetlamy login użytkownika, czyli Jan :P

        
    echo 'Email: '.$User['email']; // zwróci nam zmodyfikowany przez nas wcześniej email tzn. JanKowalski@gmail.com 


    Zastosowałem tablicę asocjacyjną:

    Kod php:
    $User $r->fetch(PDO::FETCH_ASSOC); 

    , jeżeli ktoś preferuje tablicę numeryczną to po prostu zmieniamy jedną linijkę:

    Kod php:
     $User $r->fetch(PDO::FETCH_NUM); 


    6.1 Pobieramy jedną kolumnę.


    Tabelka:
    Kod php:
    ID Login Password |    Email    |
    ---------------------------------------
    |  
    Marek |  marek12 marek@wp.pl |
    |  
    Paweł |  pawel25 Kowal@wp.pl 

    Kod php:
        $q $PDO->query("SELECT * FROM users ORDER BY id");
        
    $login $q->fetchColumn(1);// Pobieramy login z pierwszej kolumny pierwszego wiersza. // np.Marek
        
    $email $q->fetchColumn(3);// Pobieramy email z DRUGIEJ kolumny DRUGIEGO wiersza. // np.Kowal@wp.pl
        
    $r->closeCursor(); // kończymy połączenie
        
    echo $login.' '.$email// Marek Kowal@wp.pl 
    6.2 Jednoczesne pobieranie wszystkich wierszy wyników.
    Kod php:
        $query "SELECT * FROM users ORDER BY id";
        
        
    $r $PDO->query($query);
        
        
    $rows $r->fetchAll();
        
        foreach(
    $rows as $row) {
            echo 
    'ID: '.$row[0].' Login: '.$row[1]. ' Email: '.$row[3]; 
         
    // Dlaczego $row[3], a nie $row[2]? Ponieważ pod $row[2] mamy zapisane hasło użytkownika.
        
    }
       
    $r->closeCursor(); // kończymy połączenie - dobrych nawyków nigdy dość :) 


    W tym poradniku to by było na tyle.


    Jeżeli ktoś ma jakieś uwagi dot. kodu (jest coś źle napisane itd.), mojego tłumaczenia, błędów ortograficznych/interpunkcyjnych, pisać w temacie lub na PW.

    Proszę o wyrozumiałość, ponieważ to mój pierwszy poradnik.

  2. #2
    Aktywny
    Dołączył
    Jul 2008
    Posty
    866

    Domyślnie

    Szczerze mówiąc nigdy nie zagłębiałem się w FETCH_ASSOC czy FETCH_NUM, zawsze używałem
    Kod php:
    $r $sql->fetch(); 
    Nawet nie znałem innych ustawień.

    Napisałeś trochę, ale dziwi mnie brak podstawowej rzeczy.. Zapisywanie liczb?
    W większości przypadków używa się liczb a nie znaków, tekstów, charów.. Przynajmniej tak się powinno.

    Kod php:
        $sql->bindValue(':id'$idPDO::PARAM_INT); 
        
    $sql->bindValue(':hash'$hashPDO::PARAM_STR); 
    Bardzo ważnym ustawieniem jest PDO::PARAM_INT, które filtruje liczby. Z jednej strony - sprawdzenie w php i tak jest przydatne, z drugiej strony zawsze lepiej coś takiego używać. Domyślna wartość to PARAM_STR, czyli przepuści wszystko.

    Z poradnikiem to nei ma nic wspólnego, ale radzę nie nazywać zmiennych z dużej ltiery..
    Kod:
    $User = '';
    wygląda fatalnie.

    Idąc dalej.. Radzę nie używać foreach, bo to niepotrzebnie zajmuje pamięć. Zamiast tego proponuję:
    Kod php:
    $count $r->rowCount(); //zwraca liczbę, ilość wyników, czyli liczba naturalna >= 0.
    for ($i 0$i $count; ++$i) { //dla każdego wyniku
        
    $row $r->fetch(); //pobiera rekord
        
    echo $row[0]; //robimy co chcemy

    Bardziej optymalne.

    Subiektywnie:
    Absolutnie nie widzę przypadku gdzie przyda się fetchCOlumn, a na pewno nie dla osób szukających podstaw pdo.
    Ostatnio edytowane przez Drikam ; 21-04-2013 o 17:21

  3. #3
    Zarejestrowany Awatar Mati
    Dołączył
    May 2012
    Posty
    53

    Domyślnie

    Dzięki, że zwróciłeś na to uwagę. Jakiś czas temu pisałem ten poradnik, gdy jeszcze byłem na etapie początkowym nauki PDO i nie miałem takiej wiedzy.

    Drikam, przy
    Kod php:
    $r $sql->fetch(); 
    Można jeszcze zwrócić wynik w postaci obiektu, jeżeli preferujesz OOP
    Kod php:
    $r $sql->fetch(PDO::FETCH_OBJ); 

  4. #4
    Zasłużony Awatar Rodkan
    Dołączył
    Mar 2011
    Posty
    1,465

    Domyślnie

    To pisałeś poradnik na początku nauki? Gratuluję podejścia...

    Edycja: Nie napisałem nigdzie, że napisałeś go po pierwszym kontakcie z PDO, nie mniej jednak uważam za śmieszne, pisanie poradnika nawet jako formę "utrwalenia wiadomości".
    Ostatnio edytowane przez Rodkan ; 21-04-2013 o 17:38

  5. #5
    Zarejestrowany Awatar Mati
    Dołączył
    May 2012
    Posty
    53

    Domyślnie

    Ehh Rodkan, tak pisałem poradnik na początkowym etapie nauki, to nie znaczy, że dopiero co otworzyłem pierwszy wynik z google, przeczytałem i napisałem poradnik.
    Pisałem ten poradnik, aby sobie utrwalić to co już mniej więcej potrafiłem, a przy okazji chciałem się podzielić tym z innymi

  6. #6
    Programista Awatar Aravorn
    Dołączył
    Apr 2011
    Posty
    343

    Domyślnie

    To przejrzyj go jeszcze raz, skoro jesteś wyższym poziomie merytorycznym
    Flagi możesz trochę opisać, bo w nich między innymi tkwi dużo mechanizmów samego sterownika Czyli np. warianty pobierania danych itd.

    Bo nie napisałeś, o prepared statements używając ich.
    Nie czytam całości, bo nie mam czasu, ale 6.1... no sory, ale tak być nie może. Jak pobierasz jedną kolumnę, to masz zapytanie konkretne, a nie POBIERASZ CAŁĄ TABELĘ I WYBIERASZ TO CO CIĘ INTERESUJE. A to już bardziej pasowałoby wtedy zaliczyć pod kurs SQL.
    Nie opisałeś też modelu ORM, którym PDO jest, co jest podstawą, jak sama nazwa wskazuje - PHP Data Objects.
    Czyli napisane tak, jak można by robić podstawowe operacje zamiast sterownika standardowego, ale to jest głupota - PDO służy do czegoś innego z samego założenia, o czym 90% nie wie lub zapomina. I to nie znaczy, że te błędne schematy należy powielać.

Informacje o wątku

Użytkownicy przeglądający ten wątek

Aktualnie 1 użytkownik(ów) przegląda ten wątek. (0 zarejestrowany(ch) oraz 1 gości)

Podobne wątki

  1. Platforma/FW pod Grę cz.1(Podstawy)
    Przez Tyranus w dziale Budowa gry via www
    Odpowiedzi: 0
    Ostatni post / autor: 29-01-2010, 12:26
  2. PBF-Tworzenie i podstawy
    Przez Osama w dziale PBF
    Odpowiedzi: 2
    Ostatni post / autor: 19-06-2008, 19:42
  3. Podstawy
    Przez FablePL w dziale Budowa gry via www
    Odpowiedzi: 1
    Ostatni post / autor: 08-06-2008, 19:17
  4. Podstawy webserva
    Przez Myst w dziale Dyskusje
    Odpowiedzi: 20
    Ostatni post / autor: 25-03-2008, 17:39
  5. *Kurs JS cz.2 - Podstawy*
    Przez unix89 w dziale JavaScript/AJAX
    Odpowiedzi: 5
    Ostatni post / autor: 05-01-2008, 19:40

Zakładki

Uprawnienia umieszczania postów

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •