saren_as
12.11.2008, 11:49:37
Witam! Mam takie cos:
<html>
<head>
<title>Prezenty2</title>
</head>
<body>
<?php
$hash = $_POST['hash'];
function generateHash()
{
return md5(time() * rand()); //samo time() nie wystarczy, gdyz jego wartosc zmienia sie co sekunde a to za malo }
// pobranie zmiennej globalnej czyj prezent ma byc dodany
$name_losujacy = $_GET['name_losujacy'];
//jesli byl wyslany formularz przechodzimy do obslugi danych
if(isset($_POST['wyslij'])) {
//Obrabiamy wszystkie zmienne przekazane metoda POST
foreach ($_POST AS $klucz => $wartosc)
{
$wartosc= trim($wartosc);//usuwamy biale znaki $_POST[$klucz]=$wartosc;
}
$name_gift=$_POST['name_gift'];
$link_gift=$_POST['link_gift'];
$blad_txt='';
$blad=false;
//sprawdzamy czy jest wypelnine pole nazwa prezentu
$blad_txt.='Podaj prawidlowa nazwe prezentu<br/>';
$blad=true;
}
if(!$blad)
{
if ( = $hash) // JAKI WARUNEK MAM TUTAJ WSTAWIC
{
echo "Dodano juz taki prezent"; }
else
{
//poprawne dane - robmy z nimi co trzeba (zapisujemy do bazy danych itp.)
include('connect.php');
// pobranie zmiennej w celu okreslenia nazwy prezentu oraz linku do niego
$name_gift = $_POST['name_gift'];
$link_gift = $_POST['link_gift'];
$hash = $_POST['hash'];
// wykonanie zapytania i dodanie nowego prezentu
$ADD = mysql_query ("INSERT INTO `prezenty` ( `user_name`, `name_gift`, `link_gift`, `hash`) " . "VALUES ('$name_losujacy', '$name_gift', '$link_gift', '$hash')")
}
}
else
{
//cos jest zle – wyswietlamy stosowne komunikaty
}
}
else
{
//wypelniamy zmienne pustymi danymi jesli formularz nie zostal jeszcze wyslany
$name_gift='';
$link_gift='';
}
//wyswietlamy formularz
?>
<form action="
<?php echo "$_SERVER[PHP_SELF]?name_losujacy=$name_losujacy"; ?>" method="POST">
<input type="hidden" name="name_losujacy" /><br />
<h2>Dodaj nowy prezent</h2>
<textarea name="name_gift" value="<?php '.$name_gift.' ?>" rows="4" cols="25">Podaj nazwe prezentu lub/i jego krotki opis...</textarea><br />
Tutaj mozez podac link do zdjecia lub aukcji z prezentem:<br />
<input type="text" size="120" name="link_gift" /><br />
<input type="submit" name="wyslij" value="Dodaj prezent"><br />
<input type="reset" value="Wyczysc" /><br /><br /><br />
<input type="hidden" id="hash" name="hash" value="
<?php echo generateHash
(); ?>" /><br />
</form>
<a href="swieta.html">Wroc do strony glownej</a><br/>
</body>
</html>
Problemem bylo to, ze po odswiezeniu strony dodawalo mi jeszcze raz te same dane do bazy. Teraz postepujac zdognie z podpowiedziami z tad
podobny temat (@nospor @be2k) stworzylem takie cos jak powyzej. Zamierzony cel osiagnalem w polowie, tzn po odswiezeniu strony dodaje mi sie jeszcze raz nowy rekord, ale z taka sama wartoscia `hash` Teraz tylko nie wiem jak mam zrobic ten warunek, aby jezeli `hash` = '$hash' dodanie do bazy nie zostalo wykonane. Prosze popatrzec na wiersz 43.
Dzieki za pomoc i pozdrawiam!
saren_as
saren_as
13.11.2008, 10:54:03
OKI poradzilem sobie z tym problemem wedlug zalecen @nospor i @be2k. Jedyne co mnie teraz zastanawia to jak zrobic, aby po dodaniu czegos do bazy danych strona zostala odswiezona i od razu pokazal mi sie nowo dodany wpis?
<html>
<head>
<title>Prezenty2</title>
</head>
<body>
<?php
// pobranie zmiennych globalnych
@$name_gift = $_POST['name_gift'];
@$link_gift = $_POST['link_gift'];
$name_losujacy = $_GET['name_losujacy'];
@$hash = $_POST['hash'];
include('connect.php');
// pobranie listy prezentow jednej osoby
$LISTA1 = mysql_query ("SELECT `_id`, `user_name`, `name_gift`, `link_gift` " . "FROM `prezenty` " .
"WHERE `user_name` = '$name_losujacy' " .
"ORDER BY `_id`")
$select_1 = '';
$Id = $row['_id'];
$name_gift = $row['name_gift'];
$link_gift = $row['link_gift'];
$select_1 .=<<<EOD
<tr>
<td><center>$Id</center></td>
<td><center>$name_losujacy</center></td>
<td><center>$name_gift</center></td>
<td><center><a href="$link_gift">link do zdjecia lub aukcji z prezentem</a></center></td>
<td>
<a title="Edytuj" href="edycja.php?edit=edytuj&Id=$Id&name_losujacy=$name_losujacy&name_gift=$name_gift&link_gift=$link_gift"><img border="0" alt="Edytuj" src="application_edit.png" /></a>
<a title="Usun" href="edycja.php?delete=usun&Id=$Id&name_losujacy=$name_losujacy"><img border="0" alt="Usun" src="application_delete.png" /></a></td>
</tr>
EOD;
}
/* table_start */
$table_start=<<<EOD
<h2><center>Lista prezentow</center></h2>
<table width="90%" border="1" cellpadding="2" cellspacing="2" align="center">
<tr>
<th width="10%">Numer prezentu</th>
<th width="10%">Imie</th>
<th width="45%">Nazwa prezentu</th>
<th> Link do prezentu</th>
<th width="10%">Opcje</th>
</tr>
EOD;
/* table_end */
$table_end =<<<EOD
</table>
EOD;
// funkcja zwracajaca losowo wybrany ciag znakow potrzebna do wygenerowania $hash
function generateHash()
{
return md5(time() * rand()); //samo time() nie wystarczy, gdyz jego wartosc zmienia sie co sekunde a to za malo }
//jesli byl wyslany formularz przechodzimy do obslugi danych
if(isset($_POST['wyslij'])){
//Obrabiamy wszystkie zmienne przekazane metoda POST
foreach ($_POST AS $klucz => $wartosc)
{
$wartosc= trim($wartosc);//usuwamy biale znaki $_POST[$klucz]=$wartosc;
}
$name_gift=$_POST['name_gift'];
$link_gift=$_POST['link_gift'];
$blad_txt='';
$blad=false;
//sprawdzamy czy jest wypelnine pole nazwa prezentu
$blad_txt.='Podaj prawidlowa nazwe prezentu<br/>';
$blad=true;
}
// DANE SA POPRAWNE WIEC MOZEMY JE ZAPISAC DO BAZY DANYCH
// jezeli zmienna $blad nieistnieje mozemy wykonywac skrypt dalej
if(!$blad)
{
include('connect.php');
// tutaj sprawdzam czy unikatowe zmienne $hash nie istnieja juz w bazie danych
//aby nie dopuscic do sytuacji, gdy odswiezymy strone, a formularz zostanie wyslany ponownie
$HASH = mysql_query ("SELECT `hash` AS `_hash` FROM `prezenty` ")
$_hash = $row['_hash'];
}
// oto wlasnie ten warunek ze jezeli zmienna pobrana z DB jest taka sama jaka otrzymalismy z formularza to skrypt dodania sie nie wykona
if ($_hash == $hash)
{
}
else
{
// wszystko jest ok...dane poprawne i nie jest to odswiezenie strony
include('connect.php');
// wykonanie zapytania i dodanie nowego prezentu
$ADD = mysql_query ("INSERT INTO `prezenty` ( `user_name`, `name_gift`, `link_gift`, `hash`) " . "VALUES ('$name_losujacy', '$name_gift', '$link_gift', '$hash')")
}
}
else
{
//cos jest zle – wyswietlamy stosowne komunikaty
}
}
else
{
//wypelniamy zmienne pustymi danymi jesli formularz nie zostal jeszcze wyslany
$name_gift='';
$link_gift='';
}
//wyswietlamy formularz
?>
<form action="
<?php echo "$_SERVER[PHP_SELF]?name_losujacy=$name_losujacy"; ?>" method="POST">
<input type="hidden" name="name_losujacy" /><br />
<h2>Dodaj nowy prezent</h2>
<textarea name="name_gift" value="<?php '.$name_gift.' ?>" rows="4" cols="25">Podaj nazwe prezentu lub/i jego krotki opis...</textarea><br />
Tutaj mozez podac link do zdjecia lub aukcji z prezentem:<br />
<input type="text" size="120" name="link_gift" /><br />
<input type="submit" name="wyslij" value="Dodaj prezent"><br />
<input type="reset" value="Wyczysc" /><br /><br /><br />
<input type="hidden" id="hash" name="hash" value="
<?php echo generateHash
(); ?>" /><br />
</form>
<a href="swieta.html">Wroc do strony glownej</a><br/>
</body>
</html>
Lion_87
13.11.2008, 12:33:57
Możesz dodawać przed wyświetlaniem albo Refresh...
saren_as
13.11.2008, 13:42:11
Jak dodaje to przed wyswietlaniem to raz sie pojawia tabela z prezentami, a po odswiezeniu znika i wogole to jakos dziwnie dziala
Mozesz mi jakos dokladniej podpowiedziec co i jak z tym "wczesniej dodac a potem wyswietlic" Nie wiem, ale problemem moze byc to ze wszystko wykonuje sie na jednej i tej samej stronie (takze sprawdzenie czy w formularzu sa wprowadzone odpowiednie dane)
Ewentualnie co z tym refresh?
Lion_87
13.11.2008, 13:48:26
Po prostu zamień kolejność kod w którym wyświetlasz dane daj niżej niż ten w którym dodajesz.
LUB
Jezeli poprawnie dodano dane to w echo można Refresh dac
<META HTTP-EQUIV=Refresh CONTENT=\"1; URL=\">
saren_as
13.11.2008, 14:01:03
Cytat(Lion_87 @ 13.11.2008, 13:48:26 )

