[PHP/MYSQL] dodawanie, edycja, inna sesja

witam,

z php nie jestem dobry, jednak mam parę problemów co do mojej strony, otóż:

1 nius.php

<?php

 if(isSet($_SESSION['komunikat']))

  echo $_SESSION['komunikat'];

 else

  echo "Wprowadz nazwę użytkownika i hasło:";


// rozpoczęcie buforowania (jest to potrzebne by nie mieć błędów typu headers already sent)

ob_start();


// start sesji

session_start();


// jeśli user jest zalogowany

if($_SESSION['logged'])

{

     // wyświetlamy userowi jego dane

     echo '
Witaj '.$_SESSION['nick'].'! '; echo 'WYLOGUJ'; } // jeśli nie jest zalogowany else { echo 'Witaj!'; echo 'Zaloguj się'; } // koniec buforowania ob\_end\_flush(); ?\>[/code] Wprowadz nazwę użytkownika i hasło: [quote] Notice: Undefined index: logged in C:\xampp\htdocs\www\nius.php on line 92 [/quote] tj czepia się tego [code]if($\_SESSION['logged']) tu chyba chodzi o to, że mam tylko jeden plik, a robię dwie sesje, nie wiem jak to robić, by jak się jest zalogowanym pokazywało tą stronę, a gdy nie inną, bo nie wiem jakie mają być różnice. 2 logowanie
<?php

// rozpoczęcie buforowania (jest to potrzebne by nie mieć błędów typu headers already sent)

ob_start();


// start sesji

session_start();


// połączenie z mysql

mysql_connect('localhost', 'root', '')

    or die('Nieudane polaczenie z baza danych...');


// wybór bazy danych

mysql_select_db('gods')

    or die('Nie udalo sie wybrac bazy danych...');


// nagłówek

echo '

Logowanie

'; // sprawdzamy czy user jest już zalogowany if($\_SESSION['logged']) echo 'Już jestes zalogowany!'; else { // tworzymy prosty formularz echo ' Nick: Hasło: '; // jeśli zostanie naciśnięty przycisk "Zaloguj" if(isset($\_POST['ok'])) { $nick = trim($\_POST['nick']); $pass = trim($\_POST['pass']); // sprawdzamy czy wszystkie dane zostały podane if(empty($nick) || empty($pass)) echo 'Wpisz wszystkie pola!'; // jeśli tak... else { // filtrujemy dane $nick = strip\_tags( mysql\_real\_escape\_string( HTMLSpecialChars($nick))); $pass = strip\_tags( mysql\_real\_escape\_string( HTMLSpecialChars($pass))); // kodujemy hasło $pass = md5($pass); // sprawdzamy czy istnieje użytkownik z takim loginem i hasłem $result = mysql\_query("SELECT \* FROM users WHERE nick='$nick' AND pass='$pass'"); // jeśli nie istnieje if(mysql\_num\_rows($result)==0) echo 'Niestety podałes niepoprawne dane!'; // jeśli tak... else { // dodajemy wynik zapytania do tablicy $row = mysql\_fetch\_array($result); // ustawianie sesji że użytkownik jest zalogowany $\_SESSION['logged'] = true; // dodawanie do sesji id użytkownika, login $\_SESSION['id'] = $row['id']; $\_SESSION['nick'] = $row['nick']; // wyświetlenie komunikatu oznaczającego poprawne logowanie echo 'Zostałes poprawnie zalogowany! Możesz teraz przejsć na [stronę główna](nius.php)'; } } } } // rozłączenie z bazą danych mysql\_close(); // koniec buforowania ob\_end\_flush(); ?\>[/code] [quote] Notice: Undefined index: logged in C:\xampp\htdocs\www\login.php on line 64 [/quote] tj [code] if($\_SESSION['logged']) echo 'Już jestes zalogowany!'; tu też chyba o sesje jest problem? 3 Dodawanie rekordów
<?php echo '

Dodaj

'; $a = trim($\_REQUEST['a']); $id = trim($\_GET['id']); ?\> imie: opis: powiazanie: \<?php // odbieramy dane z formularza $imie = $\_POST['imie']; $opis = $\_POST['opis']; $powiazanie = $\_POST['powiazanie']; if($imie and $opis and $powiazanie) { // łączymy się z bazą danych $connection = @mysql\_connect('localhost', 'root', '') or die('Brak połączenia z serwerem MySQL'); $db = @mysql\_select\_db('gods', $connection) or die('Nie mogę połączyć się z bazą danych'); // dodajemy rekord do bazy $ins = @mysql\_query("INSERT INTO greccy SET imie='$imie', opis='$opis', powiazanie='$powiazanie'"); if($ins) echo 'Rekord został dodany poprawnie [stronę wcześniej](grecka.php)'; else echo "Błąd nie udało się dodać nowego rekordu"; mysql\_close($connection); } ?\>[/code] [quote] Notice: Undefined index: imie in C:\xampp\htdocs\www\add.php on line 62 Notice: Undefined index: opis in C:\xampp\htdocs\www\add.php on line 63 Notice: Undefined index: powiazanie in C:\xampp\htdocs\www\add.php on line 64 [/quote] tu dot. tego [code]$imie = $\_POST['imie']; $opis = $\_POST['opis']; $powiazanie = $\_POST['powiazanie']; nie mam pojęcia czemu. 4 edycja
<?php

// rozpoczęcie buforowania (jest to potrzebne by nie mieć błędów typu headers already sent)

ob_start();


// start sesji

session_start();


// połączenie z mysql

mysql_connect('localhost', 'root', '')

    or die('Nieudane polaczenie z baza danych...');


// wybór bazy danych

mysql_select_db('gods')

    or die('Nie udalo sie wybrac bazy danych...');


// nagłówek

echo '

Edycja

'; $a = trim($\_REQUEST['a']); $id = trim($\_GET['id']); mysql\_query('SET character\_set\_connection=utf8\_polish\_ci'); mysql\_query('SET character\_set\_imie=utf8\_polish\_ci'); mysql\_query('SET character\_set\_opis=utf8\_polish\_ci'); mysql\_query('SET character\_set\_powiazanie=utf8\_polish\_ci'); mysql\_query(' SET NAMES utf8 '); if($a == 'edit' and !empty($id)) { /\* zapytanie do tabeli \*/ $wynik = mysql\_query("SELECT \* FROM greccy WHERE id='$id'") or die('Błąd zapytania'); /\* wyświetlamy wyniki, sprawdzamy, czy zapytanie zwróciło wartość większą od 0 \*/ if(mysql\_num\_rows($wynik) \> 0) { /\* odczytujemy zawartość wiersza z tabeli \*/ $r = mysql\_fetch\_assoc($wynik); /\* wczytujemy dane do formularza \*/ /\* w formularz znajdują się ukryte pola "a" z wartością "save" i pole "id" z wartością zmiennej id \*/ echo ' imie: value="'.$r['imie'].'" /\> opis: value="'.$r['opis'].'" /\> powiazanie: value="'.$r['powiazanie'].'" /\> '; } } elseif($a == 'save') { /\* odbieramy zmienne z formularza \*/ $id = $\_POST['id']; $imie = trim($\_POST['imie']); $opis = trim($\_POST['opis']); $powiazanie = trim($\_POST['powiazanie']); /\* uaktualniamy tabelę greccy \*/ mysql\_query("UPDATE greccy SET imie='$imie', opis='$opis', powiazanie='$powiazanie' WHERE id='$id'") or die('Błąd zapytania'); echo 'Dane zostały zaktualizowane [wróć](grecka.php)'; } // rozłączenie z bazą danych mysql\_close(); // koniec buforowania ob\_end\_flush(); ?\>[/code] jeśli edytuje rekord z imieniem, które występuje w bazie danych to: [quote] Notice: Undefined index: id in C:\xampp\htdocs\www\edit.php on line 64 Błąd zapytania [/quote] czyli [code]$id = trim($\_GET['id']);

i do tego strona mi się rozjeżdża, natomiast gdy poprawie edytuję to:

czepia się tego samego.

trochę tego jest, ale bardzo ładnie proszę o pomoc i z góry dziękuję

Nie czytałem całości (EDIT: już przeczytałem :slight_smile: ), ale na początku w pierwszym pliku (nius) zauważyłem podstawowe błędy, a mianowicie złą kolejność wywoływania funkcji: najpierw wywołujemy ob_start(), potem możemy/musimy session_start() i dopiero wtedy możemy używać zmiennych sesyjnych z $_SESSION[] a także dopiero wtedy możemy coś wyświetlić na ekranie.

Ty najpierw odczytujesz coś z $_SESSION[], potem coś wyświetlasz, a dopiero na “końcu” włączasz obsługę sesji session_start().

W drugim pliku (logowanie) już kolejność masz dobrą.

Co do błędu, to jak odczytujesz z tablicy $_SESSION[] daną

if($_SESSION['logged'])

to wcześniej upewnij się, że istnieje, np tak:

if(isSet($_SESSION'logged']) && $_SESSION['logged'])

