Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP]Sprawdzenie autora, formularz, zalogowany
Forum PHP.pl > Forum > Przedszkole
Forti
Witam

Przyznam się, że nie wiem jak prawidłowo nazwać temat..

Mam formularz:

  1. <form method="post" action="">
  2. <input id="add_tytul" name="autor" size="40" maxlength="255">
  3. <br>
  4. <textarea id="add_tresc" name="tresc" rows="70" cols="100" value="Treść"></textarea>
  5. <br>
  6. <input type="submit" name="submit" value="Dodaj">
  7. </form>


I teraz próbuje napisać funkcje (staram się pisać w miare umiejętności jak najwięcej funkcji, by trzymać logike oddzielnie od htmla) która sprawdzi czy użytkownik jest zalogowany, jeżeli true to pole input autor powinno być nie aktywne a value jako login, natomiast jeżeli użytkownij jest nie zalogowany, to input aktywny, value puste i oczywiście warunek że pole musi zostać wypełnione.

Warunek na wypełnienie pola jest względnie prosty oczywiście

  1. if (!$_POST['autor']){
  2. echo 'Autor jest wymagany';
  3. exit();
  4. }


Funkcja jaką napisałem to:

  1. function autor($autor){
  2. if(user::isLogged()){
  3. $user = user::getData('', ''); // pobiera informacje o użytkowniku
  4. $autor = $user[login];
  5. }
  6. else {
  7. $autor = $_POST['autor']
  8. }


Czyli znowu bez fajerwerków, proste warunki. Jednak problem mam z wyłączeniem pola input 'autor'.

Staram się ominąć sytuacje:

  1. function autor($autor){
  2. if(user::isLogged()){
  3. $user = user::getData('', ''); // pobiera informacje o użytkowniku
  4. $autor = $user[login];
  5. <form method="post" action="">
  6. <input id="add_tytul" name="autor" size="40" maxlength="255" value="'.$autor.'" disabled>
  7. <br>
  8. <textarea id="add_tresc" name="tresc" rows="70" cols="100" value="Treść"></textarea>
  9. <br>
  10. <input type="submit" name="submit" value="Dodaj">
  11. </form>';
  12.  
  13. }
  14. else {
  15. $autor = $_POST['autor']
  16. <form method="post" action="">
  17. <input id="add_tytul" name="autor" size="40" maxlength="255" value="Twój nick">
  18. <br>
  19. <textarea id="add_tresc" name="tresc" rows="70" cols="100" value="Treść"></textarea>
  20. <br>
  21. <input type="submit" name="submit" value="Dodaj">
  22. </form>';
  23.  
  24. }


Przyznam się, że jestem samoukiem, uczę się głównie z manuala oraz analizuje skrypty pobierane z internetu, jednak nie spotkałem takiego problemu, który zapewne jest banalny.
nospor
Czemu IFem uzalezniasz generowanie calego FORMa? Przeciez interesuje cie TYLKO jedno pole, wiec IFem uzalezniaj generowanie tylko tego jednego pola a nie calego forma...
Forti
Mówimy o czymś takim?

  1. function autor($autor){
  2. if(user::isLogged()){
  3. $user = user::getData('', ''); // pobiera informacje o użytkowniku
  4. $autor = $user[login];
  5. <input id="add_tytul" name="autor" size="40" maxlength="255" value="'.$autor.'" disabled>
  6. ';
  7.  
  8. }
  9. else {
  10. $autor = $_POST['autor']
  11. <input id="add_tytul" name="autor" size="40" maxlength="255" value="Twój nick">
  12. ';
  13. }



Wlaśnie na trafiłem w internecie na pewne rozwiązanie i stworzyłem coś takiego:

  1. function author(){
  2. if(user::isLogged()){
  3. $user = user::getData('', '');
  4. $autor = $user[login];
  5. document.comment.autor.disabled=true;
  6. document.comment.autor.value="$user[login]";
  7. }
  8. else {
  9. $autor = $_POST['autor']
  10. document.comment.autor.disabled=false;
  11. document.comment.autor.value="Wpisz nick";
  12. }


nospor
Pierwszy kod: tak, wlasnie o czyms takim mowimy
Drugi kod: chyba coś ci sie pomylilo z js

ps: poza tym nie ma sensu robic pola input disabled... poprostu wywal inputa a w to miejsce wyswietlaj poprostu login i juz
Forti
Generalnie działa, jednak gdy pole input jest disabled to nie wysyła jego wartości do POST = nie dodaje rekordu do bazy. Mogę to inaczej obejść?

Wywalić input ok, tlyko problem taki potem mam, pokaże kod:

  1. if(isset($_POST['submit']))
  2. {
  3.  
  4.  
  5.  
  6.  
  7. $stmt = $baza -> prepare('INSERT INTO `comments` (`autor`, `data`, `tresc`, `art_id`) VALUES (
  8. :autor,
  9. :dtime,
  10. :tresc,
  11. :newsid)');
  12.  
  13. $stmt -> bindValue(':autor', $_POST['autor'], PDO::PARAM_STR);
  14. $stmt -> bindValue(':dtime', date('Y-m-d H:i:s'), PDO::PARAM_INT);
  15. $stmt -> bindValue(':tresc', $_POST['tresc'], PDO::PARAM_STR);
  16. $stmt -> bindValue(':newsid', $newsid, PDO::PARAM_STR);
  17.  
  18.  
  19. $ilosc = $stmt -> execute();
  20. if($ilosc > 0)
  21. {
  22. echo 'Dodano: '.$ilosc.' rekordow';
  23. echo "<b>Dzięki, news został dodany! Zostaniesz przekierowany za dwie sekundy";
  24. echo "<meta http-equiv=Refresh content=2;url=java script:self.history.back();\>";
  25. }
  26. else
  27. {
  28. echo 'Wystapil blad podczas dodawania rekordow!';
  29. }
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41. }
  42. else
  43. {
  44. echo'<br>
  45.  
  46. <h4>Dodaj komentarz</h4>
  47.  
  48.  
  49.  
  50. <form method="post" action="">';
  51. autor();
  52. <br>
  53. <textarea id="add_tresc" name="tresc" rows="70" cols="100" value="Treść"></textarea>
  54. <br>
  55. <input type="submit" name="submit" value="Dodaj">
  56. </form>';
  57.  
  58. }



Jak wysłać autora, jeżeli nie input. Mogę wstawić zmienna, zależną od tej funkcji, tylko nie mam pomysłu i tak jak to rozwiązać.
nospor
No i prawidlowo, ze nie wysyla.

W pierwszym kodzie dane z posta odbierales tak:
if(user::isLogged()){
$user = user::getData('', ''); // pobiera informacje o użytkowniku
$autor = $user[login];
}
else {
$autor = $_POST['autor']
}

I tej wersji masz sie trzymac.
Forti
No ok, tylko zależy mi na tym, że jak nie zalogowany to musi (ma możliwość) wpisać nick, jak zalogowany to wysyła login. Chce to zrobić najprostszą możliwą drogą, bez 10 warunków itp.

kod funkcji wygląda tak:

  1. function autor(){
  2. if(user::isLogged()){
  3. $user = user::getData('', '');
  4. $autor = $user[login];
  5. <input id="add_tytul" name="autor" size="40" maxlength="255" value="'.$autor.'" disabled>
  6. ';
  7.  
  8. }
  9. else {
  10. $autor = $_POST['autor'];
  11. <input id="add_tytul" name="autor" size="40" maxlength="255" value="Twój nick">
  12. ';
  13. }}



To:

  1. $stmt -> bindValue(':autor', $_POST['autor'], PDO::PARAM_STR);


zamieniłem na:

  1. $stmt -> bindValue(':autor', $autor, PDO::PARAM_STR);


Jednak nadal coś nie do końca działa. Spróbuje ustawić może global $autor? chociaż nie wydaje mi się.
nospor
Nie mozesz wierzyc danym, ktore wysyla uzytkownik... nawet jesli ustawissz pole na disabled czy hidden czy cokolwiek, to user moze je bez problemu spreparowac i ustawic wlasne dane. Dlatego tez, jak user jest zalogowany, to masz jego login brac z php, a nie z tego co wysle ci user w przegladarce.

Zas to ze nie dodaje ci sie teraz do bazy, to pewnie gdzies tracisz te zmienną $autor. Nie wiem gdzie, bo pokazujesz urywki kodu w zaden sposob ze sobą nie powiązane.

Jesli
$autor = $user[login];
i
$autor = $_POST['autor'];
generujesz w funkcji autor() to logiczne ze poza tą funkcją zmienna ta nie bedzie widoczna - to są podstawy zasięgu zmiennych w php
Forti
  1. function autor(){
  2. global $autor;
  3. if(user::isLogged()){
  4. $user = user::getData('', '');
  5. $autor = $user[login];
  6. <input id="add_tytul" name="autor" size="40" maxlength="255" value="'.$autor.'" disabled>
  7. ';
  8.  
  9. }
  10. else {
  11. $autor = $_POST['autor'];
  12. <input id="add_tytul" name="autor" size="40" maxlength="255" value="Twój nick">
  13. ';
  14. }}


Echo input gdy zalogowany wyświetlam tylko dla informacji użytkownika, że faktycznie jest on zalogowany i jaki będzie podpis.

Kod na stronie:

  1. if(isset($_POST['submit']))
  2. {
  3.  
  4.  
  5.  
  6.  
  7. $stmt = $baza -> prepare('INSERT INTO `comments` (`autor`, `data`, `tresc`, `art_id`) VALUES (
  8. :autor,
  9. :dtime,
  10. :tresc,
  11. :newsid)');
  12.  
  13. $stmt -> bindValue(':autor', $autor, PDO::PARAM_STR);
  14. $stmt -> bindValue(':dtime', date('Y-m-d H:i:s'), PDO::PARAM_INT);
  15. $stmt -> bindValue(':tresc', $_POST['tresc'], PDO::PARAM_STR);
  16. $stmt -> bindValue(':newsid', $newsid, PDO::PARAM_STR); // to jest zmienna ustalona szybciej, pobrana jako id wiadomości (obecny kod dodaje komentarz do ów wiadomości)
  17.  
  18.  
  19. $ilosc = $stmt -> execute();
  20. if($ilosc > 0)
  21. {
  22. echo 'Dodano: '.$ilosc.' rekordow';
  23. echo "<b>Dzięki, news został dodany! Zostaniesz przekierowany za dwie sekundy";
  24. echo "<meta http-equiv=Refresh content=2;url=java script:self.history.back();\>";
  25. }
  26. else
  27. {
  28. echo 'Wystapil blad podczas dodawania rekordow!';
  29. }
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41. }
  42. else
  43. {
  44. echo'<br>
  45.  
  46. <h4>Dodaj komentarz</h4>
  47.  
  48.  
  49.  
  50. <form method="post" action="">';
  51. autor();
  52. <br>
  53. <textarea id="add_tresc" name="tresc" rows="70" cols="100" value="Treść"></textarea>
  54. <br>
  55. <input type="submit" name="submit" value="Dodaj">
  56. </form>';
  57.  
  58. }



Jak inaczej przekazać tą zmienną, czy na prawdę jedynym rozwiązaniem jest wstawianie 'if' z tej funkcji w dokumencie? wówczas działa prawidłowo.
nospor
Cytat
Jak inaczej przekazać tą zmienną, czy na prawdę jedynym rozwiązaniem jest wstawianie 'if' z tej funkcji w dokumencie? wówczas działa prawidłowo.
A co w tym zlego, ze uzyjesz jeszcze raz Ifa?
Od biedy pozostaje ci global
Od innej biedy funkcja autor() moze zwracac zmienna $autor przez return a potem ty ją bedziesz odbierał
Forti
Teoretycznie nic złego. Praktycznie, to zaraz będę przerabiać swój strukturalny kod, gdyż zaczyna mi się rozrastać, na trochę obiektowy, na tyle na ile potrafię. To z czym mam problem teraz próbuje rozwiązać w celu edukacyjnym, ten przykład będzie wykorzystany może ze 2-3 razy na całej stronie, forum itp., ale np. zaraz będe chciał zrobić wyświetlenie krótkich informacji różnych rzeczach i zacznie mi się robić problem pewnie.

Coś takiego, ale nie działa, wyskakuje błąd, że nie dodało rekordu - nadal nie pobiera $autor.
Próbuje z global i return na różne spoboy i nie działa po prostu smile.gif

  1. function autor(){
  2.  
  3.  
  4. if(user::isLogged()){
  5. $user = user::getData('', '');
  6. $autor = $user[login];
  7. <input id="add_tytul" name="autor" size="40" maxlength="255" value="'.$autor.'" disabled>
  8. ';
  9.  
  10.  
  11. }
  12. else {
  13. $autor = $_POST['autor'];
  14. <input id="add_tytul" name="autor" size="40" maxlength="255" value="Twój nick">
  15. ';
  16. }
  17. return $autor;
  18. }
nospor
No juz pisalem, ze jesli funkcja bedzie zwracac $autor, to musisz wynik tej funkcji odebrac... Odbierasz? Jak nie, to zapraszam do manuala do dzialu funkcje.

edit: z innego kodu widze, ze funkcje autor() wywolujesz na zupelnie innym poziomie niz zapis do bazy, wiec to tak czy siak ci sie nie uda.... Musisz zrobic dodatkowego Ifa przed zapisem i juz.
Forti
Już widzę w czym jest problem. Musiałbym przerobić całą strukturę aby to działało tak jak chce. Wyciągnąłem troche nauki z tej lekcji, na przyszłość będę wiedział w czym problem. Zastosuje po prostu if bez zbędnych ceregieli. Dziękuje za pomoc.
nospor
$stmt -> bindValue(':dtime', date('Y-m-d H:i:s'), PDO::PARAM_INT);
A data to ci sie poprawnie dodaje? Przeciez wynikiem date() jest tekst a nie liczba smile.gif

$stmt -> bindValue(':newsid', $newsid, PDO::PARAM_STR)
zas newsid to raczej jest liczba nie tekst wink.gif
Forti
Z tego co pamiętam to tak, ale zmieniłem już w razie co, podziękował. Przy okazji, z tego co pamiętam to funkcja NOW() nie chciała mi działać.. nie pamiętam czemu smile.gif
nospor
Cytat
Przy okazji, z tego co pamiętam to funkcja NOW() nie chciała mi działać.. nie pamiętam czemu
Bo pewnie źle jej uzyles smile.gif Pokaz jak robiles, to ci powiemy czemu nie dzialala
Forti
Miałem: $stmt -> bindValue(':dtime', NOW(), PDO::PARAM_INT);

a pewnie powinienem mieć:

$data = NOW();
$stmt -> bindValue(':dtime', $data, PDO::PARAM_INT);

Chociaż to także chyba nie działało.. już nie pamiętam.


Jeszcze pytanie, jak stosować mysql_real_escape_string w PDO,


$stmt -> bindValue(':tresc', mysql_real_escape_string($_POST['tresc']), PDO::PARAM_STR);

To ma prawo działać?
nospor
NOW() to jest funkcja mysql i ma byc ona wywolywana w zapytaniu mysql a nie bindowana w php....
Turson
Cytat(Forti @ 13.06.2014, 10:47:19 ) *
Jeszcze pytanie, jak stosować mysql_real_escape_string w PDO,


$stmt -> bindValue(':tresc', mysql_real_escape_string($_POST['tresc']), PDO::PARAM_STR);

To ma prawo działać?

Pytanie, po co mysql_real_escape_string w PDO?
Forti
Gdzieś kiedyś znalazłem przykładowo skrypt (nie pamiętam składni), który robił prostą rzecz - za każdym razem wyświetlał okno którego nie można było zamknąć.
Wystarczyło wpisać go gdzieś w pole input, np. nazwa użytkownika przy rejestracji, i jak kod nie sprawdzał kodu pod tym względem to po prostu strona się sypała..

Albo wstawi mi ktoś div o szerokości 1000px w i zostanie to wyświetlone gdzieś gdzie akurat nie mam stałem szerokości ustalonej - zacznie się sypać.

Czy źle kombinuje?


Chociaż w sumie klasa bbcode fajnie rozwiązuje problem z html.. a co z javascript?
Turson
Nie potrafię tego zrozumieć. Że okno wpisywało się gdzieś w input, kod sprawdza kod?
nospor
Ale co? To po to wlasnie chciales uzyc mysql_escape_string?? To przeciez nie do tego sluzy.... To sluzy do bezblednego wstawiania danych do bazy. I uzywajac PDO masz juz tego nie uzywac, bo PDO samo tego pilnuje.

Zas to co opisales to jest atak XSS. zeby sie przed nim zabezpieczeac to
albo filtrowac dane i sprawdzac czy pole zawiera dozwolone znaki czy nie
albo uzywac np. htmlspecialchars przed wyswietleniem danych, by zapobiec wykonaniu jakiegos kodu HTML, js ,css
Forti



Czyli htmlspecialchars, oki. http://forum.php.pl/lofiversion/index.php/t115269.html <- ta klasa rozwiązuje troche ten problem, a tam gdzie jej nie mam to musze htmlspecialchars, będe pamiętać smile.gif
nospor
$autor = 'Twój nick'
$autor == 'Twój nick'
Odrozniaj PRZYPISANIE od POROWNANIA....
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.