Gzie jest błąd składniowy?

0

mam taką funkcję w php

  $result = $dbh->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['login'].'", "'.$_GET['a1'].'", "'.$_GET['a2'].'", "'.$_GET['a3'].'", "'.$_GET['a4'].'", "'.$_GET['wydawnictwo'].'", "'.$_GET['rok'].'", "'.$_GET['uwagi'].'", "'.$_GET['gatunek'].'", "'.$_GET['wypozyczalna'].')');

I mam taki komunikat

Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"1)' at line 1 in C:\xampp\htdocs\bib\a.php:28 Stack trace: #0 C:\xampp\htdocs\bib\a.php(28): PDO->exec('INSERT INTO ksi...') #1 {main} thrown in C:\xampp\htdocs\bib\a.php on line 28
0
$_GET['nr'].'" "'.$_GET['login'].'"

Tutaj brakuje ci przecinka.

0

nadal taki komunikat
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"1)' at line 1 in C:\xampp\htdocs\bib\a.php:28 Stack trace: #0 C:\xampp\htdocs\bib\a.php(28): PDO->exec('INSERT INTO ksi...') #1 {main} thrown in C:\xampp\htdocs\bib\a.php on line 28

kod po poprawie
$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'].')');

1

Wrzuć ten kod w normalne IDE i od razu będziesz widział co jest nie tak . Poza tym naucz się być skrupulatnym i jak otwierasz cudzysłów/apostrof/nawias to od razu go domykaj i dopiero wtedy pakuj swoje treści do środka

0

?? IDE ??

0

Czego tu brakuje?

, "'.$_GET['wypozyczalna'].')'

IDE https://pl.wikipedia.org/wiki/Zintegrowane_środowisko_programistyczne

2

GETem SQL składasz? Odważnyś...
A brakuje ci apostrofu po ostatnim polu.
Pytanie za 100 pkt. Co zrobisz jak będziesz mieć 5 autorów?

0

mam zrobić program gdzie będą tylko max. 4 autorów reszta w uwagach/opis i z apostofami jest dobrze na końcu

0

Opad rąk.....

Twój kod jest podatny na atak typu SQL Injection:

https://pl.wikipedia.org/wiki/SQL_injection

Generalnie to poczytaj o bezpieczeństwie, zanim zrobisz sobie krzywdę, to jak poznanie podstaw BHP.

0

o to się nie martw tam jest ten kod filtrowany wcześniej kilka razy

0

Ja się nie martwię, to Ty powinieneś się martwić :)

0

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'].')');

4

Patrz, używasz PDO i go nie wykorzystujesz, masz ewidentnie problem z klejeniem stringów w poprawne zapytanie, ale warto użyc prepare, choćby dla przejrzystości zapisów skoro SQLi się nie przejmujesz:

$sql = "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 (: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)";
                                          
$stmt = $dbh->prepare($sql);
                                              
$stmt->bindParam(':numer_ksiazki', $_GET['nr'], PDO::PARAM_STR);       
$stmt->bindParam(':tytul_ksiazki', $_GET['tytul'], PDO::PARAM_STR);       
$stmt->bindParam(':id_autor_1', $_GET['a1'], PDO::PARAM_STR);       
$stmt->bindParam(':id_autor_2', $_GET['a2'], PDO::PARAM_STR);       
$stmt->bindParam(':id_autor_3', $_GET['a3'], PDO::PARAM_STR);       
$stmt->bindParam(':id_autor_4', $_GET['a4'], PDO::PARAM_STR);       
$stmt->bindParam(':wydawnictwo_ksiazki', $_GET['wydawnictwo'], PDO::PARAM_STR);       
$stmt->bindParam(':rok_wydania_ksiazki', $_GET['rok'], PDO::PARAM_STR);       
$stmt->bindParam(':opis_ksiazki', $_GET['uwagi'], PDO::PARAM_STR);       
$stmt->bindParam(':gatunek_ksiazki', $_GET['gatunek'], PDO::PARAM_STR);       
$stmt->bindParam(':wypozyczalna', $_POST['wypozyczalnia'], PDO::PARAM_STR); 
$stmt->execute(); 

http://php.net/manual/en/pdo.prepare.php

1

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'].')');

0

ogólnie odnosząc się do tego część danych jest sprawdzana kodem i przesyłana postem ale wszystko jest getem bo jest mi prosto to wyciągnąć w aplikacji którą do tego piszę i do JavaScripta bo to jest w adresie i nie muszę się męczyć do przenoszenia danych z php do JS i tam jest bo trochę podstawowego doświadczenia mam w tych skrypty są częściowo nie uruchamiane na komputerze tylko na serwerze (ja więcej umie w PHP jako pliki wykonawcze w serwerze niż na przeglądarki i pracowałem tylko na 5.5 a teraz przenoszę się na php 7.x),** i dzięki za wytłumaczenie :)**

1 użytkowników online, w tym zalogowanych: 0, gości: 1