sobota, 16 maja 2015

[PHP][PDO] Podstawy cz.4 - dodawanie, edycja i usuwanie rekordów

TRUE
6666392175572948720
Dodawanie rekordów do bazy w zasadzie niewiele się różni od zaprezentowanych do tej pory operacji, analogicznie ma się sprawa z aktualizacją rekordów. Operacje takie podobnie jak w poprzednich przypadkach wykonywać można na dwa sposoby, które zostaną tutaj opisane. Zarazem jest to już ostatnia część podstawowego poradnika do PDO. Po przebrnięciu przez nią będziemy mieli za sobą wszystkie niezbędne informacje wymagane do trochę bardziej zaawansowanej pracy z PDO, która zostanie opisana w następnych tutorialach.

1. Dodawanie nowego rekordu

a) Wykonanie zapytania - exec()

Dodawanie nowych rekordów za pomocą PDO jest bardzo proste i ogranicza się do wykonania zapytania INSERT INTO. Można to zrobić na dwa sposoby - za pomocą sparametryzowanych zmiennych jak i bez. Oczywiście zawsze wykorzystywać będziemy metodę pierwszą, jednak przyjrzyjmy się też metodzie drugiej ze względów czysto formalnych. Przeanalizujemy zatem teraz najprostrzy przykład, niewykorzystujący bindowania zmiennych, czyli metodę exec(). Metoda ta szybkie wykonanie zapytania typu INSERT, UPDATE lub DELETE. W tym przypadku wykonamy zapytanie INSERT INTO.

Użycie metody exec() wyglada następująco:
[code] $result = $dbh->exec($zapytanie);[/code]
Chcemy utworzyć w bazie nowego klienta, stwórzmy zatem przykładowy plik, np. add_user.php.

Przygotować musimy prosty formularz, w którym podamy wszystkie wymagane dane, aby dodać użytkownika do bazy. Formularz wyglądać będzie tak:
[code]
<form method="POST" action="add_user.php">
<input type="hidden" name="action" value="add" />
<input type="text" name="login" value="" />
<input type="password" name="password" value= ""/>
<input type="text" name="first_name" value="" />
<input type="text" name="last_name" value="" />
<input type="text" name="email" value="" />
<input type="text" name="country" value="" />
<input type="text" name="city" value="" />
<input type="text" name="post_code" value="" />
<input type="text" name="address" value="" />
<input type="text" name="phone" value="" />
<input type="submit" name="add" value="add" />
</form>[/code]
Formularz nie będzie zawierał żadnej walidacji, robimy to tylko dla przykladu. Załóżmy jednak, że wszytkie pola w formularzu są wymagane i ich wypełnienie jest konieczne dla dodania nowego klienta do bazy.

Właściwy kod dodający nową osobę do bazy będzie wyglądał następnie tak:
[code]
if($_POST['action'] == 'add')
{
  $login = $_POST['login'];
  $password = $_POST['password'];
  $first_name = $_POST['first_name'];
  $last_name = $_POST['last_name'];
  $email = $_POST['email'];
  $country = $_POST['country '];
  $city = $_POST['city'];
  $post_code = $_POST['post_code'];
  $address = $_POST['address'];
  $phone = $_POST['phone'];
  $created_at = time();

   // wykonanie polecenia INSERT
  $result = $dbh->exec('INSERT INTO customers(
                        login,
                        password,
                        first_name,
                        last_name,
                        email,
                        country,
                        city,
                        post_code,
                        address,
                        phone,
                        created_at,
                        updated_at
                        )
                        VALUES(
                        "'.$login.'",
                        "'.$password.'",
                        "'.$first_name.'",
                        "'.$last_name.'",
                        "'.$email.'",
                        "'.$country.'",
                        "'.$city.'",
                        "'.$post_code.'",
                        "'.$address.'",
                        "'.$phone.'",
                        '.$created_at.',
                        '.$created_at.'
                        )');


  if($result !== false)
  {
    echo 'Dodano użytkownika o ID = ' . $dbh->lastInsertId();
  } else {
    echo 'Wystąpił błąd';
  }

  $stmt->closeCursor();
  unset($stmt);
  $dbh = null;
}
[/code]