Po prostu zamień kolejność kod w którym wyświetlasz dane daj niżej niż ten w którym dodajesz.
LUB
Jezeli poprawnie dodano dane to w echo można Refresh dac
<META HTTP-EQUIV=Refresh CONTENT=\"1; URL=\">
Jak zamienilem kolejnosc to mi sie dziwne rzeczy robily. Wiersze od 8 do 61 wstawilem od wiersza 127 i nie dzialalo poprawnie. Wykorzystalem zatem druga opcje i dodalem refresh, ale teraz po nacisnieciu F5 dodaje mi kolejny raz wpis do bazy. Wczesniej sie tego pozbylem w linijce 66 i 112, ale teraz problem wrocil? Jakies pomysly?
Lion_87
13.11.2008, 14:23:38
To nie wiem.
1. Jeszcze zamiast REFRESH jest header.
2. Możesz zrobić dwa oddzielne pliki
3. Zamiast hash zapisywać usera z min dodania do bazy a potem sprawdzać czy w tej minucie dodał już ten user.
saren_as
13.11.2008, 14:59:47
Cytat(Lion_87 @ 13.11.2008, 14:23:38 )

To nie wiem.
1. Jeszcze zamiast REFRESH jest header.
2. Możesz zrobić dwa oddzielne pliki
3. Zamiast hash zapisywać usera z min dodania do bazy a potem sprawdzać czy w tej minucie dodał już ten user.
Ok dalem refresh i jakos dziala. Nie tak jak bym do konca chcial, ale chyba na jednym pliku nie dam rady zrobic lepiej. Chyba lepszym rozwiazaniem bylo by wykonanie tego na oddzielnych plikach, ale nie bardzo wiem, jak dokonac "podwojnego" przekierowania. Input jest na ta sama strone, aby skrypt przed wyslaniem sprawdzil poprawnosc danych, gdzie nastepnie wykonuje sie skrypt dodajacy dane do bazy. I jak teraz zrobic, zeby zamiast wykonywalo sie dodanie do db, przekierowalo mnie na strone, gdzie bedzie wlasnie ten skrypt?
PS.Dzieki @Lion_87 za pomoc i oczywiscie "pomogl"
Lion_87
13.11.2008, 15:08:01
Nie za bardzo wiem o co Ci chodzi ale może ustaw w formularzu action na inny plik?
saren_as
13.11.2008, 15:31:29
Ale ja chcem przed wyslaniem formularza sprawdzic poprawnosc danych, a jest to dokonywane w tym samym pliku. Spojrz wiersz 72-97.
W sumie napewno idzie to zrobic, ale ja jeszcze mam spore problemy z php wiec ciesze sie narazie z tego co mam;)
Bo w sumie mi chodzi, jak zrobic:
if ($warunek) {
// przekierowanie na inna strone gdzie bedzie wszystko wykonywane, ale zeby mi pobralo zmienne z inputa (np. dodanie do bazy danych)
}
Lion_87
13.11.2008, 15:55:50
przekierowanie czyli refresh?? tyle ze w url wpisujesz ścieżkę do pliku ale żeby zmienne przekazać to musiałbyś je do linku doczepić to jak już to prościej action do tego pliku zrobić i tam sprawdzać...
saren_as
13.11.2008, 16:02:46
Cytat(Lion_87 @ 13.11.2008, 15:55:50 )

