Hej,
Nie ma sensu kłamać, że jest zabezpieczony, i to kilka razy, bo nie jest, ty to wiesz, ja to wiem i wszyscy to wiedza .
Nie przejmuj się docinkami. Polscy programiści mają to do siebie, że zamiast się wspierać i pomagać słabszym, przeważnie odnoszą się z pogardą i dają to odczuć.
Przeważnie myślą, że są nie omylni i najlepsi, dokładnie tak jak na polscy kierowcy na drogach, wszyscy mistrzowie kierownicy, a efekt taki, że są dla siebie chamscy, innych wyłącznie krytykują i zabijają 4 tysiące ludzi rocznie.
Nikt nie zada sobie trudu, żeby coś ci wytłumaczyć, ma czas, aby wleźć na to forum, ale nie ma czasu aby wytłumaczyć, I z tego powodu postaram się wytłumaczyć jak najlepiej.
Więc do rzeczy
Kod nie jest zabezpieczony przez sql injections czyli wstrzykiwaniem w kod sql bo używasz bezpośrednio superglobalnej tablicy $_GET, i wątpię abyś wcześniej tą tablicę modyfikował
za dużo pisania o SQL Injections, więc to musisz wygooglać i doczytać, ale generalnie chodzi o to, że jeżeli do adresu URL twojej strony, która wykonuje to zapytanie dokleję jakiś kod to zepsuję zapytanie ( wystarczy aby zawierał znak " ) , co gorsza, mogę dokleić złośliwy kod i wykasować wszystkie twoje dane i usunąć tabele.
wyobraź sobie, że do zmiennej $_GET['wypozyczalna'] wpiszę taki test: "; $dowolne_zapytanie_sqlj.';' (cudzysłów na początku pierwsze zapytanie się nie wykona, be będzie wadliwe, drugie zapytanie po średniku się wykona, jeśli nie jest wadliwe, czyli, krótko mówiąc mogę wstrzyknąć dowolne zapytanie , które się wykona na twoim serwerze MySQL z wszystkimi tego konsekwencjami.
jeśli chodzi o błąd ( znalazłem , że po ostatniej wartosci wypozyczana'], brakuje zamknięcia cudzysłowy, ale zapewne tych błedów jest więcej
Taki styl tworzenia zapytań jest zły i musisz to poprawić. Przede wszystkim, jest bardzo mało czytelny i łatwo o pomyłkę.
Ja często jednak zapisuję zapytania w zmiennej, ale to nie jest absolutnie konieczne
Z tego przykładu i faktu, jak tworzysz zapytanie, wnioskuję, że nie znasz jeszcze PDO, Proponuję krok wstecz i opanuj to zapytanie używając mysqli a jak uda ci się wszystko zrobić i zrozumieć, wtedy zacznij używać PDO, to jest na prawdę trochę tak jakbyś, będąc świeżym kierowcą próbował prowadzić, jakieś droższe auto z funkcjami, których nie znasz.
używając zwykłego klienta mysql zapytanie zrobiłbym tak:
$mysqli->query(
'INSERT INTO ksiazka
(numer_ksiazki, tytul_ksiazki, id_autor_1, id_autor_2, id_autor_3, id_autor_4, wydawnictwo_ksiazki, rok_wydania_ksiazki, opis_ksiazki, gatunek_ksiazki, wypozyczalna )
VALUES (
"'.$mysqli->real_escape_string($nr).'",
"'.$mysqli->real_escape_string($tytul).'",
...
itd.
taki kod jest czytelny i łatwo znaleźć problem składniowy. W praktyce zapewne wygenerowałbym to zapytanie z tablicy, ale nie w tym rzecz, bo w praktyce nie użyłbym tego klienta, tak jak Kubica nie jeździłby fiatem seicento :)
W przyszłości być może będziesz tworzył bardzo skomplikowane zapytania, z podzapytaniami, wieloma ralacjami itp, przyzwyczajenie się do czytelnego formatowania kodu od samego początku jest bardzo ważne.
A najlepiej, abyś już na samym początku poczytał o standardach formatowania kodu PSR - gdyż wbrew pozorom to są bardzo proste standardy a są powszechne wśród profesjonalnych programistów i każdy, kto bez wyraźnego powodu ( np przepisy firmy ) ich nie używa nie może się nazwać profesjonalnym, albo może się nazwać profesjonalnym, ale bez zdolności pracy w teamie. bo pamiętaj, że PHP nie jest językiem kompilowanym i prędzej czy później ktoś twój kod może zobaczyć, chcieć poprawić itp. Zresztą ten fakt nie ma znaczenia, zasada obowiązuje we wszystkich językach. Jest to więc dobry pomysł, aby stosować te rzeczy od razu, bo to są bardzo proste reguły wymyślone przez mądrych i doświadczonych ludzi.
w przykładzie użyłem metody real_escape_string
służy ona do .. no właśnie nie wiem jak to się po polsku mówi, sanitize ( albo sanitise w zależności o wersji języka angielskiego ) , czyli czyszczenia, z brudu wartości zmiennej , czyli tak na prawdę modyfikuje wartość tekstową, aby była bezpieczna dla
polecenia sql. Ciekawe jest to , że to jest metoda $mysqli, a to dlatego , że owo czyszczenie jest zależne od serwera i jego ustawień , np typ kodowania znaków, Wiele bibliotek i programistów używa dodatkowego zabezpieczania ,w którym powyższa metoda jest tylko jednym z wielu elementów.
zwróć uwagę na to, że wciąż nie użyłem superglobalnej tablicy $_GET a zmiennych
jest tak dlatego, że w prawdziwym świecie z pewnością te zmienne musisz validować, czyli sprawdzić, czy ich wartości jest poprawne i spodziewane.
jeśli tak nie jest powinieneś przerwać wykonywanie kodu i wyświetlić jakąs informację.
np powinieneś sprawdzić czy wszystkie wartości wymagane są wypełnione
czy rok jest sensowny (Np czy ktos wpisal '-12332' albo co gorsza string itp,
po co zapisywac w bazie danych rekord, ktory być może nie powoduje błedu sql, ale i tak zawiera bzdury
taka walidacja powinna odbyc sie tuż przed wykonaniem zapytania, bez wzgledu na to ze wykonana byla w innych miejscach programu.
w tym kodzie zapewne jest jeszcze wiele wiecej do poprawienia, ale to nie jest temat twojego zapytania
jesli masz wiecej pytan pytaj, a jeśli ktos odnosi sie do ciebie z pogarda, to zawsze pisz , ze jestes poczatkujacy, liczyles na pomoc a nie pogarde, niektorym byc moze zrobi się glupio i ci pomogą
w tym wątku może 1 lub 2 osoby zadały sobie trud . komuś tam opadły ręce a inny doradził ci apostrof zamiast cudzysłowy
pozdrawiam
hk
on jest zabezpieczony tylko nie wiem gdzie w kodzie jest błąd
$result = $db->exec('INSERT INTO ksiazka (numer_ksiazki, tytul_ksiazki, id_autor_1, id_autor_2, id_autor_3, id_autor_4, wydawnictwo_ksiazki, rok_wydania_ksiazki, opis_ksiazki, gatunek_ksiazki, wypozyczalna ) VALUES ( "'.$_GET['nr'].'", "'.$_GET['tytul'].'", "'.$_GET['a1'].'", "'.$_GET['a2'].'", "'.$_GET['a3'].'", "'.$_GET['a4'].'", "'.$_GET['wydawnictwo'].'", "'.$_GET['rok'].'", "'.$_GET['uwagi'].'", "'.$_GET['gatunek'].'", "'.$_GET['wypozyczalna'].')');