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]
[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
bardzo dobrze wytłumaczone lecz ja zmienił bym to bindValue(':login', $login, PDO::PARAM_STR); na $stmt->bindValue(':login', $_POST['login'], PDO::PARAM_STR);
OdpowiedzUsuńi jeszcze mam pytanie czy da się pominąć dodawani czasu? Uważam to za niepotrzebne a kompletnie nie wiem jak to zrobić.
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ń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. ;)
Usuń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. ;)
Php Majster: [Php][Pdo] Podstawy Cz.4 - Dodawanie, Edycja I Usuwanie Rekordów >>>>> Download Now
Usuń>>>>> 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
Musi być $stmt->bindValue(...);, bo inaczej będzie komunikat "Fatal error: Uncaught Error: Call to undefined function bindValue()".
OdpowiedzUsuńPhp Majster: [Php][Pdo] Podstawy Cz.4 - Dodawanie, Edycja I Usuwanie Rekordów >>>>> Download Now
OdpowiedzUsuń>>>>> 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