ewentualnie (krócej)

if(isSet($_SESSION'logged']))

A jak tego nie robisz i na “chama” zaglądasz do tej tablicy, to możesz otrzymać właśnie takie komunikaty:

Każde odwołanie do takiej tablicy (czy to SESSION, czy GET, POST) wymaga wpierw sprawdzenia, czy dana wartość jest ustawiona (funkcją isSet()) - dopiero potem (w tym samym if’ie) możesz dalej to sprawdzać i porównywać. I nie wiedzieć czemu (w 3 przykładzie) używasz aż 3 konstrukcji/tablic

$_REQUEST['a']

$_GET['id']

$_POST['ok']

Trochę poplątanie z pomieszaniem (jak POST i GET, to nie REQUEST - konsekwentny bądź). REQUEST zawiera obie “zsumowane” tablice GET i POST, ale nie zaleca się tego używać, bo “obcy” np. mogę coś “wstrzyknąć”.

w nius poprawiłem by pierw było

ob_start();

session_start();

$_SESSION[]

jednak nie rozumiem

if(isSet($_SESSION'logged']) && $_SESSION['logged'])

gdzie mam sprawdzić czy istnieje? co do

$_REQUEST['a']

$_GET['id']

$_POST['ok']

to jest trochę namieszane, ale mimo tych błędów się dodawało, a jak próbowałem, zmienić na GET i POST to nie mogę dodać rokordu :<

