Skocz do zawartości
Puchacz1

znów problem z bazą...

Rekomendowane odpowiedzi

Warning: session_start(): Cannot send session cookie - headers already sent in C:\usr\krasnal\www\PRZYKL~2\index.php on line 2Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at C:\usr\krasnal\www\PRZYKL~2\index.php:2) in C:\usr\krasnal\www\PRZYKL~2\index.php on line 2

wyjawcie mi o co chodzi. Chociażbym chciał sobie wyświetlić taki oto kod:

 

<?php echo('to ja') ?>
to zawsze nie działą. Dzisiaj bawiłem się trochę session_start(); i od tego się zaczęło. Teraz nie da się nawet zwykłego tekstu wyświetlić. Wyczytałem gdzieś, że może chodzić o spację przed skryptem ale spacji niet. Edytowane przez Puchacz1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

ob_start(); na początku powinno pomóc. Nie zapomnij jeszcze, przy jego użyciu, na końcu skryptu wklepać ob_end_flush(); albo ob_flush();.

 

Ale stawiam na to, że masz zapisany plik w czystym utf8 (nie utf8 bez BOM, inaczej zwane "ansi jako utf8"), co powoduje wysłanie paru bajtów z defaultu znajdujących się przed ciapkami <?php. W takim przypadku pomoże (jeżeli komuś nie spodoba się buforowanie wyjścia), zapisanie jako właśnie takie utf8 bez BOM.

 

<?php echo ( 'to ja') ?>
nie zadziała pewnie przez to, że nie masz średnika po nawiasie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Widocznie masz coś skopane w konfiguracji serwera. Kod:

<? echo 'hello'; ?>
powinien działać niezależnie od ustawień edytora.

 

Klepię identyczny kod w PSPad (zapis w UTF8, strona kodowa i nagłówki nie ustawione) i działa bez problemu.

 

session_start() powinno być przed drukowaniem czegokolwiek na ekran.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

ULISSES, spróbuj tego B-) :

utf.zip

 

Jeżeli jest wszystko w porządku z konfigiem, to powinno być ostrzeżenie.

Tak sobie jeszcze sprawdziłem z nudów tego ob_flush()... nie bangla, więc zostaje zmiana charsetu na "normalny".

Edytowane przez m4r

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Każdy normalny, z którym miałem do czynienia. To PSPad jest ułomny, bo chrzani, jak widać, kodowania i z utf8+BOM bez przyczyny robi ANSI przy zapisie. Przez to, zresztą, go nie używam- nie ma szans z plikami, na których działam na co dzień.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

<form action="index.php" mehtod="GET"><input type="text" name="nick" /> <textarea name="textarea"></textarea> <input type="submit" value="Wyslij" /></form><?php$nick = $_GET['nick'];$textarea = $_GET['textarea'];if(empty($nick)){  echo('Wpisz nazwe uzytkownika');}elseif(!is_readable('comments.txt')) {  echo('Nie moge odczytac pliku.');}else{  if (!empty($textarea) && file_exists('comments.txt'));  {    $open = fopen('comments.txt', 'r');    $read = fread($open, filesize('comments.txt'));    fclose($open);    $save = $read . $textarea;    file_put_contents('comments.txt', $save);    $open = fopen('comments.txt', 'r');    $read = fread($open, filesize('comments.txt'));    fclose($open);    echo($read);    }  else {    echo("Puste pole textarea, uzupelnij je");    }}?>

możecie mi powiedzieć dlaczego wywala błąd w miejscu ostatniego else?.

Edytowane przez Puchacz1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pomijając, że:

- formularzy nie wysyłamy przez GET, lecz przez POST

- masz literówkę w słowie "method"

 

to nie napisałeś treści błędu, a tutaj wróżek nie ma.

Edit:

Jak bym miał strzelać, to masz średnik po IF w linii 18.

Edytowane przez ULLISSES
przepuszczenie kodu przez serwer ;]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

m4r:

Wracając jeszcze do edytora, to UTF8 nie wymaga BOM, więc jest on ignorowany przy zapisie (domyślny zapis w PSPad ustawiony właśnie na UTF8). Jak widać lekcje odrobiłem ;]

 

Coś słabo ustawiony ten Krasnal/PHP, bo komunikat powinien być bardziej szczegółowy:

Parse error: syntax error, unexpected T_ELSE in D:\AppServ\www\test.php on line 30

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

dzięki za odpowiedzi. ULLISSES, jeśli wiesz jak zmienić działanie serwera tak aby wyświetlał bardziej szczegółowo błędy to byłbym wdzięczny :). Ewentualnie, powiedz co wpisać w google to sobie znajdę.

 

Powracając jednak, chciałem Was zapytać o kilka istotnych rzeczy.

 

1. Pisząc jakiś skrypt w którym wysyłam dane, zapisuje je w pliku txt a następnie wyświetlam jest problem ponieważ po odświeżeniu dane zapisują się jeszcze raz. Jak sobie tak odświeżam to ciągle się zapisuje to samo. Jak zlikwidować ten problem?. Dobrze byłoby gdybyś wskazali nazwy funkcji które mogą mi pomóc. Jakimś rozwiązaniem byłoby napisanie skryptu sprawdzającego czy w następnej linijce nie są zapisywane takie same dane jak w poprzedniej. Jest to jednak chyba trochę nie wygodne. Może da się to jakoś uprościć?.

 

2. includuje sobie w index.php skrypt komentarze.php. Działa on jednak dopiero po wejściu w podstronę (które nawiasem mówiąc także są tworzone przez skrypt). Co powinienem zrobić aby działało to od pierwszego wejścia. Gdyby potrzebny był kod, napiszcie pokaże.

Edytowane przez Puchacz1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

0. Sposób wyświetlania błędów jest specyficzny dla Krasnal Serv - zapewne jest to wina ustawień lub wersji PHP. Rzuciłem na szybko okiem do Sieci, ale nie znalazłem sposobu na przestawienie tego. Poszukaj/popytaj na stronie wsparcia Krasnala.

 

1. Pokaż kod. Przy odświeżeniu strony zapewne masz pytanie, czy przesłać dane jeszcze raz. Takich stron nie powinno się odświeżać.Możesz zablokować kolejny zapis przez cookies lub sesję.

 

2. Pokaż kod.

 

Poczytaj: PHP - Wikibooks, biblioteka wolnych podręczników

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ad. 1.

{// otwarcie plikuif(zapis do pliku zakończony sukcesem)  header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']); exit;// wyświetlenie zawartości pliku}
jak to mniej-więcej działa- zapisujesz przesłane dane do pliku, po zapisaniu skrypt wywołuje sam siebie jeszcze raz, ale już bez przesłania zmiennych _POST, _GET, _FILES (czy co tam jeszcze jest), co przy sprawdzaniu przesyłanych danych zablokuje ponowny zapis.

 

Ad. 2.

Pokaż kod.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

dzięki Panowie, rzeczywiście cookie rozwiązują sprawę :).

 

pytanie: mam tablicę w której jest kilka wartości/stringów. Czy da się wyszukać która to tablica (np. $tablica[10]) znając jej wartość czy string?.

 

przykład:

...

tablica[?] = gryzon

...

 

jak zabezpieczyć formularz przed wpisywaniem kodu, np php. Powinienem blokować wszystko po <?php. Wyrażenia regularne?, split() i zapisywanie bez <?php czy może jeszcze coś innego?.

Edytowane przez Puchacz1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wyobraź sobie, że masz 10 szuflad. Do jednej włożyłeś ładowarkę i teraz jej potrzebujesz? Jak ją odnajdziesz? Oczywiście musisz sprawdzić każdą szufladę.

 

Podobnie jest w programowaniu. Nie ma magicznych sposobów - niezależnie od tego, czy skorzystasz z gotowej funkcji, czy sam taką napiszesz, sprowadzi się to do sprawdzenia każdego elementu z osobna. Można użyć for (z exit), można użyć while lub do-while.

 

Najprościej jest chyba tak:

$i=0;while($tablica[$i]!='gryzon') { $i++; }if ($i!=0) echo 'szukane slowno znaduje się pod indeksem: '.$i;else echo 'szukane slowo nie zostalo odnalezione w tablicy';

Przypominam o linku z poprzedniego postu - jest tam wiele informacji, które przydają się w walce z kodem PHP.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

wiem, pamiętam o tym linku :). Jest bardzo przydatny jednak czasem czegoś po prostu nie potrafię znaleźć. Co do tych formularzy, czy takie wprowadzone dane są w stanie zaszkodzić stronie?. Na obecnym poziomie wiedzy nie jestem w stanie sobie tego wyobrazić. Gdy próbowałem w ten sposób wywołać echo nic się nie wyświetliło aczkolwiek była ona najpierw zapisana w pliku, następnie odczytana. Wygląda więc na to, że serwer jej nie wziął pod uwagę.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

pytanie: mam tablicę w której jest kilka wartości/stringów. Czy da się wyszukać która to tablica (np. $tablica[10]) znając jej wartość czy string?.

 

przykład:

...

tablica[?] = gryzon

...

 

PHP: array_search - Manual

//kod pisany z głowy i całkowicie nie testowany$in = array_search('gryzon',$tablica);echo "indeks: ".( $in !== false ? $in : 'nie znaleziony');

ULLISSES, Po co jechać z Krakowa do Warszawy przez Moskwę?

Poza tym... "if ($i!=0)" << a jak szukane będzie pod zerowym indeksem?

 

jak zabezpieczyć formularz przed wpisywaniem kodu, np php. Powinienem blokować wszystko po <?php. Wyrażenia regularne?, split() i zapisywanie bez <?php czy może jeszcze coś innego?.

 

strip_tags, htmlentities, stripslashes/addslashes, do sql mysql_real_escape_string.

Poczytaj trochę o tych funkcjach i im podobnych.

Regexpy zwykło się używać do filtrowania konkretnych danych- czy coś jest mailem, url-em, kodem pocztowym, peselem, nipem, datą urodzenia, walutą, etc. Można ofc filtrować całe stringi, ale przy istniejących już funkcjach stosuje się to raczej jako dodatkowy "ficzer", jeżeli chcesz np. wyłuskać jakiś konkretny atrybut w tagu (np. dodawać/wywalać/podmieniać rel="" w linku, ścieżki obrazków, etc.).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

zaczynam uczyć się mysqla, mam więc w bazie różne dane takie jak nick, hasło itd.. próbowałem napisać sobie skrypt który wyświetli je ale coś mi nie wychodzi. Właściwie to nic się nie wyświetla

 

$open = mysql_connect('127.0.0.1', 'root');
$get_nick = 'SELECT nick FROM nba WHERE nick = Puchacz';  
$get_passwd = 'SELECT haslo FROM nba WHERE haslo = qwerty';  
$get1 = mysql_query($get_nick);
$get2 = mysql_query($get_passwd);
mysql_close($open);
echo($get1.$get2);

Edytowane przez Puchacz1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Stringi należy podawać w cudzysłowie:

$get_nick = 'SELECT nick FROM nba WHERE nick = "Puchacz"';  $get_passwd = 'SELECT haslo FROM nba WHERE haslo = "qwerty"';
Edytowane przez luk1999

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

$get_nick = 'SELECT nick FROM nba WHERE nick = Puchacz';  $get_passwd = 'SELECT haslo FROM nba WHERE haslo = qwerty';
Takie zapytania są trochę bez sensu bo skoro znasz nick/hasło i podajesz je w klauzuli WHERE to po co je wykonywać? :)

W takich zapytaniach zwykle podaje się warunek na ID użytkownika. A żeby działało to tak jak kolega wyżej napisał.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie działa mimo tych zmian.

 

ale jak mam porównać login i hasło po id?. Musiałbym kazać użytkownikowi wpisywać je ręcznie...

bazę tworze tak:

$haslo = MD5('qwerty');
$connect = mysql_connect('127.0.0.1', 'root');
$dbname = 'users';
$query ='CREATE DATABASE '.$dbname;
mysql_query($query);
mysql_select_db('users');
$zapytanie = 'CREATE TABLE nba (id int NOT NULL AUTO_INCREMENT, nick char(30), imie char(30), nazwisko char(15), email char(25), haslo char(30), PRIMARY KEY(id))';
$zapytanie2 = "INSERT INTO `nba` (`id`, `nick`, `imie`, `nazwisko`, `email`, `haslo`) VALUES ('','Puchacz', 'Jakub', 'Puchała', 'niemam3@interia.pl', '".$haslo."')";
mysql_query($zapytanie);
mysql_query($zapytanie2);
mysql_close($connect);

Edytowane przez Puchacz1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Musisz użyć funkcji mysql_fetch_array albo mysql_fetch_row... mysql_query nie zwraca tego co oczekujesz a jedynie identyfikator wyniku do dalszego wykorzystania.

Korzystasz w ogóle z manuala? Wszystko tam jest ładnie opisane.

 

W Twoim przypadku byłoby jakoś tak:

$open = mysql_connect('127.0.0.1', 'root');$get_nick = "SELECT nick FROM nba WHERE nick = 'Puchacz'"; $get_passwd = "SELECT haslo FROM nba WHERE haslo = 'qwerty'"; $result = mysql_query($get_nick);$get1 = $mysql_fetch_row($result);$result = mysql_query($get_passwd);$get2 = $mysql_fetch_row($result);mysql_close($open);echo($get1[0].$get2[0]);
Edytowane przez borsuczy_król

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Sprawa pierwsza...

Do testowania zapytań dobra jest konsola mysql (cmd, potem przejdź do katalogu mysql/bin, odpal sql -{tutaj dodatkowe opcje- login usera mysql, hasło, etc}), ewentualnie phpmyadmin.

Zapytania w php wstawiaj już sprawdzone i najlepiej od razu podmieniaj sobie potrzebne wartości zmiennymi.

 

Sprawa druga...

Po co drzeć osobno nick, a osobno hasło, skoro rozumiem, że mają dotyczyć tej samej osoby (a więc tego samego wiersza tabeli w sql)?

$sql = "SELECT `nick`, `haslo` FROM `nba` WHERE `nick` = 'nick' AND `haslo` = 'haslo'";
Sprawa trzecia, na przyszłość...

Robienie takiego selecta, jak podałem odrobinę wyżej jest bezsensowne. Why?

Jeżeli już sprawdzisz, czy istnieje w bazie osoba z takim nickiem i hasłem, to przydałoby się w większości przypadków pobrać od razu dodatkowe dane (id, jakiś adres, etc...). W Twoim przypadku będziesz musiał wrzucić kolejne zapytanie, więc bez modów będziesz miał już ich trzy (select nick, select pass, select inne duperele), a można to załatwić ślicznie jednym:

$sql = "SELECT `nick`, `haslo`,{tutaj jakieś inne potrzebne kolumny z tabeli} FROM `nba` WHERE...
W wersji ultimate (:lol:) możesz nawet zrobić "SELECT * FROM...", o joinach i im podobnych nie wspominam.

 

I jeszcze jeden drobiazg. Jeśli:

$haslo = MD5('qwerty');
To nie znajdziesz go zapytaniem:

$get_passwd = 'SELECT haslo FROM nba WHERE haslo = "qwerty"';
$get_passwd = 'SELECT haslo FROM nba WHERE haslo = "'.md5('qwerty').'"';
Btw, wolę odwrotnie cudzysłowy:

$get_passwd = "SELECT `haslo` FROM `nba` WHERE `haslo` = 'qwerty'";
...bo można bez zbędnych kombinacji wstawiać pehapowe zmienne, albo wręcz pojechać z takim kwiatkiem (też się czasem przydaje):

$get_passwd = "SELECT `haslo` FROM `nba` WHERE `haslo` = '{$_POST['haslo']}'";

(...)

 

Zapomniałeś cudzysłowi przy stringach.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...