przekierowanie czyli refresh?? tyle ze w url wpisujesz ścieżkę do pliku ale żeby zmienne przekazać to musiałbyś je do linku doczepić to jak już to prościej action do tego pliku zrobić i tam sprawdzać...
Masz racje, ze prosciej formularz zostawic pusty, a wszystko robic w innym pliku. Tak tez wyglada wczesniejszy moj skrypt, ale myslalem ze jednak tak bedzie lepiej ... ale sie mylilem
Poprostu jeszcze nie umiem wszystkiego przewidziec jak zaczynam cos robic. No i nie wiem czy jest lepiej rozbijac wszystko na kilka podstron czy lepiej jest w miare mozliwosci probowac wszystko wykonywac na jednym pliku. Potrzebuje jeszcze sporo godzin z php, ale mam nadzieje, ze cos z tego kiedys bedzie.
Dzieki jeszcze raz za pomoc i jak cos to sie tutaj do Was jeszcze napewno zglosze
Tylko jeszcze male pytanko. Czy moge uzyc
echo "<META HTTP-EQUIV=Refresh CONTENT=\"1; URL=\">";
takie cos w skrypcie php poza <head></head> ?
Pozdro!
erix
13.11.2008, 17:48:32
Cytat
takie cos w skrypcie php poza <head></head> ?
A co ma tu PHP do tego?
<meta /> ma być w
<head />. Spróbuj tego:
http://grizzlyweb.com/webmaster/javascripts/refresh.asp
saren_as
14.11.2008, 10:34:16
Cytat(erix @ 13.11.2008, 17:48:32 )

A co ma tu PHP do tego?
<meta /> ma być w
<head />. Spróbuj tego:
http://grizzlyweb.com/webmaster/javascripts/refresh.aspChodzi o to, ze ja, aby to u mnie dzialalo tak jak chcem, musialem zrobic tak:
// PATRZ TUTAJ ...
<html>
<head>
<title></title>
</head>
// ... PATRZ TUTAJ
<body>
<?php
if (@$_hash == $hash)
{
}
else
{
// wszystko jest ok...dane poprawne i nie jest to odswiezenie strony
// wykonanie zapytania i dodanie nowego prezentu
$ADD = mysql_query ("INSERT INTO `prezenty` ( `user_name`, `name_gift`, `link_gift`, `hash`) " . "VALUES ('$name_losujacy', '$name_gift', '$link_gift', '$hash')")
// PATRZ TUTAJ ...
echo "<META HTTP-EQUIV=Refresh CONTENT=\"1; URL=\">"; // ... PATRZ TUTAJ
}
}
else
{
//cos jest zle – wyswietlamy stosowne komunikaty
}
}
else
{
?>
i nie znajduje sie to w < /head> tylko w tresci kodu php. No i mi to dziala poprawnie, w ten sposob jak chcialem. No i wlasnie czy jest to dopuszczalne, a jak nie to jakie to niesie za soba skutki?
Pozdrawiam!
erix
14.11.2008, 13:52:32
Cytat
Chodzi o to, ze ja, aby to u mnie dzialalo tak jak chcem, musialem zrobic tak:
Nie musiałeś. Logikę aplikacji mogłeś zrealizować przed wypluciem dokumentu HTML i np. w jakiejś zmiennej przechowywać komunikat.
Cytat
No i wlasnie czy jest to dopuszczalne, a jak nie to jakie to niesie za soba skutki?
Teoretycznie, działa, ale jeśli chodzi o składnie, to specyfikacja mówi:
http://www.w3.org/TR/REC-html40/struct/global.html#h-7.4.4Chyba wyraźnie napisałem, nie?

Wszelkie operacje związane z wyszukiwaniem/wstawianiem/kasowaniem/parzeniem herbaty wykonuj PRZED wysłaniem jakiegokolwiek dokumentu HTML do użytkownika.
saren_as
14.11.2008, 14:02:43
[quote name='erix' post='536410' date='14.11.2008, 12:55:56 ']Nie musiałeś. Logikę aplikacji mogłeś zrealizować przed wypluciem dokumentu HTML i np. w jakiejś zmiennej przechowywać komunikat.[/quote]
Mozesz mi w skrocie wyjasnic na podstawie mojego kodu:
[codebox]
<html>
<head>
<title>Prezenty2</title>
</head>
<body>
<?php
// pobranie zmiennych globalnych
@$name_gift = $_POST['name_gift'];
@$link_gift = $_POST['link_gift'];
$name_losujacy = $_GET['name_losujacy'];
@$hash = $_POST['hash'];
include('connect.php');
// pobranie listy prezentow jednej osoby
$LISTA1 = mysql_query ("SELECT `_id`, `user_name`, `name_gift`, `link_gift` " . "FROM `prezenty` " .
"WHERE `user_name` = '$name_losujacy' " .
"ORDER BY `_id`")
$select_1 = '';
$Id = $row['_id'];
$name_gift = $row['name_gift'];
$link_gift = $row['link_gift'];
$select_1 .=<<<EOD
<tr>
<td><center>$Id</center></td>
<td><center>$name_losujacy</center></td>
<td><center>$name_gift</center></td>
<td><center><a href="$link_gift">link do zdjecia lub aukcji z prezentem</a></center></td>
<td>
<a title="Edytuj" href="edycja.php?edit=edytuj&Id=$Id&name_losujacy=$name_losujacy&name_gift=$name_gift&link_gift=$link_gift"><img border="0" alt="Edytuj" src="application_edit.png" /></a>
<a title="Usun" href="edycja.php?delete=usun&Id=$Id&name_losujacy=$name_losujacy"><img border="0" alt="Usun" src="application_delete.png" /></a></td>
</tr>
EOD;
}
/* table_start */
$table_start=<<<EOD
<h2><center>Lista prezentow</center></h2>
<table width="90%" border="1" cellpadding="2" cellspacing="2" align="center">
<tr>
<th width="10%">Numer prezentu</th>
<th width="10%">Imie</th>
<th width="45%">Nazwa prezentu</th>
<th> Link do prezentu</th>
<th width="10%">Opcje</th>
</tr>
EOD;
/* table_end */
$table_end =<<<EOD
</table>
EOD;
// funkcja zwracajaca losowo wybrany ciag znakow potrzebna do wygenerowania $hash
function generateHash()
{
return md5(time() * rand()); //samo time() nie wystarczy, gdyz jego wartosc zmienia sie co sekunde a to za malo }
//jesli byl wyslany formularz przechodzimy do obslugi danych
if(isset($_POST['wyslij'])){
//Obrabiamy wszystkie zmienne przekazane metoda POST
foreach ($_POST AS $klucz => $wartosc)
{
$wartosc= trim($wartosc);//usuwamy biale znaki $_POST[$klucz]=$wartosc;
}
$name_gift=$_POST['name_gift'];
$link_gift=$_POST['link_gift'];
$blad_txt='';
$blad=false;
//sprawdzamy czy jest wypelnine pole nazwa prezentu
$blad_txt.='Podaj prawidlowa nazwe prezentu<br/>';
$blad=true;
}
// DANE SA POPRAWNE WIEC MOZEMY JE ZAPISAC DO BAZY DANYCH
// jezeli zmienna $blad nieistnieje mozemy wykonywac skrypt dalej
if(!$blad)
{
include('connect.php');
// tutaj sprawdzam czy unikatowe zmienne $hash nie istnieja juz w bazie danych
//aby nie dopuscic do sytuacji, gdy odswiezymy strone, a formularz zostanie wyslany ponownie
$HASH = mysql_query ("SELECT `hash` AS `_hash` FROM `prezenty` ")
$_hash = $row['_hash'];
}
// oto wlasnie ten warunek ze jezeli zmienna pobrana z DB jest taka sama jaka otrzymalismy z formularza to skrypt dodania sie nie wykona
if (@$_hash == $hash)
{
}
else
{
// wszystko jest ok...dane poprawne i nie jest to odswiezenie strony
// wykonanie zapytania i dodanie nowego prezentu
$ADD = mysql_query ("INSERT INTO `prezenty` ( `user_name`, `name_gift`, `link_gift`, `hash`) " . "VALUES ('$name_losujacy', '$name_gift', '$link_gift', '$hash')")
echo "<META HTTP-EQUIV=Refresh CONTENT=\"1; URL=\">"; }
}
else
{
//cos jest zle – wyswietlamy stosowne komunikaty
}
}
else
{
//wypelniamy zmienne pustymi danymi jesli formularz nie zostal jeszcze wyslany
$name_gift='';
$link_gift='';
}
//wyswietlamy formularz
?>
<form action="
<?php echo "$_SERVER[PHP_SELF]?name_losujacy=$name_losujacy"; ?>" method="POST">
<input type="hidden" name="name_losujacy" /><br />
<h2>Dodaj nowy prezent</h2>
<textarea name="name_gift" value="<?php '.$name_gift.' ?>" rows="4" cols="25">Podaj nazwe prezentu lub/i jego krotki opis...</textarea><br />
Tutaj mozez podac link do zdjecia lub aukcji z prezentem:<br />
<input type="text" size="120" name="link_gift" /><br />
<input type="submit" name="wyslij" value="Dodaj prezent"><br />
<input type="reset" value="Wyczysc" /><br /><br /><br />
<input type="hidden" id="hash" name="hash" value="
<?php echo generateHash
(); ?>" /><br />
</form>
<a href="swieta.html">Wroc do strony glownej</a><br/>
</body>
</html>
Chyba wyraźnie napisałem, nie?
Wszelkie operacje związane z wyszukiwaniem/wstawianiem/kasowaniem/parzeniem herbaty wykonuj PRZED wysłaniem jakiegokolwiek dokumentu HTML do użytkownika.
[/quote]
Tak, wyraznie, ale problem w tym ze nie dla mnie

Rozumiem, ze chodzi o to, ze moglem wszystko zbudowac inaczej? Tak jak to jest teraz, to nie ma opcji, abym wstawil tego refresh w innym miejscu? Oki, bo nie chce Cie juz meczyc, ale dzieki za zainteresowanie! Moglem to w sumie tak zrobic, aby nie byl mi potrzebny i bylo by po problemie, ale chcialem sobie zrobic pod gorke, aby spotkac sie z nowymi problemami - dopiero sie ucze.
Pozdro!