Przed odwołaniem się do elementu tablicy $_SESSION (a także $_GET i $_POST) wypada sprawdzić, czy dana wartość w ogóle tam występuje. Bo jeśli nie, to otrzymasz błąd (warning).

Przykład z ‘logged’ jest o tyle niefortunny, że nie ma znaczenia, jaką wartość masz w tablicy $_SESSION dla tego elementu (klucza), ważne jest tylko to, że coś jest ustawione (albo nie), dlatego zapis

if(isSet($_SESSION'logged'])

jest w tym wypadku trafniejszy. Ale dla kodu

$id = trim($_GET['id']);

taki zapis nie jest właściwy, bo może zmienna ‘id’ nie została przekazana w formularzu? Dlatego zaleca się używać np. takiego kodu

if (isSet($_GET['id']))

  $id = trim($_GET['id']);

else

  $id='';

który wyeliminuje problem braku wartości dla danego elementu.

Czy teraz już rozumiesz, dlaczego miałeś:

Po prostu tablica $_POST nie zawierała tych elementów, a Ty się przed tym nie zabezpieczyłeś.

EDIT: zazwyczaj nie trzeba sprawdzać, czy wszystkie elementy (pola formularza) są przekazane, bo jeśli formularz dobrze napisaliśmy i wysyła on dane, to jeśli jakąś daną dostaliśmy, pozostałe też zapewne są. To nie jest do końca bezpieczna metoda, ale nie przesadzajmy.

Zazwyczaj w kodzie PHP obsługującym formularz wykrywa się dwa stany:

  • brak przekazanych parametrów -> należy wyświetlić formularz;

  • parametry są przekazane - należy ja przetworzyć (i np. zapisać do bazy danych).