Oczywiście to prosty przykład, nie walidujemy tutaj wprowadzanych danych w żaden sposób. Przykład pokazuje jak wygląda użycie metody exec(). Jest to też zamierzony zabieg, aby pokazać kontrast pomiędzy tą metodą, a metodą parametryzującą zmienne, którą zobaczymy za chwilę. Przejdźmy więc do tej metody. Podobnie jak w przypadku zapytań SELECT wszystkie ze zmiennych przypiszemy za pomocą metody bindValue(), a całość zapytania wykonamy metodą execute(). Popatrzmy na kod, który tym razem wyglądać będzie tak:

b) Wykonanie zapytania za pomocą prepare() i execute()


[code]if($_POST['action'] == 'add')
{
  $login = $_POST['login'];
  $password = $_POST['password'];
  $first_name = $_POST['first_name'];
  $last_name = $_POST['last_name'];
  $email = $_POST['email'];
  $country = $_POST['country '];
  $city = $_POST['city'];
  $post_code = $_POST['post_code'];
  $address = $_POST['address'];
  $phone = $_POST['phone'];
  $created_at = time();

   // przygotowanie szkieletu zapytania INSERT INTO
  $stmt = $dbh->prepare('INSERT INTO customers(
                        login,
                        password,
                        first_name,
                        last_name,
                        email,
                        country,
                        city,
                        post_code,
                        address,
                        phone,
                        created_at,
                        updated_at
                        )
                        VALUES(
                        :login,
                        :password,
                        :first_name,
                        :last_name,
                        :email,
                        :country,
                        :city,
                        :post_code,
                        :address,
                        :phone,
                        :created_at,
                        :updated_at
                        )');
                     
  // przypisujemy zmienne do placeholderów
  bindValue(':login', $login, PDO::PARAM_STR);
  bindValue(':password', $password, PDO::PARAM_STR);
  bindValue(':first_name', $first_name, PDO::PARAM_STR);
  bindValue(':last_name', $last_name, PDO::PARAM_STR);
  bindValue(':email', $email, PDO::PARAM_STR);
  bindValue(':country', $country , PDO::PARAM_STR);
  bindValue(':city', $city, PDO::PARAM_STR);
  bindValue(':post_code', $post_code, PDO::PARAM_STR);
  bindValue(':address', $address, PDO::PARAM_STR);
  bindValue(':phone', $phone, PDO::PARAM_STR);
  bindValue(':created_at', $created_at, PDO::PARAM_INT);
  bindValue(':updated_at', $created_at, PDO::PARAM_INT);

  // wykonujemy zapytanie
  $result = $stmt->execute();

  if($result !== false)
  {
    echo 'Dodano użytkownika o ID = ' . $dbh->lastInsertId();
  } else {
    echo 'Wystąpił błąd';
  }

  $stmt->closeCursor();
  unset($stmt);
  $dbh = null;
}[/code]
Od razu zrobiło się piękniej - w treści zapytania nie występuje ani jedna zmienna.
I takiego wlaśnie sposobu radzę używać i uznać go za jedyny słuszny.

Pobranie id dodawanego rekordu - lastInsertId()

Przy okazji zapytań INSERT warto wspomnieć o pobieraniu wartości id ostatniego dodanego rekordu. Służy do tego metoda:
[code] $inserted_id = $dbh->lastInsertId()[/code]

2. Aktualizacja rekordu

