Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php], [mysql] Dodawanie rekordów do BD z poziomu strony, nie bangla
kurys
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 7.08.2012

Ostrzeżenie: (0%)
-----


Chcę zrobić proste zaplecze administracyjne tak żeby dodawać na stronie artykuły (rekordy do tabeli"artykuly") z poziomu strony a nie poprzez phpMyAdmin. Zrobiłem formularz w form.php, w którym wszystko będę dodawał:

  1.  
  2. <form method="post" action="admin.php">
  3. <div>
  4.  
  5. Tytuł <input type="text" name="tytul"/><br/>
  6. Kategoria <select name="kategoria">
  7. <option>Pierwsza</option>
  8. <option>Druga</option>
  9. </select><br/>
  10. Autor <select name="autor">
  11. <option>Chuck</option>
  12. <option>Norris</option>
  13. </select><br/>
  14. Data <input type="datetime" name="data" value="2012-MM-DD GG:MM:00"/><br/>
  15. Wstęp <textarea cols="20" rows="10" name="wstep" >
  16. <p style="text-align: justify;"><img style="margin-right: 2px; float: left;" src="images/news/OBRAZEK.jpg" /><strong>TEKST</strong></p></textarea><br/>
  17. Treść <textarea cols="20" rows="10" name="tresc">
  18. <p style="text-align: justify;">TEKST</p>
  19.  
  20. <p style="text-align: justify;">TEKST</p>
  21.  
  22. <p style="text-align: justify;">TEKST</p>
  23.  
  24. <p style="text-align: justify;">TEKST</p>
  25.  
  26. <p style="text-align: right;"><strong>Źródło: ZRODLO</strong></p>
  27. Główny <select name="glowny">
  28. </select><br/>
  29. </div>
  30. <input type="submit" value="Dodaj"/></form>


W pliku admin.php sprawdziłem czy wszystko poprawnie się wyświetla bez dodawania tego do bazy danych, przy poniższym kodzie jest wszystko okej:

  1.  
  2. <?php
  3.  
  4. echo "Podgląd newsa: </br><br/>";
  5. echo $_POST['tytul'], "<br/>";
  6. echo $_POST['wstep'], $_POST['tresc'], "<br/>";
  7. echo "Kategoria: ", $_POST['kategoria'], "<br/>";
  8. echo "Data: ", $_POST['data'], "<br/>";
  9. echo "Autor: ", $_POST['autor'], "<br/><br/>";
  10. if($_POST['glowny']==1) echo "News główny, zmień poprzedni";
  11. else echo "Keep calm, news dodany jako zwykły";
  12.  
  13. ?>
  14.  


Ale gdy chcę żeby teraz te dane dodało mi do BD, to zamiast pięknie się wczytać i dodać je, wywala mi błąd 500 i nic się nie wczytuje. Próbowałem to dodać na dwa sposoby (poniżej już bez tego wcześniejszego wyświetlania, same fragmenty z mysql):

Pierwszy z INSERT INTO tabela VALUES wartosci:

  1.  
  2. <?php
  3.  
  4. mysql_connect("localhost", "root", "root");
  5.  
  6. mysql_select_db("artykuly");
  7.  
  8. $zapytanie="INSERT INTO artykuly (tytul, kategoria, autor, data, wstep, tresc, glowny) VALUES ($_POST['tytul'], $_POST['kategoria'], $_POST['autor'],
  9. $_POST['data'], $_POST['wstep'], $_POST['tresc'], $_POST['glowny'])";
  10.  
  11. $wykonaj=mysql_query($zapytanie);
  12.  
  13. ?>


Oraz drugi wykorzystując INSERT INTO tabela SET wartosc1='a' wartosc2='b':

  1.  
  2. <?php
  3.  
  4. mysql_connect("localhost", "root", "root");
  5.  
  6. mysql_select_db("artykuly");
  7.  
  8. $zapytanie="INSERT INTO artykuly SET tytul='$_POST['tytul']', kategoria='$_POST['kategoria']', autor='$_POST['autor']', data='$_POST['data']',
  9. wstep='$_POST['wstep']', tresc='$_POST['tresc']', glowny='$_POST['glowny']' ";
  10.  
  11. $wykonaj=mysql_query($zapytanie);
  12.  
  13. ?>


Co jest nie tak? Może przeoczyłem jakiś nawias albo cudzysłów/apostrof, ale sprawdzałem to kilka razy. Próbowałem też dawać /" zamiast ', próbowałem bez apostrofów, ale nadal to samo...
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #2





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Nie możesz w ten sposób wstawiać zmiennych w zapytanie:

  1. $zapytanie="INSERT INTO artykuly (tytul, kategoria, autor, data, wstep, tresc, glowny) VALUES ($_POST['tytul'], $_POST['kategoria'], $_POST['autor'],
  2. $_POST['data'], $_POST['wstep'], $_POST['tresc'], $_POST['glowny'])";


Po pierwsze:
  1. INSERT INTO tabela (pole) VALES ('wartosc_pola')

zamykasz zmienne pomiędzy apostrofami

Po drugie:
  1. $tytul = $_POST['tytul'];


  1. $zapytanie="INSERT INTO artykuly (tytul, kategoria, autor, data, wstep, tresc, glowny) VALUES ('$tytul', '$kategoria')";


Lub jeśli nie chcesz przepisywać zmiennych zbuduj w ten sposób zapytanie:
  1. $zapytanie="INSERT INTO artykuly (tytul, kategoria, autor, data, wstep, tresc, glowny) VALUES ('".$_POST['tytul']."', '".$_POST['kategoria']."')";



Ten post edytował b4rt3kk 4.09.2012, 12:30:45
Go to the top of the page
+Quote Post
viking
post
Post #3





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Zobacz dokładnie dlaczego zwracany jest błąd 500. Serwer powinien podać w logach szczegółową informację. Tak to wróżenie z fusów. Możesz też od razu wywalić te wszystkie mysql_* i poczytać o PDO oraz SQL Injection.

Ten post edytował viking 4.09.2012, 12:29:34
Go to the top of the page
+Quote Post
kurys
post
Post #4





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 7.08.2012

Ostrzeżenie: (0%)
-----


b4rt3kk,

wielkie dzięki (IMG:style_emoticons/default/smile.gif) po samym dodaniu apostrofów czyli

  1. '$_POST('tytul')'


nadal było to samo, kiedy użyłem już samego '$tytul' to owszem, admin.php został i wszystko wyświetliło się poprawnie, ale nic nie zostało dodanego do bazy. Ta zmienna na pewno jest równa wartości z tablicy?

Co do ostatniego sposobu - działa perfecto!

viking, ten błąd jest chyba wywalany wtedy kiedy mam jakiś błąd w kodzie, bo już parę razy tak miałem, ale wolałem też i to dodać. W każdym razie przeglądarka wyświetla mi komunikat:

Cytat
Błąd HTTP 500 (Internal Server Error): Napotkano nieoczekiwaną sytuację przy próbie zrealizowania żądania przez serwer.
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #5





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Jeśli uprzednio nie dokonasz przepisania wartości z tablicy $_POST na zmienne, np. $tytul no to oczywiście będą one puste i nic nie wstawisz do bazy. (IMG:style_emoticons/default/smile.gif) Ja osobiście preferuje taki sposób, bo łatwo się pogubić w masie kropek i apostrofów.
Go to the top of the page
+Quote Post
peter13135
post
Post #6





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


Można bezpośrednio wrzucić element tablicy $_POST do zapytania, choćby tak :

  1. $q = 'SELECT * FROM `tabela` WHERE id=' . (int)$_POST['id']

albo tak :
  1. $q = "SELECT * FROM `tabela` WHERE id={$_POST['id']}"

Jednak drugi przypadek jest niezabezpieczony przed sqlInjection.

Na początek dobrym pomysłem może być użycie sprintf
  1. $q = sprintf( 'SELECT * FROM `tabela` WHERE id %d=', (int)$_POST['id'])
Go to the top of the page
+Quote Post
viking
post
Post #7





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Cytat(kurys @ 4.09.2012, 14:04:56 ) *
viking, ten błąd jest chyba wywalany wtedy kiedy mam jakiś błąd w kodzie, bo już parę razy tak miałem, ale wolałem też i to dodać. W każdym razie przeglądarka wyświetla mi komunikat:

To ja wiem. Tylko jeśli zajrzysz w logi serwera zobaczysz że będzie tam pewnie błąd składni near something. Musisz nauczyć się czytać błędy bo daleko nie pociągniesz w programowaniu. I zamiast polecanych tu udziwnień naprawdę zainteresuj się bindowaniem parametrów bo a) jest to bezpieczne, b) rozszerzenie mysql wyleci z przyszłych wersji PHP, c) jak uczyć się to porządnie. Aktualnie twój kod jest podatny na byle włamanie.
Go to the top of the page
+Quote Post
kurys
post
Post #8





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 7.08.2012

Ostrzeżenie: (0%)
-----


b4rt3kk,

no tak, ale dałem ciała z tym (IMG:style_emoticons/default/wink.gif) teraz to uzupełniłem:

  1. $tytul=$_POST['tytul'];
  2. $kategoria=$_POST['kategoria'];
  3. $autor=$_POST['autor'];
  4. $data=$_POST['data'];
  5. $wstep=$_POST['wstep'];
  6. $tresc=$_POST['tresc'];
  7. $glowny=$_POST['glowny'];


ale nadal jest tak samo, najwyżej potem jeszcze pogrzebię.

peter13135,

dzięki, ale moja obecna znajomość php jest właśnie na poziomie przedszkolnym i też niezbyt rozumiem skąd ` i nawiasy klamrowe, a tak w ciemno nie chcę kombinować. Kiedyś jeszcze do tego fragmentu wrócę jak znajdę chwilkę, kiedyś może być przydatny (IMG:style_emoticons/default/smile.gif)

viking,

dzięki za rady, o bindowaniu też poczytam. A w jaki sposób te logi sprawdzić?

Ten post edytował kurys 4.09.2012, 14:07:57
Go to the top of the page
+Quote Post
viking
post
Post #9





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


W zależności od tego gdzie zainstalowałeś serwer. Nic nie napisałeś więc ciężko powiedzieć. Pod linuksem standardowo szukaj w /var/log, pod win w ścieżce instalacji httpd-error.log czy coś takiego w folderze zapewne logs. Na początku skryptu daj:


Tworzenie potworów w stylu $a =$b; powtarzane x100 nie ma sensu bo tylko pamięć zapychasz. Albo poprawnie zamykaj stringi ', " albo \", \' albo jeszcze przykład ze sprintf z dokumentacji http://www.php.net/manual/en/function.mysql-query.php i obowiazkowo mysql_real_escape_string()
Go to the top of the page
+Quote Post
kurys
post
Post #10





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 7.08.2012

Ostrzeżenie: (0%)
-----


Ok, mam taki opis błędu:

Cytat
[:error] [pid 17992:tid 1060] [client ::1:36856] PHP Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING)


w linii 37, czyli:

  1. $zapytanie="INSERT INTO artykuly (tytul, kategoria, autor, data, wstep, tresc, glowny) VALUES ('$_POST['tytul']', '$_POST['kategoria']', '$_POST['autor']',


Tylko nie wiem dlaczego " nie powinno tam być...
Go to the top of the page
+Quote Post
viking
post
Post #11





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Przepisz to na:
  1. $query = sprintf("INSERT INTO artykuly (tytul, kategoria, autor, data, wstep, tresc, glowny) VALUES ('%s', '%s'.......);",
  2. mysql_real_escape_string($_POST['tytul']),
  3. mysql_real_escape_string($_POST['kategoria']),....);


Albo jeszcze lepiej w PDO:

  1. $sql = "INSERT INTO artykuly (tytul, kategoria, autor, data, wstep, tresc, glowny) VALUES(:tytul, :kategoria....)";
  2. $sth = $dbh->prepare($sql);
  3. $sth->bindParam(':tytul', $_POST['tytul'], PDO::PARAM_STR);
  4. $sth->bindParam(':kategoria', $_POST['kategoria'], PDO::PARAM_STR);


http://wwwgo.pl/article/10/php_data_object...luge_baz_danych
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.09.2025 - 01:51