[błąd] syntax error, unexpected $end w MySQL

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
tominnen
Nowy
Nowy
Posty: 37
Rejestracja: czw mar 01, 2007 10:44 pm

[błąd] syntax error, unexpected $end w MySQL

Post autor: tominnen »

Witajcie.
Mam problem: otóż z poziomu php (przez skrypt php) nie mogę dodac wpisów do mojej bazy danych. Po wykonaniu tego kodu:

Kod: Zaznacz cały

<?php
require "konfig.php";
$nick = $_POST['nick'];
$tresc = $_POST['tresc'];
$date=date("d-m-Y");
$hour=date("H:i");
if ($tresc=="") {
echo "Nie wpisano żadnego tekstu<br />[ <a href=javascript:history.go(-1)>popraw</a> ]";
die();
}
// odbieramy dane z formularza

if($nick and $tresc) {
    
    // łączymy się z bazą danych
  mysql_connect("$dbhost","$dbuser","$dbpass") or die(mysqlerror());
if (mysql_select_db("$dbname"))
 {
$query="INSERT INTO 'komentarze' ('nick','tresc', 'data', 'czas') VALUES ('$nick','$tresc','$data','$czas')";
$result=mysql_query($query);
echo "Dziękuję. Twój komentarz został dodany...<br />[ <a href=$url>pokaż wpisy</a> ]";
 }
else
 {
mysql_connect("$dbhost","$dbuser","$dbpass") or die(mysqlerror());
exit();
}
?>
wyskakuje mi błąd:
Parse error: syntax error, unexpected $end in /usr/local/apache/www/htdocs/pzw-wlodawa.com/inne/new_kom.php on line 32
pilk new_kom.php przentuje się następująco:

Kod: Zaznacz cały

<h1>komentarze:</h1>

<?php
require "konfig.php";
$nick = $_POST['nick'];
$tresc = $_POST['tresc'];
$date=date("d-m-Y");
$hour=date("H:i");
if ($tresc=="") {
echo "Nie wpisano żadnego tekstu<br />[ <a href=javascript:history.go(-1)>popraw</a> ]";
die();
}
// odbieramy dane z formularza

if($nick and $tresc) {
    
    // łączymy się z bazą danych
  mysql_connect("$dbhost","$dbuser","$dbpass") or die(mysqlerror());
if (mysql_select_db("$dbname"))
 {
$query="INSERT INTO 'komentarze' ('nick','tresc', 'data', 'czas') VALUES ('$nick','$tresc','$data','$czas')";
$result=mysql_query($query);
echo "Dziękuję. Twój komentarz został dodany...<br />[ <a href=$url>pokaż wpisy</a> ]";
 }
else
 {
mysql_connect("$dbhost","$dbuser","$dbpass") or die(mysqlerror());
exit();
}
?>
W czym jest problem??
Ostatnio zmieniony wt kwie 17, 2007 9:19 am przez tominnen, łącznie zmieniany 1 raz.
Hawk
Przelotem
Przelotem
Posty: 209
Rejestracja: ndz gru 22, 2002 9:34 pm

Re: [błąd] syntax error, unexpected $end w MySQL

Post autor: Hawk »

Coś mi się zapytania nie podobają; jest:

[sql]INSERT INTO 'komentarze' ('nick','tresc', 'data', 'czas') VALUES ('$nick','$tresc','$data','$czas')[/sql]

po mojemu powinno być:

[sql]INSERT INTO komentarze VALUES ('$nick','$tresc','$data','$czas')[/sql]

Tak przy okazji, moim zdaniem zamiast korzystać ze zmiennej $nick, równie dobrze możesz użyć $_POST["nick"] tym bardziej, że do tych dodatkowych zmiennych zbyt często się nie odwołujesz.

Co do tematu posta:

[php]
require "konfig.php";
$date = date("d-m-Y");
$hour = date("H:i");
if (!$_POST["tresc"]) {
echo "Nie wpisano żadnego tekstu<br />[ <a href=javascript:history.go(-1)>popraw</a> ]";
die();
}

//nie ma potrzeby sprawdzać zmiennej $_POST["tresc"] bo została sprawdzona wyżej
if($_POST["nick"]) {
mysql_connect("$dbhost","$dbuser","$dbpass") or die(mysqlerror());
if (mysql_select_db("$dbname")) {
$query = "INSERT INTO komentarze VALUES ('$_POST[nick]', '$_POST[tresc]', '$data', '$czas')";
$result = mysql_query($query);
echo "Dziękuję. Twój komentarz został dodany...<br />[ <a href=$url>pokaż wpisy</a> ]";
} else {
//podawanie nazwy użytkownika i hasła do niej na forum publicznym to mądry pomysł nie jest :-)
mysql_connect("sql.pzw-wlodawa.com", "[email protected]", "tomin25") or die(mysqlerror());
exit();
}
//tego brakowało
}
[/php]

Dobra rada - stosuj wcięcia w kodzie, unikniesz błędów powodowanych niezamknięciem jakiejś instrukcji.
Ostatnio zmieniony wt kwie 17, 2007 9:07 am przez Hawk, łącznie zmieniany 3 razy.
tominnen
Nowy
Nowy
Posty: 37
Rejestracja: czw mar 01, 2007 10:44 pm

Re: [błąd] syntax error, unexpected $end w MySQL

Post autor: tominnen »

zrobiłem tak jak mi napisałeś. Nic się nie zmieniło...
teraz kod jest taki:
[php]<?php

require "konfig.php";
$nick = $_POST['nick'];
$tresc = $_POST['tresc'];
$date=date("d-m-Y");
$hour=date("H:i");
if ($tresc=="") {
echo "Nie wpisano żadnego tekstu<br />[ <a href=javascript:history.go(-1)>popraw</a> ]";
die();
}
// odbieramy dane z formularza

if($nick and $tresc) {

// łączymy się z bazą danych
mysql_connect("$dbhost","$dbuser","$dbpass") or die(mysqlerror());
if (mysql_select_db("$dbname"))
{
$query=" INSERT INTO komentarze VALUES ('$nick','$tresc','$data','$czas')";
$result=mysql_query($query);
echo "Dziękuję. Twój komentarz został dodany...<br />[ <a href=$url>pokaż wpisy</a> ]";
}
else
{
mysql_connect("$dbhost","$dbuser","$dbpass") or die(mysqlerror());
exit();
}

?>[/php]

niestety ten sam błąd występuje. Odnoszę wrażenie, że jest to celowe działanie konfiguracji MySQL czy PHP na serwerze, na którym stoi strona. Jeszcze dziś napiszę do administratorów o wgląd w sprawę i podanie jakiejś solucji...
o hasła i uzytkowników nie boję się bo i tak w bazie nie ma żadnych wpisów a nie jest problemem zmiana hasła i użytkownika... podałem to jako przykład w tym adekwatnie problemie.
Ostatnio zmieniony wt kwie 17, 2007 9:16 am przez tominnen, łącznie zmieniany 2 razy.
Hawk
Przelotem
Przelotem
Posty: 209
Rejestracja: ndz gru 22, 2002 9:34 pm

Re: [błąd] syntax error, unexpected $end w MySQL

Post autor: Hawk »

Patrz mój pierwszy post i poprawiony kod.
123456
Zaczyna działać
Zaczyna działać
Posty: 514
Rejestracja: sob paź 28, 2006 1:19 pm

Re: [błąd] syntax error, unexpected $end w MySQL

Post autor: 123456 »

W kwestii formalnej wobec której nie sposób przejść obojętnie:
[php]<?php
mysqlerror() // taka funkcja nie istnieje w standardowej bibliotece pecl
mysql_error(); // poprawna wersja
?>[/php]
Inna kwestia: dane wprowadzane do bazy powinny być zabezpieczone, bo kod będzie sypać błędami kiedy np. w treści komentarza ktoś użyje znaków specjalnych, chociażby apostrofu.

Jeszcze jedno... jaki sens istnienia ma blok else w podanym kodzie?
[php]<?php
mysql_connect("$dbhost","$dbuser","$dbpass") or die(mysqlerror());

if(mysql_select_db("$dbname")) {

// dodanie danych

} else {

mysql_connect("$dbhost","$dbuser","$dbpass") or die(mysqlerror());
exit();

}
?>[/php]
tominnen
Nowy
Nowy
Posty: 37
Rejestracja: czw mar 01, 2007 10:44 pm

Re: [błąd] syntax error, unexpected $end w MySQL

Post autor: tominnen »

Oczywiście, że będzie zabezpieczony, to był tylko test, ponieważ jestem początkującym w PHP z MySQL i stąd takie moje "wynalazki".

Mam pytanie do Was: jaką mam wykorzystać funkcję php by do każdego postu dodana była data i czas jej wystawienia?
Teraz na przykładzie kodu w/w jest cos takiego: $date=date(d-m-Y), ale za nic nie chce jej wstawić do odpowiedniego pola w tabeli MySQl...

Pytanie nr 2:
jak pozbyć się autoindexu, ponieważ po każdym usuwaniu postów z odpowiednim numerem dodany nowy jest z numerem o 1 większym.
(np post nr 1 został wykasowany, nie istnieje, po dodaniu nowego postu treść jest już numerem 2, a powinno być 1)

Proszę o pomoc i wyrozumiałość.
123456
Zaczyna działać
Zaczyna działać
Posty: 514
Rejestracja: sob paź 28, 2006 1:19 pm

Re: [błąd] syntax error, unexpected $end w MySQL

Post autor: 123456 »

Mam pytanie do Was: jaką mam wykorzystać funkcję php by do każdego postu dodana była data i czas jej wystawienia?
Teraz na przykładzie kodu w/w jest cos takiego: $date=date(d-m-Y), ale za nic nie chce jej wstawić do odpowiedniego pola w tabeli MySQl...
Pola obsługujące datę w MySQL. Wystarczy, że obrócisz tą datę i już będzie zgodna ze standardem ISO a co za tym idzie będzie pasować do pola typu DATE.
jak pozbyć się autoindexu, ponieważ po każdym usuwaniu postów z odpowiednim numerem dodany nowy jest z numerem o 1 większym.
(np post nr 1 został wykasowany, nie istnieje, po dodaniu nowego postu treść jest już numerem 2, a powinno być 1)
Jesli chcesz zdjac inkrementację to wystarczy na nowo zdefiniowac pole. Cos takiego:
[sql] ALTER TABLE `nazwa_tabeli` CHANGE `nazwa_pola_do_zmiany` `nazwa_pola_po_zmianie` tutaj_typ_pola NOT NULL[/sql]
Usunięcie autoincrement nie wyjdzie Ci na dobre bo będziesz miał więcej "problemów" z wstawianiem danych. Najpierw będziesz musiał sprawdzić jakie są wolne numery, wybrać jakiś i dopiero wstawić dane. Jeśli potrzebujesz numeracji od jedynki to wystarczy, że będziesz zliczać rekordy przy pobieraniu danych.
HaWaJ
Nowy
Nowy
Posty: 159
Rejestracja: pt kwie 06, 2007 5:12 pm

Re: [błąd] syntax error, unexpected $end w MySQL

Post autor: HaWaJ »

ODP 2:
Wydaje mi sie ze w tym przypadku znaczenie ma tabela. Pokaz kod albo sprobuj zrobic:

[sql]
sqlite_query('CREATE TABLE nazwa (
id INTEGER PRIMARY KEY,
pozostale_dane......)');
[/sql]

I moze po usunieciu id wszystko bedzie dzialalo. Ale nie jestem pewien bo nie wiem jak wyglada kod :P
tominnen
Nowy
Nowy
Posty: 37
Rejestracja: czw mar 01, 2007 10:44 pm

Re: [błąd] syntax error, unexpected $end w MySQL

Post autor: tominnen »

Dobrze. Daty już się pojawiają, wstyd się przyznać, ale nie były widoczne tylko dlatego, że w [php]<?php
$query = "SELECT lp, nick, tresc, data, czas from komentarze";
?>[/php] brakowało zaznaczenia pól data i czas :)

Drogi 123456
Jeśli potrzebujesz numeracji od jedynki to wystarczy, że będziesz zliczać rekordy przy pobieraniu danych.
Czy mógłbyś mi napisać przykładowy kod do wykonania tej instrukcji?

Przykład działania moich wypocin:

http://www.pzw-wlodawa.com/index.php?id=gal1
123456
Zaczyna działać
Zaczyna działać
Posty: 514
Rejestracja: sob paź 28, 2006 1:19 pm

Re: [błąd] syntax error, unexpected $end w MySQL

Post autor: 123456 »

Bardzo przykładowy (bo nie wiem czy dobrze zrozumiałem):
[php]<?php
$query = "SELECT lp, nick, tresc, data, czas from komentarze";
$res = mysql_query($query);

if(!$res){

print mysql_error();

} else {

if(mysql_num_rows($res) != 0){

$cnt = 0;

while($qd=mysql_fetch_array($res))
{
$cnt++;
$html .= "<tr><td>$cnt</td>";
$html.= "<td>".$qd['nick']."</td>";
$html.= "<td>".$qd['tresc']."</td></tr>";
}

} else {

$html = 'Nie dodano jeszcze komentarza. Badz pierwszy!';

}
print $html;
}
/*
Wyświetli coś takiego:

| 1 | nick_001 | tresc_001 |
| 2 | nick_006 | tresc_006 |
| 3 | nick_003 | tresc_003 |
// itd.
*/
?>[/php]
tominnen
Nowy
Nowy
Posty: 37
Rejestracja: czw mar 01, 2007 10:44 pm

Re: [błąd] syntax error, unexpected $end w MySQL

Post autor: tominnen »

Dziękuję Tobie.
Wszak nie o to mi chodziło, ale minimalny efekt jaki miałem osiągnąć to go otrzymałem. Chciałbym się tylko dowiedzieć, czy mój skrypt przetwarzający został odpowiednio zabezpieczony przed złośliwym kodem.
Spróbujcie napisać jakiś taki kod w pola i odpiszcie czy skrypt jest dobrze chroniony.
Sam niestety nie znam sposobów na to :wink:

aha... jeszcze jedno: ile tablic może zawierać 1 baza MySQL?
123456
Zaczyna działać
Zaczyna działać
Posty: 514
Rejestracja: sob paź 28, 2006 1:19 pm

Re: [błąd] syntax error, unexpected $end w MySQL

Post autor: 123456 »

ha... jeszcze jedno: ile tablic może zawierać 1 baza MySQL?
To są tabele a nie tablice... Liczba tabel w jednej bazie zależy od systemu operacyjnego i wielkości dysku twardego... Przy składowaniu typu MyISAM można mieć tyle tabel ile można mieć plików w jednym folderze pod danym systemem. Przy składowaniu InnoDB chyba coś około 4mld.

EDIT:
czy mój skrypt przetwarzający został odpowiednio zabezpieczony przed złośliwym kodem
W jaki sposób obcinasz tag'i html'a?
tominnen
Nowy
Nowy
Posty: 37
Rejestracja: czw mar 01, 2007 10:44 pm

Re: [błąd] syntax error, unexpected $end w MySQL

Post autor: tominnen »

Przepraszam, za mylenie tabel z tablicami :wink:
Sprawdziłem w panelu administracyjnym i na moją bazę przydzielone jest 10MB danych, więc pewnie teoretycznie tyle będę mógł mieć tabel, aż do chwili wykorzystania zasobu (jeśli przyjąć, że te tabele nie będą nic zawierały ).

do obcięcia z tagów php i html zastosowałem funkcję str_replace np:

[php]<?php
$cenzura = array('słowa niecenzuralne', 'tagi html', 'tagi php' , ' inne')
$tresc = str_replace($cenzura, ' * ' ,$tresc);
?>[/php]
* może być czymkolwiek, nawet spacją (białym znakiem), brakiem znaku itp.

Czy to wystarczy do ochrony?
Ostatnio zmieniony wt kwie 17, 2007 7:42 pm przez tominnen, łącznie zmieniany 1 raz.
HaWaJ
Nowy
Nowy
Posty: 159
Rejestracja: pt kwie 06, 2007 5:12 pm

Re: [błąd] syntax error, unexpected $end w MySQL

Post autor: HaWaJ »

Ten skrypt tagi html tez bedzie zamienial w gwiazdki. lepiej zrobic tak:
[php]<?php
$cenzura = 'slowa';
$tagi_html = 'tagi';
$tagi_php = 'tagi';

$tresc = strtr($tresc,array($cenzura => '*',$tagi_html => ' ',$tagi_php => ''));
?>[/php]

moze jeszcze miedzy zmiennymi a strtr nałozyc explode np,

[php]<?php
$cenzura = explode(",",$cenzura);
?>[/php]

Ale nie wiem czy to jest koniecznie potrzebne

EDIT:
mozesz tez zdjac tagi htmla uzywajac funkcji
[php]<?php
strip_tags($tresc);
?>[/php]
lub tez jak chcesz miec niektore tagi dozwolone to piszesz:

[php]<?php
strip_tags($tresc,"[dozwolone tagi,np <b>]");
?>[/php]
Ostatnio zmieniony wt kwie 17, 2007 7:42 pm przez HaWaJ, łącznie zmieniany 1 raz.
tominnen
Nowy
Nowy
Posty: 37
Rejestracja: czw mar 01, 2007 10:44 pm

Re: [błąd] syntax error, unexpected $end w MySQL

Post autor: tominnen »

Ten skrypt tagi html tez bedzie zamienial w gwiazdki. lepiej zrobic tak:
tak pod warunkiem umieszczenia w apostrofie jakiś znaków, w moim przypadku niema nic między ' ' , nie ma nawet odstępu (białych znaków, spacji etc.) dlatego nic się nie wstawia w słowach ocenzurowanych.


Kurczę... dalej nie wiem co mam zrobić, aby w przypadku braku wpisów do tabeli widniała na stronie informacja komentarzy(0), a nie jak jest teraz komentarzy();
Ostatnio zmieniony wt kwie 17, 2007 7:52 pm przez tominnen, łącznie zmieniany 3 razy.
ODPOWIEDZ