Aktualizowanie rekordów w bazie za pomocą PDO nie różni się niczym od poznanych do tej pory metod. Podobnie jak przy zapytaniu INSERT INTO, do zapytania UPDATE również wykorzystujemy metodę prepare() do przygotowania szkieletu zapytania, metodę bindValue() do przypisania zmiennych, a na koniec metodę execute() do wykonania zapytania. Przykład poniżej:
[code]
if($_POST['action'] == 'update')
{
  $id = $_POST['id'];

  $password = $_POST['password'];
  $first_name = $_POST['first_name'];
  $last_name = $_POST['last_name'];
  $email = $_POST['email'];
  $country = $_POST['country '];
  $city = $_POST['city'];
  $post_code = $_POST['post_code'];
  $address = $_POST['address'];
  $phone = $_POST['phone'];
  $updated_at = time();

   // przygotowanie szkieletu zapytania
  $stmt = $dbh->prepare('UPDATE customers SET                      
                        password = :password,
                        first_name = :first_name,
                        last_name =  :last_name,
                        email =  :email,
                        country = :country,
                        city = :city,
                        post_code = :post_code,
                        address = :address,
                        phone = :phone,                      
                        updated_at = :updated_at
                        WHERE customer_id = :id                    
                        ');
                     
  // przypisujemy zmienne do placeholderów

  bindValue(':login', $login, PDO::PARAM_STR);
  bindValue(':password', $password, PDO::PARAM_STR);
  bindValue(':first_name', $first_name, PDO::PARAM_STR);
  bindValue(':last_name', $last_name, PDO::PARAM_STR);
  bindValue(':email', $email, PDO::PARAM_STR);
  bindValue(':country', $country , PDO::PARAM_STR);
  bindValue(':city', $city, PDO::PARAM_STR);
  bindValue(':post_code', $post_code, PDO::PARAM_STR);
  bindValue(':address', $address, PDO::PARAM_STR);
  bindValue(':phone', $phone, PDO::PARAM_STR);
  bindValue(':updated_at', $updated_at, PDO::PARAM_INT);
  bindValue(':id', $id, PDO::PARAM_INT);

  // wykonujemy zapytanie
  $result = $stmt->execute();

  if($result !== false)
  {
    echo 'Zaktualizowano użytkownika o ID = ' . $id;
  } else {
    echo 'Wystąpił błąd';
  }

  $stmt->closeCursor();
  unset($stmt);
  $dbh = null;
}[/code]

3. Usuwanie rekordów

I analogicznie ma się sprawa z zapytaniem DELETE, które wykonujemy w identyczny sposób jak zapytania INSERT INTO i UPDATE. Przykład poniżej usuwa z tabeli klienta o id pobieranym ze zmiennej $del_id:
[code]
   // przygotowanie szkieletu zapytania INSERT INTO
  $stmt = $dbh->prepare('DELETE FROM customers WHERE customer_id = :id');
                     
  // przypisujemy zmienną do placeholdera
  bindValue(':id', $del_id, PDO::PARAM_INT);

  // wykonujemy zapytanie
  $result = $stmt->execute();

  if($result !== false)
  {
    echo 'Usunięto użytkownika o ID = ' . $del_id;
  } else {
    echo 'Wystąpił błąd';
  }

  $stmt->closeCursor();
  unset($stmt);
  $dbh = null;[/code]

Jak widać wszystkie podstawowe operacje na bazie są bardzo proste. Schodki zaczynają się w przypadku bardziej złożonych operacji, gdyż jak już wiemy PDO może pracować jedynie na jednym zbiorze jednocześnie, ale te zagadnienia zostaną szerzej opisane w następnym poradniku. Wszystkie absolutnie podstawowe kwestie umożliwiające podstawowa pracę z bazą danych zostały w tym cyklu wyczerpane. W następnych częściach przyjdzie czas na trochę bardziej zaawansowaną zabawę z PDO.

Oficjalny, pełny manual biblioteki PDO znajduje się tutaj: http://php.net/manual/en/book.pdo.php

6 komentarzy:

  1. bardzo dobrze wytłumaczone lecz ja zmienił bym to bindValue(':login', $login, PDO::PARAM_STR); na $stmt->bindValue(':login', $_POST['login'], PDO::PARAM_STR);

    i jeszcze mam pytanie czy da się pominąć dodawani czasu? Uważam to za niepotrzebne a kompletnie nie wiem jak to zrobić.

    OdpowiedzUsuń
    Odpowiedzi
    1. Nope, celowo dałem tu zmienną, a nie tablicę z $_POST w przykładzie, bo 1) czytelniej to wygląda, 2) nigdy nie umieszcza się danych bezpośrednio z formularza, tylko przecież wcześniej odpowiednio je filtruje (przestrzegam przed czymś takim jak przed ogniem - najpierw filtrujemy WSZYSTKO to co leci od użytkownika, dopiero potem dodajemy do bazy. Nie może tu pozostać ani jedna zmienna bez filtrowania. Odnośnie dodawania czasu - nie rozumiem za bardzo pytania, jasne, że można powinąć, dałem przecież tylko przykładowe pola w bazie. Tak na marginesie jednak - z doświadczeniem przyjdzie wiedza, że jednak podawanie czasu dodania i aktualizacji potrzebne dość często jednak jest :)

      Usuń
    2. Bardzo fajnie wytłumaczone, super blog - naprawdę masz talent do przekazywania wiedzy w prosty i zrozumiały sposób, bez niepotrzebnej wydumanej na siłę "nomenklatury". Oczywiście i taka jest potrzebna - ale z umiarem, ma być dodatkiem do treści a nie treścią samą w sobie, co niestety w wielu miejscach właśnie występuje. ;)

      Co do wyżej danego przykładu - muszę zgodzić się z Twoim przedmówcą. A tylko dlatego, że przypisanie zmiennej POST do zmiennej pośredniej nie waliduje samej treści przepisanej.
      Walidacja w sumie odbywa się dopiero przy bindzie jej dla zapytania - bo tam się faktycznie definiuje jej typ.

      Natomiast gdyby faktycznie w momencie przepisania treści z tablicy POST do zmiennej - zrzutować dane. To wtedy zgoda - Twoja teza jest jak najbardziej słuszna. ;)

      No i pasowało by jakiś if czy POST istnieje i posada naszą wartość, potem rzutowanie i potem bind i w zapytanie. ;)

      Ale wiadomo, że nie o to chodzi w tym przykładzie i sam nie tego się tyczy.
      Więc to takie moje czepianie się z sympatii. ;)

      Usuń
    3. Php Majster: [Php][Pdo] Podstawy Cz.4 - Dodawanie, Edycja I Usuwanie Rekordów >>>>> Download Now

      >>>>> Download Full

      Php Majster: [Php][Pdo] Podstawy Cz.4 - Dodawanie, Edycja I Usuwanie Rekordów >>>>> Download LINK

      >>>>> Download Now

      Php Majster: [Php][Pdo] Podstawy Cz.4 - Dodawanie, Edycja I Usuwanie Rekordów >>>>> Download Full

      >>>>> Download LINK Tf

      Usuń
  2. Musi być $stmt->bindValue(...);, bo inaczej będzie komunikat "Fatal error: Uncaught Error: Call to undefined function bindValue()".

    OdpowiedzUsuń
  3. Php Majster: [Php][Pdo] Podstawy Cz.4 - Dodawanie, Edycja I Usuwanie Rekordów >>>>> Download Now

    >>>>> Download Full

    Php Majster: [Php][Pdo] Podstawy Cz.4 - Dodawanie, Edycja I Usuwanie Rekordów >>>>> Download LINK

    >>>>> Download Now

    Php Majster: [Php][Pdo] Podstawy Cz.4 - Dodawanie, Edycja I Usuwanie Rekordów >>>>> Download Full

    >>>>> Download LINK

    OdpowiedzUsuń

Masz sugestię? Znalazłeś błąd? Napisz komentarz! :)

webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji