Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php], [mysql] Dodawanie rekordów do BD z poziomu strony, nie bangla
Forum PHP.pl > Forum > Przedszkole
kurys
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...
b4rt3kk
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']."')";

viking
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.
kurys
b4rt3kk,

wielkie dzięki 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.
b4rt3kk
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. smile.gif Ja osobiście preferuje taki sposób, bo łatwo się pogubić w masie kropek i apostrofów.
peter13135
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'])
viking
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.
kurys
b4rt3kk,

no tak, ale dałem ciała z tym 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 smile.gif

viking,

dzięki za rady, o bindowaniu też poczytam. A w jaki sposób te logi sprawdzić?
viking
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()
kurys
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ć...
viking
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.