Tutorials PHP

Porcjowanie zapytań w bazie textowej (1,2,3,4,5,6 itd...)
Wyświetlanie danych z bazy dbf na stronie (dBase)
Porcjowanie zapytań w MySQL cz.1
Jak wysłać maila w formacie html
Porcjowanie wyników zapytania w bazie tekstowej
Jak usunąć tagi html-a ze zmiennej?
Przesyłanie danych w parametrach linku / (urlencode() i urldecode() /
Jak uruchomić obsługę gifów i nie tylko...
Zmiana wielkości liter
Samoobsługowa tablica ogłoszeń
Tablice - część druga - sortowanie danych
Tablice - część pierwsza
Informacje o aktualizacji pliku
Jak wyszukiwać w bazach tekstowych
Przechowywanie informacji w cookies
Przykład formularza w php
Upload plików
Jak wprowadzać dane aby mieć możliwość późniejszej edycji
Usuwanie slasha
Jak działa licznik kliknięć
Data na stronie
Licznik tekstowy
Zapis do pliku
Jak wczytać do strony dane z innych plików
Wszystkie strony w jednej
Pobieranie informacji o odwiedzających
Hasło sieciowe
Rozsyłanie wiadomości z listy mailowej


.: Porcjowanie zapytań w bazie textowej (1,2,3,4,5,6 itd...) :.
Zalóżmy że w pliku "plik.txt" mamy wprowadzone dane o właścicielach
adresów e-mail np. w ten sposób:

email||imie||\n

gdzie email to adres email
\n to znak podziału wiersza
|| to operatory

utwórz plik adresy.phtml

<?
//ile pozycji na stronie ma zostać wyświetlonych
$max_poz="20";

//jeśli wchodzimy bez parametru pierwsza strona
//ustawia się jako pierwsza i pętla startuje od cyfry 0
if($page==""){
$page="1";
$start="0";
}
else{
//jeśli nie określamy start pętli w/g strony
$start=$page*$max_poz;
$start=$start-$max_poz;
}

$file = file("plik.txt");
for ($index=$start; $index < $page*$max_poz; $index++)
{
$gr = split("\|", chop($file[$index]));
$zz = explode("||", $file[$index]);

//wyświetlamy dane
echo"<a href=mailto:$zz[1]>$zz[0]</a><br>";
}
?>

a teraz weźmiemy się za generowanie linków 1, 2, 3, 4 itd....

<?
//zliczamy ilość lini
$el=count($file);
//obliczamy ilość stron dzieląc ilość lini przez maksymalną
//liczbę danych wyświetlanych na stronie (zwróć uwagę na zaokrąglanie wyniku)
$stron=ceil($el/$max_poz);
//wykonujemy pętle
for ($index=1; $index < $stron; $index++) {
//jeśli wygenerowana wartość $index jest równa wyświetlanej stronie
//generujemy pusty link
if($page==$index){
echo" <font color=\"white\"><b>$index</b></font> |";
}
else{
//jesli nie tworzymy link do strony
echo" <b><a href=\"adresy.phtml?page=$index\">$index</a></b> |";
}}
?>

... i to wszystko co trzeba, aby utworzyć linki z numerami stron
i porcjować przy ich pomocy dane...

...miłej zabawy

dodał: Bastek


.: Wyświetlanie danych z bazy dbf na stronie (dBase) :.
Bardzo rzadką rzeczą wykorzystywaną w php jest
korzystanie z danych zawartych w plikach baz *.dbf.
W tym przypadku nie jest nam potrzebny specjalny serwer
a włączone (wkompilowane) rozszerzenie dla obsługi
funkcji dBase. Jedyne ustawienia jakie są wymagane dla pliku
to ustawienie przywileju 777 w przypadku gdy będziemy
chcieli dodawać pozycje z poziomu przeglądarki.

Przykład wyświetlania danych z pliku dbf:
(jako plik bazowy posłuży nam tu cennik.dbf)

<table>

<?
$count="0";
$dbfile="cennik.dbf";
$db = dbase_open($dbfile, 0);
//pobieramy rekordy z bazy 2 oznacza że dane będą
//pobrane z dwóch pierwszych kolumn
//oczywiście może być ich więcej lub mniej
$record = dbase_get_record($db, 2);
//zliczamy ilość rekordów
$ile_pozycji = dbase_numfields($db);
//i wyświetlamy przy pomocy pętli
for ($i=0; $i < $ile_pozycji; $i++) {
$count++;
echo "<tr><td>$count</td><td>$record[$i]</td></tr>\n";
}
?>

</table>

Tak więc mając np. cenniki zapisane w arkuszach excela
możemy zapisać plik jako dBase (*.dbf) i wykorzystywać
dane bezpośrednio na stronie.....

...oczywiście wszystko zależy od administratora,
czy udostępni Wam to rozszerzenie, a nie wszystkich cechuje
dobra wola. :)


.: Porcjowanie zapytań w MySQL cz.1 :.
Było już o porcjowaniu zapytań w bazie tekstowej, teraz nadszedł czas na MySql...

W MySql jest to tym łatwiejsze że wszystko odbywa się za pomocą parametru LIMIT podawanego w zapytaniu np:

$zapytanie="SELECT * FROM wyszukiwarka WHERE opis LIKE '%$searchtext%' ORDER by id DESC" LIMIT 0,10;

takie zapytanie pobierze dane od rekordu 0 do 10... tak więc cały problem to przekazanie tych parametrów do następnej strony dodanie odpowiedniej liczby i wyświetlenie... zatem spróbujmy to zrobić na przykładzie prostej wyszukiwarki:

<?php

if(($s=="") && ($e=="")){
$s="0";
//ustawiamy limit na 20 pozycji na stronie
$e="20";
}
//łączymy się z bazą
$conn = mysql_connect("localhost","user","password");
mysql_select_db("MOJABAZA");

$zapytanie="SELECT * FROM wyszukiwarka WHERE opis LIKE '%$searchtext%' ORDER by id DESC" LIMIT $s,$e;
$wynik=mysql_query($zapytanie);
echo"Wyniki wyszukiwania dla zapytania: <b>$searchtext</b><br><br>";

//teraz zliczymy sobie ilość rekordów, będzie nam to potrzebne aby wiedzieć czy
//czy utworzyć link "następna strona" jeśli będzie to potrzebne
list($ile)=mysql_fetch_row(mysql_db_query("MOJABAZA","SELECT count(*) FROM wyszukiwarka WHERE opis LIKE '%$w%'"));

while($rekord=mysql_fetch_array($wynik)){
echo"
<table border=\"1\" cellpadding=\"2\" width=\"100%\">
<tr><td bgcolor=\"#80D6FF\">
<a href=\"".$rekord['adres']."\">".$rekord['tytul']."</a>
</td></tr><tr><td>
".$rekord['opis']."
</td></tr></table>";
}

//generujemy linki do następnej strony jeśli rekordów jest więcej niż tych wyświetlonych
echo"<center>";
if($ile <= $e){
echo"<img src=\"img/bc.jpg\" border=\"0\"> <a href=\"javascript:history.back();\">poprzednia strona</a>";
}
if(($ile <= $e) && ($ile > $e)){
echo" | ";
}
if($ile > $e){
echo"<a href=\"$url/show_l.phtml?s=$e&e=".$b=$e+$e."\">następna strona</a> <img src=\"img/nx.jpg\" border=\"0\">";
}
echo"</center>";
?>

przekazując cyferki w linku (<a href=\"show_l.phtml?s=$e&e=".$b=$e+$e."\">) powodujemy że wartość LIMIT $s,$e wciąż jest zwiększana np.

przy pierwszym wyświetleniu strony ten link będzie wyglądał tak:
<a href=\"show_l.phtml?s=20&e=40\">

tak więc przy pierwszym wyświetleniu dostaniemy pozycje od 0 do 20 a w linku przekażemy informacje o tym że na nastepnej stronie mają zostać wyświetlone pozycje od 20 do 40.

To oczywiście przykład najprostszy z możliwych... chodzi tylko o to żeby zrozumieć zasadę działania takiego porcjowania.... w następnej części opiszę jak zrobić porcjowanie na zasadzie linków na stronie w stylu [1] [2] [3] [4] [5] tak jak to ma miejsce na przykład na Google.

...na razie polecam poćwiczenie na prostszym przykładzie, a ten powinien być idealny.


.: Jak wysłać maila w formacie html :.
Wysyłanie poczty w formacie html, w sumie niczym nie różni się od wysyłania zwykłego tekstu.Cała metoda opiera się tylko na dodaniu dodatkowych nagłówków, które pozwolą odpowiednio zinterpretować Waszą wiadomość przez program pocztowy.

<?
$wiadomosc = "
<html>
<head>
<title>Tytuł strony</title>
</head>
<body bgcolor=\"white\">
<H2>Moja wiadomość</H2>
</body>
</html>
";

//Tu określamy Mime i kodowanie strony
//Mime to nic innego jak spis akceptowanych przez serwer typów plików - mime type,
//kodowania chyba nie trzeba tłumaczyć
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
//Zwróć uwagę na kropki znajdujące się w dodatkowych nagłówkach

//nagłówek od kogo wysyłana jest poczta, jeśli to pominiesz
//adresat dostanie pocztę od (najczęściej) nobody@adres.com.pl
$headers .= "From: Bastek <deus@tvs.pl>\r\n";

//dodatkowe nagłówki C.Copy
$headers .= "Cc: kopia@xx.com.pl\r\n";
$headers .= "Bcc: druga_kopia@xx.com.pl\r\n";

//wysyłamy maila
mail("deus@tvs.pl", "temat wiadomości", $wiadomosc, $headers);

?>

Ot, i cały skrypt.... proste i jasne :)

Pomimo że jest to jedna z najprostszych funkcji PHP sprawia czasem małe problemy, myślę że trochę częściej należy zaglądać do manuala. Link do jego częściowo przetłumaczonej wersji znajdziesz w dziale "źródła aplikacji".

Dokładny opis funkcji znajduje się w:
Manual/OpisFunkcji/Funkcje obsługi poczty elektronicznej


.: Porcjowanie wyników zapytania w bazie tekstowej :.
Jednym z najczęściej zadawanych pytań jest jak porcjować wyniki zapytania w "bazie" tekstowej. Nie mamy w tym wypadku tak jak w MySql-u możliwości określenia limitu od-do (jak to wygląda w MySql opiszę następnym razem).

Aby zrozumieć zasadę działania takiego wyświetlania danych musimy najpierw przyglądnąć się pętli for:

for ($index=0; $index < 20; $index++){
}

powyższa pętla wyświetli nam pozycje od 0 do 20
(wyświetlamy pozycje dopóki zmienna $index jest mniejsza od 20)

Aby porcjować pozycję musimy cyfry 0 i 20 zamienić na zmienne np.

for ($index=$pos; $index < $ilepoz; $index++){
}

-------------------------------------------------------------

$pos="20";
$ilepoz="30";
//zakładamy że powyższe zmienne zostały przesłane linkiem
for ($index=$pos; $index < $ilepoz; $index++){
}
ten przykład wyświetli nam pozycje od 20 do 30

tym samym jeśli prześlemy w linku do następnej strony ostatnie wartości tych zmiennych i dodamy maksymalną ilość wyswietlanych pozycji na stronie (w tym wypadku 20) wyświetlimy pozycje: od wartości $pos + 20 do wartości $ilepoz + 20.

-------------------------------------------------------------

...a teraz praktycznie:

Przykład:

Załóżmy że wcześniej wprowadzaliśmy dane z formularza
o polach imie i email np. w ten sposób:

<?
$fp = fopen("dane.txt", "a");
flock($fp,2);
fwrite($fp, "$imie||$email||\n");
flock($fp,3)
fclose($fp);
?>

-------------------------------------------------------------

Skrypt wyświetlający:

<?
$max="20";//tu ustawiamy maksymalną ilość wyświetlanych pozycji na stronie
$count="0";
//jeśli zmienna next jest pusta zaczynamy od pozycji 0
if($next==""){$next="0";}
else{$next=$max;}

//jeśli zmienna pos przesyłana w linku jest pusta ustawiamy jej wartość na 0
//jeśli nie dodajemy do niej zmienną next która przejęła wartość max czyli 20
if($pos==""){$pos="0";}
else{$pos=$pos+$next;}

//tu określamy do której pozycji mamy wyświetlić dane
if($ilepoz==""){$ilepoz=$max;}
else{$ilepoz=$ilepoz+$next;}

$plk = file("dane.txt");

//wykonujemy pętle i dzielimy plik najpierw linie później tekst
//pomiędzy operatorami ||
for ($index=$pos; $index < $ilepoz; $index++)
{ $g = split("\|", chop($plk[$index]));
$split = explode("||", $plk[$index]);
$count++;

//wyświetlamy elemeny tablicy jeśli nie są puste
if(($split[0]!="") && ($split[1]!="")){
echo "$count. <a href=mailto:\"$split[1]\">$split[0]</a><br>";}
}
//jeśli wyświetlana pozycja jest większa od maksymalnej robimy link wstecz
//tym samym link pojawi się tylko na następnych stronach
if($pos>="$max"){
echo"<a href=\"javascript:history.back()\"><< wstecz</a> ";
}
//jeśli ostatnia wyświetlona pozycja jest mniejsza od ilości wszystkich pozycji
//w tablicy wyświetlamy link do następnych
//to jak przedstawimy linki do następnych stron zależy już od naszej pomysłowości
if($ilepoz<count($plk)){
echo"<a href=\"index.php3?next=$max&pos=$pos&ilepoz=$ilepoz\">następne >></a>";
}
//tu wyświetlamy np. numer wyświetlonej strony
$numer_strony = $ilepoz/$max;
echo"<br><br><b>$numer_strony strona</b><br><br>";
?>

Ogólnie zasada jest bardzo prosta:
przesłać ostatnie wartości zmiennych w pętli do następnej strony i dodać do nich ile pozycji następnych ma wyświetlić - najprostsza matematyka.

Praktyczny przykład będzie do podglądnięcia w UltraNews v04 ...a więc powodzenia :)


.: Jak usunąć tagi html-a ze zmiennej? :.
Aby usunąć tagi html-a musimy posłużyć się funkcjami zamiany wyrażeń regularnych.

Przykład pierwszy:

<?php
$url="jakiś tam tekst <a href=\"http://www.bastek.tvs.pl/index.php3\" target=\"_blank\"> http://www.bastek.tvs.pl/index.php3</a> jakiś tam tekst";

$url = eregi_replace("href=","",$url);
$url = eregi_replace("<a[^>]*>","",$url);
$url = eregi_replace("</a[^>.]*>","",$url);

echo"$url";
?>

Przykład drugi:

<?
$text="<font face=\"Tahoma\" color=\"red\">czerwony tekst</font>";

$text = eregi_replace("<font[^>.]*>","",$text);
$text = eregi_replace("</font[^>.]*>","",$text);

echo"$text";
?>

Powyższe przykłady wycinają wybrane tagi i zostawiają pomiędzy nimi czysty tekst.


.: Przesyłanie danych w parametrach linku / (urlencode() i urldecode() / :.
Przy pomocy parametrów w linku możemy przesyłać pomiędzy stronami wiele potrzebnych informacji np. tworząc link:

<?
$a="abc";
$b="def";
echo"<a href=strona.php3?dane1=$a&dane2=$b>przekaż</a>"
?>

przekażemy informacje do pliku strona.php3, które możemy w nim
wyświetlić np. w ten sposób

<?
echo"
wartość dane1 to: $dane1
wartość dane2 to: $dane2
";
?>

---------------------------------------------------------------------

Inaczej sprawa wygląda gdy musimy przesłać dłuższy tekst, wszystko co pojawi się po pustej spacji nie będzie widziane w linku.
Aby ominąć ten problem należy zastosować najpierw funkcję urlencode()

czyli na przykłąd kod wyglądałby tak:

<?
$a="długi tekst dzielony spacjami";
$b="to też jest długi tekst dzielony spacjami";
echo"<a href=strona.php3?dane1=".$a=urlencode($a)."&dane2=".$b=urlencode($b).">przekaż</a>"
?>

natomiast w pliku odbierającym dane z parametrów musimy zastosować funkcję urldecode():

<?
echo"
wartość dane1 to ".$dane1=urldecode($dane1)."
wartość dane2 to ".$dane2=urldecode($dane2)."
";
?>

Przy zastosowaniu funkcji urlencode() puste miejsca zostaną zamienione na "+" :
$a="długi+tekst+dzielony+spacjami";
$b="to+też+jest+długi+tekst+dzielony+spacjami";

natomiast przy odebraniu danych funkcja urldecode() zamieni "+" z powrotem na puste miejsca.

---------------------------------------------------------------------

Ten sam efekt możemy uzyskać stosując funkcję zamiany stringa str_replace() :
$a = str_replace(" ","_",$a);
w pliku wysyłającym
i
$a = str_replace("_"," ",$a);
w pliku przyjmującym

ten drugi sposób bywa w wielu przypadkach dużo wygodniejszy, choć może sprawiać wrażenie "mniej profesjonalnego".


.: Jak uruchomić obsługę gifów i nie tylko... :.
Aby uruchomić obsługę wielu dodatkowych czynności (np. obsługa obrazków *.gif - to jeden z częstszych problemów o których piszecie) w php musisz odpowiednio skonfigurować plik "php.ini". W tym celu wyszukaj w nim poniższego fragmentu i odblokuj rozszerzenia usuwając średniki (;) sprzed linijek. To zresztą najczęstsza przyczyna problemów związanych choćby z działaniem MySQL'a. Oczywiście najpierw się zastanów co Ci jest naprawdę niezbędne, żeby nie ładować niepotrzebnych rzeczy. Np. jeżeli usuniesz średnik sprzed ;extension=php3_gd.dll będziesz od teraz widział i mógł tworzyć przy pomocy php obrazki *.gif.

;Windows Extensions
;extension=php3_mysql.dll
;extension=php3_nsmail.dll
;extension=php3_calendar.dll
;extension=php3_dbase.dll
;extension=php3_filepro.dll
;extension=php3_gd.dll
;extension=php3_dbm.dll
;extension=php3_mssql.dll
;extension=php3_zlib.dll
;extension=php3_filepro.dll
;extension=php3_imap4r2.dll
;extension=php3_ldap.dll
;extension=php3_crypt.dll
;extension=php3_msql2.dll
;extension=php3_odbc.dll

----------------------------------------------------------------------------------

Aby sprawdzić czy obsługa gifów została uruchomiona utwórz plik obrazek.php3 i wstaw do niego kod:
<?
header("Content-type: image/gif");
$image=ImageCreateFromGif("obrazek.gif");
ImageGif($image);?>

Obok obrazka wrzuć plik o nazwie obrazek.gif a następnie urzuchom pod Apache plik obrazek.php3 i zobacz rezultaty. Obrazek możesz również wywołać z innego pliku php normalnym kodem html: <img src=obrazek.php3>

Jeśli zobaczysz obrazek, znaczy że wszystko działa, plik utworzy na bazie obrazek.gif nowy obraz, to najprostszy chyba sposób wykorzystania tej biblioteki.

----------------------------------------------------------------------------------

Opis poszczególnych rozszerzeń (modułów) :

php_calendar.dll
Funkcje konwersji dat różnych kalendarzy

php_crypt.dll
Funkcje obsługi szyfracji metodą Crypt

php_dbase.dll
DBase Funkcje

php_dbm.dll
Emulacja GDBM przez bibliotekę Berkely DB2

php_filepro.dll
Dostęp READ ONLY do bazy danych filepro

php_gd.dll
Funkcje do obsługi grafiki GIF

php_hyperwave.dll
Funkcje dla HyperWave

php_imap4r2.dll
Funkcje dla IMAP 4

php_ldap.dll
Funkcje dla LDAP

php_msql1.dll
1 klient mSQL

php_msql2.dll
2 klient mSQL

php_mssql.dll
Klient MSSQL

php_mysql.dll
Funkcje dla MySQL

php_nsmail.dll
Funkcje dla Netscape mail

php_oci73.dll
Funkcje dla Oracle

php_snmp.dll
Funkcje SNMP get i walk (dla Windows NT)

php_zlib.dll
Funkcje dla ZLib

(Opis bibliotek oparto na "Manualu" z WebDevZone)


.: Zmiana wielkości liter :.
Zdarza się czasem że dobrze by było aby dane wprowadzone przez użytkownika była napisane np. małymi literami. Możemy to zrobić w prosty sposób przy pomocy javascriptu np tak:
onBlur="javascript:this.value=this.value.toLowerCase();"

Możemy to zrobić również za pomocą php w którym mamy do dyspozycji następujące funkcje:

strtolower() - zmienia cały tekst na małe litery
strtoupper() - zmienia cały tekst na duże litery
ucfirst() - zmienia pierwszą literę tekstu na dużą
ucwords() - zmienia pierwszą literę każdego słowa na dużą

aby zobaczyć przykład działania utwórz testowy plik i wklej poniższy kod:
------------------------------------------------------------------------------
<?php
//przykład zmiany wiekości liter

$dane="jeSTem wTóRNyM anALFabetĄ.";
echo"<br>";
echo"tekst orginalny: $dane<br><br>";

$dane1=strtolower($dane);
echo"zmiana tekstu na małe litery: $dane1<br>";

$dane2=strtoupper($dane);
echo"zmiana tekstu na duże liter: $dane2<br>";

$dane3=ucfirst($dane);
echo"Pierwsza litera z dużej litery: $dane3<br>";

$dane4=ucwords($dane);
echo"Każde słowo z dużej litery: $dane4<br>";

$dane5=ucfirst($dane1);
echo"<br>Praktyczne wykorzystanie:<br>";
echo"Tekst jak w zdaniu: $dane5<br><br>";

echo"inne:<br>";
$dane5=strrev($dane);
echo"Tekst w odbiciu lustrzanym: $dane5<br>";
?>.


.: Samoobsługowa tablica ogłoszeń :.
Nie tak dawno potrzebowałem wykonać samodzielną tablicę ogłoszeń. Ważną sprawą w tym wszystkim było to aby nie trzeba było przy niej nic robić, stare ogłoszenia miały być kasowane automatycznie, musiała to być również tablica oparta na plikach tekstowych. Pozostawał jednak problem jeśli plik bazowy po osiągnięciu określonej wielkości zostanie wyczyszczony, pozostanie pusta tablica ogłoszeń. Można by było oprzeć całość na tablicach, ale po co komplikować. Postanowiłem więc całość oprzeć na dwóch plikach tekstowych dla jednego działu. Zasada działania takiej tablicy opiera się na tym że plik główny (baza1.inc) działu jest ważony, a jeśli jego wielkość przekroczy 60 kb to drugi plik zostaje wykasowany, a zawartość pierwszego jest do niego przerzucona sama się kasując. Wszystko to tworzy wizualną ciągłość, bez efektu nagłego wyczyszczenia całego pliku. Najważniejszą rzeczą w całości jest jednak to że taka tablica ogłoszeń jest samoobsługowa, co przy mojej ograniczonej ilości czasu na zajmowanie się nią było rozwiązaniem idealnym.

Aby stworzyć tablicę ogłoszeń utwórz pliki:
(pamiętaj aby wszystkie pliki miały jednakowe kodowanie tekstu)

formularz.php3
zapis.php3
pokaz.php3
weryfikuj.n (chmod 666)

w katalogu base utwórz pliki baza1.inc i baza2.inc i nadaj im prawa do zapisu (chmod 666)

pokaz.php3
--------------------------------------------------------------
<?
include("base/baza1.inc");
include("base/baza2.inc");
?>

formularz.php3
--------------------------------------------------------------
<form method=post action=zapis.php3>
treść:<br>
<textarea rows="9" name="tresc" cols="38"></textarea><br>
e-mail:<br>
<input type=text name=email><br>
<input type=submit value=dodaj><br>
</form>

zapis.php3
--------------------------------------------------------------
<?
setcookie("tablica", "1", time()+10*3);
?>
<html>

<body>
<?
//weryfikacja długości lini, <textarea> żeby nam nikt nie rozwalił strony
$weryfikacja="ok";
$file="weryfikuj.n";
$fp=fopen("$file", "w");
$dane = str_replace(" ","\n",$tresc);
flock($fp, 2);
fwrite($fp, $dane);
flock($fp, 3);
fclose($fp);
$linie = file("weryfikuj.n");
for ($index=0; $index < count($linie); $index++)
{$lista = split("\|", chop($linie[$index]));
?>
<? if (strlen($lista[$index]) > 40) {
$weryfikacja="";
echo"Za długi wyraz, chyba nie użyłeś spacji pomiędzy wyrazami
<a href=javascript:history.back();>Wróć i popraw</a>";
}?><?} ?>

<?
$file = "base/baza1.inc";
if(($tresc=="") || ($email=="")){
$weryfikacja="bad";
echo"Nie wypełniono prawidłowo pól formularza<br>";
}
elseif ($weryfikacja!="ok"){
echo"formularz został zatrzymany<br>";
}
//jeśli wielkość pliku baza1.inc jest mniejsza od 60kb wykonujemy co poniżej

elseif((filesize($file) < "60000") && ($tablica!="1")){

//furtka dla tych, którzy nie mają maila
//możesz o tym poinformować lub nie
//jeśli ktoś wpisze w formularzu (pole email) brak@brak.pl
//mail nie będzie wyświetlony, a formularz pozwoli się ogłosić
$email = str_replace("brak@brak.pl","",$email);

$przed=$tresc;

//zamieniamy znaczniki html
$tresc = str_replace("<","&lt;",$tresc);
$tresc = str_replace(">","&gt;",$tresc);
$tresc = ereg_replace("\r","<br>",$tresc);
$tresc = ereg_replace("\r\n","<br>",$tresc);
$tresc = ereg_replace("<br><br>","<br>",$tresc);
//itd...

//cenzura zamiast buźki możesz zastosować jakiś obrazek
$tresc = str_replace("sex",":(",$tresc);

$datag = date("Y-m-d H:i");
//formatujemy wpis
$dane="$tresc<br>e-mail: <a href=mailto:$email>$email</a><br>
(dodano: $datag)<hr noshade size=1>";

$danedwa=$dane;

$file = "base/baza1.inc";
$fp=fopen("$file", "r+");
$dane=$dane. fread($fp,filesize($file));
rewind($fp);
flock($fp, 2);
fputs($fp, $dane);
flock($fp, 3);
fclose($fp);

//pobieranie informacji data, ip, host
//takie dane lepiej pobierać i przechowywać, z tego względu
//że zdarza się że KGMO zwraca się czasem z prośbą o udostępnienie takich
//danych, w sieci działa dużo oszustów itp... więc lepiej się zabezpieczyć.

$data=date("Y-m-d H:i");
$ip=$REMOTE_ADDR;
$host=gethostbyaddr($ip);

$wysylka = "$przed
e-mail: $email
(dodano: $data)
ip: $ip
host: $host";

//wysyłanie ogłoszenia na naszą skrzynkę, utwórz sobie
//regułę wiadomości, ogłoszenia będą wtedy automatycznie zbierane
//w jednym katalogu
$header = "From: Formularz <$email>";
mail("twojadres@com.pl", "Ogłoszenie", "$wysylka","$header");
echo "<b>Ogłoszenie zostało przyjęte.</b><br><b>Dziękujemy i zapraszamy
ponownie do skorzystania z usług naszego serwisu.</b><br><br>
<b>Treść dodanego ogłoszenia:</b><br>$tresc<br><b>e-mail:</b> $email<br>
<b>data dodania:</b> $datag<br><br>";
}
elseif (($tablica!="1") && ($weryfikacja=="ok")){

//jeśli wielkość pliku baza1.inc przekroczyła 60 kb

$file = "base/baza1.inc";
$fp=fopen("$file", "r+");
$dane=$dane. fread($fp,filesize($file));
rewind($fp);

//przerzucamy jego zawartość do drugiego pliku, kasując pierwszy

$file = "base/baza2.inc";
$fp=fopen("$file", "w");
flock($fp, 2);
fwrite($fp, "$dane");
flock($fp, 3);
fclose($fp);

//zapisujemy ostatni wpis w pierwszym pliku

$file = "base/baza1.inc";
$fp=fopen("$file", "w");
flock($fp, 2);
fwrite($fp, $danedwa);
flock($fp, 3);
fclose($fp);
}
else{
echo"Przekroczono limit (nie toleruję spamu)";
}

//teraz wyślemy list z podziękowaniami do ogłoszeniodawcy
//list zostanie wysłany tylko przy pierwszym ogłoszeniu

if(($tablica!="1") && ($weryfikacja=="ok")){

//treść listu
$list = "Dziękujemy za skorzystanie z usług naszego serwisu.

Serwis xxx

--------------------------------------------------------------
Reklamka:
";
$header = "From: Serwis xxx <twojadres@com.pl>";
mail("$email","Tytul_maila","$list","$header");
}
?>

</body>
</html>

Tablica tu pokazana jest uproszczoną wersją pokazującą na jakiej zasadzie można ją zbudować. Można oczywiście rozbudować taki skrypt o wiele działów, ale na potrzeby niedużej witrynki spokojnie wystarczy.


.: Tablice - część druga - sortowanie danych :.
W części poprzedniej przedstawiłem najprostszą wersję tablicy. Teraz spróbujemy posortować elementy tablicy.

Naszą tablicę utworzą tym razem cyfry 1,3,2,4,8,9,7,5,6 zwróć uwagę że specjalnie ułożyłem je w przypadkowej kolejności. W przykładzie warto również zwrócić uwagę na funkcję sizeof() to funkcja, która liczy elementy tablicy.Do wyświetlenia elementów użyłem pętli for (jeśli liczba elementów tablicy jest większa od zmiennej $i (na starcie 0) wyświetlamy dane i zwiększamy wartość $i, czyli jeżeli mamy 9 elementów tablicy gdy $i osiągnie tą samą wartość (czyli 9) pętla przestanie się wykonywać).

Do przeglądania tablicy mamy jeszcze inne funkcje np:
current(), next(), prev(), each(), reset(), end() (funkcje umożliwiające sekwencyjny dostęp do danych) ale o tym napiszę przy najbliższej okazji.

utwórz plik np: test.php3 i wklej poniższy kod
---------------------------------------------------------
<?php
$tablica=array(1,3,2,4,8,9,7,5,6);

//sortujemy od najmniejszej do największej
//wykorzystujemy funkcję sort()

echo"sortowanie od najmniejszej do największej:<br>";

$total = sizeof($tablica);

for($i=0; $total > $i; $i++){
sort($tablica);
echo"$tablica[$i]<br>";
}

//a teraz przesortujemy od największej do najmniejszej
//wykorzystujemy funkcję rsort()

echo"sortowanie od największej do najmniejszej:<br>";
for($i=0; $total > $i; $i++){
rsort($tablica);
echo"$tablica[$i]<br>";
}
?>
---------------------------------------------------------

Do sortowania tablic istnieją również inne funkcje, na razie (w przykładzie) skupiliśmy się na dwóch: sort() - funkcja porządkująca od najmniejszej do największej rsort() - funkcja porządkująca od największej do najmniejszej

W którejś z kolejnych porad opiszę również inne funkcje: usort(), ksort(), uksort(), asort(), arsort(), uasort()
ale o tym w przyszłości, na razie skupmy się na najprostszych "uniwersalnych" przykładach (później wszystko będzie dziecinnie proste).

Przykład przedstawiony powyżej pozwoli na zrozumienie podstawowych zasad sortowania.

Co do tematu tablic będę wdzięczny za sugestie na temat treści przyszłych części (Wy wiecie najlepiej jakich informacji i rozwiązań poszukujecie, pozwoli to na skonkretyzowanie treści porad).


.: Tablice - część pierwsza :.
Tablice to najwygodniejszy sposób przechowywania informacji. Przy ich pomocy możemy przechowywać i wyświetlać dane w sposób uporządkowany. Elementy tablicy można sortować, przeglądać jedna po drugiej itd...

Spróbujmy napisać prosty skrypt, który według podanej przez nas nazwy domeny państwowej wyświetli kraj do którego ona należy. Oprzemy go na jednowymiarowej tablicy asocjacyjnej. Dzięki zastosowanej funkcji array() możemy jednocześnie przypisać wartości wielu elementom tablicy.

przykładowy skrypt:

domeny.php3
----------------------------------------------------------------------
<html>
<body>
<b>Sprawdź do jakiego kraju należy domena</b><br><br>
<form method=post action=<? $PHP_SELF; ?>>
wpisz nazwę domeny np. "pl"<br>
<input type=text name=kraj><br><br>
<input type=submit value=sprawdź>
</form>

<?
//początek tablicy
$domeny = array(
"pl" => "Polska",
"de" => "Niemcy",
"it" => "Włochy",
"ru" => "Rosja",
"ro" => "Rumunia",
"at" => "Austria",
"cz" => "Czechy",
"fr" => "Francja",
"tv" => "Tuvoli",
"ad" => "Andoria",
"ae" => "Emiraty Arabskie",
"af" => "Afganistan",
"al" => "Albania",
"am" => "Armenia",
"ao" => "Angola",
"as" => "Samoa",
"au" => "Australia",
"az" => "Azerbejdżan",
"ba" => "Bosnia i Hercegowina",
"bb" => "Barbados",
"bd" => "Bangladesz",
"be" => "Belgia",
"bg" => "Bułgaria",
"bm" => "Bermudy",
"bo" => "Boliwia",
"br" => "Brazylia",
"bs" => "Bahama",
"ca" => "Kanada",
"ch" => "Szwajcaria",
"cl" => "Chile",
"cm" => "Kamerun",
"cn" => "Chiny",
"co" => "Kolumbia",
"cr" => "Kostaryka",
"cu" => "Kuba",
"cy" => "Cypr",
"dk" => "Dania",
"ee" => "Estonia",
"eg" => "Egipt",
"es" => "Hiszpania",
"fi" => "Finlandia",
"fm" => "Mikronezja",
"gb" => "Wielka Brytania",
"gr" => "Grecja",
"hk" => "Hong Kong",
"hn" => "Honduras",
"hr" => "Chorwacja",
"hu" => "Węgry",
"ie" => "Irlandia",
"il" => "Izrael",
"in" => "Indie",
"iq" => "Irak",
"ir" => "Iran",
"is" => "Islandia",
"jp" => "Japonia",
"kz" => "Kazachstan",
"li" => "Lichtensztain",
"lt" => "Litwa",
"lv" => "Łotwa",
"mx" => "Meksyk",
"no" => "Norwegia",
"ua" => "Ukraina",
"us" => "Stany Zjednoczone"
);
//koniec tablicy

if($kraj!=""){
$kraj = str_replace(".","",$kraj);
echo"<b>.$kraj</b> to domena używana przez: $domeny[$kraj]";
}
if(($domeny[$kraj]=="") && ($kraj!="")){
echo"brak danych";
}
?>

</body>
</html>
----------------------------------------------------------------------

Ten skrypcik przedstawia jedną z najprostszych metod wykorzystania tablicy, w kolejnej części napiszemy skrypcik z możliwością sortowania i przeglądania danych. (wyobraź sobie jak proste może być np. stworzenie słownika)


.: Informacje o aktualizacji pliku :.
Ostatnio ktoś mnie zapytał w liście jak wyświetlić informacje o pliku tj. datę utworzenia, modyfikacji itp...

Aby wyciągnąć interesujące nas dane posługujemy się funkcjami:

filectime();
wyświetla dokładny czas utworzenia pliku

filemtime();
wyświetla dokładny czas modyfikacji pliku

fileatime();
wyświetla datę ostatniego otwarcia pliku

Przykład:

test.php3
------------------------------------------------------------------------------
<?
$file="test.php3";

$ct=filectime("$file");
$mt=filemtime("$file");
$at=fileatime("$file");

echo"Data utworzenia pliku: ".date("n-j-Y h:i:s", $ct)."<br>";
echo"Data ostatniej aktualizacji pliku: ".date("n-j-Y h:i:s", $mt)."<br>";
echo"Ostatnio otwarty: ".date("n-j-Y", $at)."";
?>
------------------------------------------------------------------------------

Zwróć również uwagę na sposób formatowania pobranych informacji:
".date("n-j-Y h:i:s", $ct)." - tu decydujesz jak będzie wyglądała wyświetlona data,
(jeśli tego nie zrobisz , otrzymasz tylko ciąg niezrozumiałych cyferek).


.: Jak wyszukiwać w bazach tekstowych :.
Bazy SQL przeszukuje się w prosty, intuicyjny sposób, ale co zrobić aby przeszukać plik tekstowy w poszukiwaniu jednego słowa. Poniżej znajdziesz prosty przykład takiego wyszukiwania, potrzebne będą dwa pliki szukaj.php3 do którego wkleimy poniższy kod (aby nie komplikować cała obsługa została zawarta w jednym pliku) oraz klienci.inc (ustaw chmod 666) w którym będziemy przechowywać przykładowo wprowadzone maile.

Cała zabawa polega na tym że pobieramy linie z pliku klienci.inc zamieniamy w tablice i wyświetlamy linia po lini, tyle że wyświetlenie jest uwarunkowane tym że w lini musi znajdować się szukany wyraz, jeśli go nie ma nic nie zostanie pokazane. Z pomocą przychodzi tu funkcja eregi(), reszta to procedura analogiczna jak np. w liście mailowej.

szukaj.php3
-------------------------------------------------------------------------------------------
<form>
e.Mail:<br>
<input type=text name=email><input type=submit value=dodaj>
</form>
e.Mail:<br>
<form>
<input type=text name=szukane><input type=submit value=szukaj>
</form>

<b>Notes</b><br><br>

<?
if($email!=""){//dopisujemy adres do listy
$file="klienci.inc";
$fp=fopen("$file", "a");
flock($fp, 2);
fwrite($fp, "$email\n");
flock($fp, 3);
fclose($fp);
echo"Adres został dopisany";
}

if($szukane==""){
$szukane="xyz";}//jakiś ciąg znaków który na pewno nie wystąpi w pliku
$adresy = file("klienci.inc");

for ($index=0; $index < count($adresy); $index++)
{ $grupa = split("\|", chop($adresy[$index])); //zamieniamy linie na tablicę
$count="0";
?>

<? if (eregi("$szukane", $adresy[$index])) {
$count++;
echo "$count. <a href=mailto:$grupa[0]>$grupa[0]</a><br>";}?><?}
//jeśli w tablicy znajduje się szukany ciąg wyświetlamy linię która go zawiera
//wykorzystujemy tu funkcję eregi(), aby wyświetlić wszystkie pozycje wpisz @
?>

Powyższy przykład to tylko prosta próba zobrazowania jak może działać taka wyszukiwareczka, wykorzystując tą metodę można stworzyć nawet wyszukiwarkę dla stron.


.: Przechowywanie informacji w cookies :.
Php pozwala w prosty sposób przechowywać informacje w cookies, a wszystko to za sprawą prostej funkcji setcookie(). Aby zobaczyć jak działa obsługa cookies w php utwórz plik np. test.php3 i wklej do niego poniższy kod (pamiętaj że dodawanie informacji do cookies musi się odbywać przed nagłówkiem dokumentu):

-----------------------------------------------------------------------------------
<?
if($ciastko=="ON"){//jeśli została zaznaczona opcja, zapisujemy informacje w cookies
setcookie("userlogin", "$login", time()+999999999*3);
//trzeci parametr funkcji setcookie() określa ile czasu informacja ma zostać
//zatrzymana w ciasteczku, nie podanie trzeciego argumentu, sprawi że informacja
//będzie przechowywana tylko do czasu zamknięcia przeglądarki.
}
?>
<html>
<head>
<title>Test ciasteczek</title>
</head>

<body>
<?
if($userlogin==""){
//jeśli zmienna $userlogin jest pusta wyświetlony zostanie formularz
//który pozwoli nam zapisać w cookies nasz np. login
echo"<form>
podaj login:<br>
<input type=text name=login><br>
<input type=checkbox name=ciastko value="ON"> - Zachowaj login w cookies<br>
<input type=submit name=submit value=ok>
</form>";
}
else{
echo"Twój login ukryty w cookies to: $userlogin<br><br>możesz iść dalej...";
//jeśli zmienna nie jest pusta zostanie wyświetlona, wartość $userlogin
//za każdym następnym wejściem wartość $userlogin zostanie pobrana z cookies
//jeśli czas przechowywania się skończy, znów wyświetli się nam formularz.
}
?>
</body>
</html>
-----------------------------------------------------------------------------------

Powyższy przykład przybliży Wam metodę zapisywania w cookies informacji. Cookies często wykorzystujemy np. przy blokowaniu przeładowań liczników co wygląda tak:

<? setcookie("gosc", "1", time()+3600*3); ?>

<?
if($gosc!="1"){
$file=fopen("plik licznika", "r");
flock($file, 1);
$cyfra=fgets($file, 100);
flock($file, 3);
fclose($file);
$cyfra++;

$file=fopen("plik licznika", "w");
flock($file, 2);
fwrite($file, $cyfra);
flock($file, 3);
fclose($file);
echo($ile);
}
?>


.: Przykład formularza w php :.
Poniższy przykładzik przedstawia sposób wykonania formularza w php, oraz wymuszenie wypełnienia wszystkich pól przez wypełniającego.

--------------------------------------------------------------------------------------------

formularz.htm

W pliku formularz.htm, znajduje się standardowy formularz
html, nie będę go więc opisywał.

<form name="form" method="post" action="mail.php3">
Podaj swoje imię:<br>
<input type="text" name="imie"><br>
Podaj swój email<br>
<input type="text" name="email"><br>
Treść wiadomości<br>
<textarea name="tresc" rows="5" cols="40"></textarea><br>
<input type="submit" name="submit" value="wyślij">
<input type="reset" name="reset" value="od nowa">
</form>

--------------------------------------------------------------------------------------------

mail.php3

W tym pliku odbywa się cała zabawa, gdy któreś z pól formularza w pliku formularz.htm zostało pominięte nasz skrypcik tworzy formularz a następnie sprawdza które pola zostały pominięte i wyświetla brakujące pole do uzupełnienia (dane już wprowadzone przetrzymywane są w polach ukrytych "hidden" formularza). po uzupełnieniu brakujących pól formularz będzie mógł zostać wysłany.

<?

if (($imie == "") || ($email == "") || ($tresc == ""))//jeśli jakiekolwiek z pól zostało pominięte tworzymy formularz
{
echo "<form name=form method=post action=mail.php3>";
echo "Nie wypełniłeś wszystkich pól formularza... uzupełnij brakujące pola<br>";
}
if ($imie == "")//sprawdzamy czy pole imie jest puste
{
echo "Podaj swoje imię:<br><input type=text name=imie><br>";//jeśli pole imie jest puste wyświetlamy pole imie itd...
}
else
{
echo "<input type=hidden name=imie value=$imie>";
}
if ($email == "")
{
echo "Podaj swój email:<br><input type=text name=email><br>";
}
else
{
echo "<input type=hidden name=email value=$email>";
}
if ($tresc == "")
{
echo "Treść wiadomości:<br><textarea name=tresc rows=5 cols=40></textarea><br>";
}
else
{
echo "<input type=hidden name=tresc value=$tresc>";
}

if (($imie == "") || ($email == "") || ($tresc == ""))
{
echo "<input type=submit name=submit value=wyślij>";
echo "<input type=reset name=reset value=od nowa>";
echo "</form>";//zamykamy formularz
}
else
{
$wiadomosc = "Imię: $imie\nEmail: $email\nTreść wiadomości:\n$tresc\n";
$header = "From: $imie\r\nReply-To: $email\r\n";
mail ("twojadres@email.pl", "Formularz", $wiadomosc, $header);
echo "Dzięki za wypełnienie formularza $imie.";
}
?>


.: Upload plików :.
Jedną z bardzo przydatnych funkcji w PHP jest możliwość prostego Uploadu dowolnych plików na serwer. Poniższy przykład przedstawia najprostszą metodę zbudowania Uploadera plików. Nie zapomnij w formularzu o dodaniu: enctype="multipart/form-data" co pozwala na wysłanie informacji z załącznikiem.
formularz na stronie wysyłającej:

formularz.htm ------------------------------------------------

<html>
<form name="kopiarka" method="POST"
enctype="multipart/form-data" action="upload.php3">
<input type="hidden" name="ok" value="1">
<input type="hidden" name="MAX_FILE_SIZE" value="10000"><p>Wybierz plik do przerzucenia:<br>
<input type="file" name="file" size="40"><br>
<br>
<input type="submit" value="Kopiuj"><input type="reset" value="Reset"></p>
</form>
</html>

skrypt przyjmujący wysłany plik: (katalog do, którego przerzucane będą pliki oraz w którym znajdzie się skrypt musi mieć ustawione prawa na 777). Wartość formularza "MAX_FILE_SIZE" określa maksymalny rozmiar pliku w bajtach, jaki może zostać skopiowany.

upload.php3 ------------------------------------------------

<html>
<?
if ($ok=="1"){ /* działanie tylko jeśli użyto formularza */
copy("$file", "katalog/$file_name"); /* kopiowanie */
unlink("$file");
echo"Plik został skopiowany<br>
Informacje o skopiowanym pliku:<br>
Nazwa pliku: $file_name<br>
Wielkość pliku: $file_size"; /* Potwierdzenie i informacja o skopiowanym pliku */
}
else {
echo"Wystapił bład przy kopiowaniu pliku"; /* Informacja o błędzie */
}
?>
</html>

Zmienne $file_name oraz $file_size nadawane są automatycznie, można je zastosować np. stosując inną metodę blokowania plików jeśli ich wielkość przekracza określony przez nas maksymalny rozmiar lub mamy wymusić określoną nazwę pliku. Możemy to zrobić na przykład tak:

<?
if ($ok!="1"){
exit;
}
elseif (($file_size<"10000") && ($file_name=="foto.jpg")){
copy("$file", "katalog/$file_name");
unlink("$file");
echo"Plik został skopiowany<br>
Informacje o skopiowanym pliku:<br>
Nazwa pliku: $file_name<br>
Wielkość pliku: $file_size bajtów";
}
else {
echo"Wystapił bład przy kopiowaniu pliku.
Zła nazwa lub została przekroczona maksymalna wielkość pliku"; /* Informacja o błędzie */
}
?>


.: Jak wprowadzać dane aby mieć możliwość późniejszej edycji :.
Gdy wprowadzamy dane do pliku w postaci sformatowanego kodu html, istnieje jedna główna wada - nie można takiego pliku modyfikować w wygodny sposób (pozostaje grzebanie w kodzie, ustawianie przywilejów itd...).

Aby mieć możliwość edycji, musimy zapisać dane najlepiej w postaci wartości odzielonych od siebie (w tym przypadku) operatorami.

Aby przetestować tą metodę utwórz trzy pliki:
formularz.htm
zapis.php3
edycja.php3

formularz.htm
--------------------------------------------------
<form action="zapis.php3" method="post">
<input type="hidden" name="ok" value="1"><br>
<input type="text" name="zmienna1" size="45"><br>
<input type="text" name="zmienna2" size="45"><br>
<input type="text" name="zmienna3" size="45"><br>
<input type="submit" value="submit">
</form>
--------------------------------------------------
w pliku formularz mamy trzy pola do wprowadzania
danych, dane z tych pól przesyłamy do pliku zapis.php3

zapis.php3
--------------------------------------------------
<?
$dane="||$zmienna1||$zmienna2||$zmienna3";
$file="plik.txt";
$fp=fopen("$file", "w");
flock($fp, 2);
fwrite($fp, $dane);
flock($fp, 3);
fclose($fp);
?>
--------------------------------------------------
w pliku zapis.php3 formatujemy dane na zasadzie
zmienna - operator - zmienna - operator - itd...
i zapisujemy do "plik.txt" (nie zapomnij o uprawnieniach
dla plik.txt - chmod 666)

edycja.php3
--------------------------------------------------
<?
$file = file("plik.txt");
$total = count($file);
for($i=0; $total > $i; $i++){
$split = explode("||", $file[$i]);
}
?>

<form action="zapis.php3" method="post">
<input type="text" name="zmienna1" size="45" value="<? echo $split[1]; ?><br>
<input type="text" name="zmienna2" size="45" value="<? echo $split[2]; ?><br>
<input type="text" name="zmienna3" size="45" value="<? echo $split[3]; ?><br>
<input type="submit" value="submit"><br>
</form>
--------------------------------------------------

W pliku edycja.php3 dzieje się najważniejsza część o którą chodzi w tej poradzie. Pobieramy dane z pliku (plik.txt) dzielimy dane pomiędzy operatorami i zamieniamy w tablicę. Każdy wpis pomiędzy operatorami jest przenumerowany i według kolejności wstawiony do pól tekstowych formularza do edycji (znaki operatorów są przy tej operacji usunięte. I tak mamy stworzone "zamknięte koło", które możemy cały czas modyfikować i wprowadzać zmiany.

Metoda ta świetnie sprawdza się w przypadku np. mało skomplikowanego cennika, który od czasu do czasu trzeba modyfikować.


.: Usuwanie slasha :.
Załóżmy że w danych wysyłanych z formularza znajdują się przykładowo znaki specjalne np. "" lub \

Php zapisze nam to w postaci \"\" oraz \\

Znak \ dezaktywuje znaki specjalne, co oczywiście w wyświetlanym tekście może zmieniać sens wpisu lub wprowadzać w błąd.

Aby usunąć slashe używamy funkcji StripSlashes()

Załóżmy że z formularzu mamy pole tekstowe o nazwie dane, aby uniknąć przy zapisywaniu problemu ze slashami należy wstawić poniższy fragment do kodu.

$dane=StripSlashes($dane);

W przykładzie może to wyglądać np. tak:

<?
$dane=StripSlashes($dane);
$file="nazwa_pliku.htm";
$fp=fopen("$file", "a");
flock($fp, 2);
fwrite($fp, $dane);
flock($fp, 3);
fclose($fp);
?>

Dzięki tej metodzie zapiszemy dane w poprawny sposób.


.: Jak działa licznik kliknięć :.
Licznik kliknięć to nic innego jak zwykły licznik, tyle że wywołany poprzez kliknięcie. Przykład poniżej ilustruje przykładowy licznik kliknięć dla plików.

Dla tego przykładu zakładamy plik dn.php3 w którym umieszczamy poniższy kod, plik readme.txt oraz katalog "liczniki" (o przywilejach 777) Ponadto na testowej stronie umieszczamy następujący link:
<a href=dn.php3?dn=readme.txt>czytaj to</a>

<?
$download = "$dn"; //zmienna zawierająca nazwę pliku
if (file_exists("liczniki/$dn.n")){ //sprawdzamy czy plik istnieje

//początek licznika

$file=fopen("liczniki/$dn.n", "r");//jeśli tak otwieramy licznik i doliczamy kliknięcie
flock($file, 1);
$cyfra=fgets($file, 100);
flock($file, 3);
fclose($file);
$cyfra++;

$file=fopen("liczniki/$dn.n", "w");
flock($file, 2);
fwrite($file, $cyfra);
flock($file, 3);
fclose($file);

//koniec licznika

header("Location: $download");//wysłanie do przeglądarki informacji o lokalizacji pliku
}
else { //jeśli plik licznika nie istnieje zostanie założony z liczbą 1
$file=fopen("liczniki/$dn.n", "w");
flock($file, 2);
fwrite($file, "1");
flock($file, 3);
fclose($file);

header("Location: $download");//wysłanie do przeglądarki informacji o lokalizacji pliku
}
?>

Pozostaje już tylko wyświetlenie zawartości pliku licznika możemy to zrobić choćby tak:
Ten plik pobrano: <? include("liczniki/readme.txt.n"); ?> razy.

Powyższy przykład pokazuje tylko ogólną zasadę działania, klikomierz można oczywiście rozbudować o zbiorcze wyświetlanie ilości kliknięć, sortowanie według ilości pobrań itd, itd...


.: Data na stronie :.
Nic prostszego już chyba w php nie ma. Aby wprowadzić datę do strony możesz posłużyć się funkcją date();

Przykład:
<?
$data = date("Y-m-d H:i:s");
echo"$data";
?>
powyższy przykład wyświetli nam datę w formacie np:
2001-09-01 18:34:05

Oczywiście możemy wyświetlić każdy element z osobna np:

<?
$data = date("Y"); // rok
echo"$data";
//itd...
?>

Nie ma też problemów z formatowaniem daty
czy to będzie: $data = date("Y-m-d");
czy $data = date("Y m d"); to już zależy
od Ciebie.

Proste prawda?

W JavaScripcie trzeba było by napisać klika lini żeby zrobić to samo :-)


.: Licznik tekstowy :.
Liczniki są czasem bardzo przydatne, a zarazem niezwykle proste do wykonania.

Na początku przez znacznikiem html umieść funkcję, która wstawi informację dla przeglądarki odwiedzającego w postaci cookies:

<? setcookie("gosc", "1", time()+3600*3); ?>

następnie w kodzie strony pomiędzy znacznikami body umieść następujący kod php:

<?
if($gosc!="1"){
$file=fopen("licznik.txt", "r"); //otwieranie pliku licznika do odczytu
flock($file, 1); //blokowanie do odczytu
$cyfra=fgets($file, 100);//pobieramy z pliku cyfrę
flock($file, 3); //odblokowanie po odczycie
fclose($file);
$cyfra++; //dodanie punktu do licznika

$file=fopen("licznik.txt", "w");//otwieranie pliku licznika do zamazania
flock($file, 2); //blokowanie do zapisu
fwrite($file, $cyfra); //zapis stanu licznika
flock($file, 3); //odblokowanie po zapisie
fclose($file);
echo"$cyfra";//wyświetlenie cyfry na stronie
}
// jeśli użytkownik był już przed chwilą na stronie wykona się instrukcja poniżej
else {
$file=fopen("licznik.txt", "r"); //otwieranie pliku licznika do odczytu
flock($file, 1); //blokowanie do odczytu
$cyfra=fgets($file, 100);//pobieramy z pliku cyfrę
flock($file, 3);//odblokowanie po odczycie
fclose($file);//zamykamy plik
echo"$cyfra";//wyświetlenie cyfry na stronie
}
?>

Licznik na początku wprowadzi informacje do cookies na komputerze użytkownika, tak aby licznik w przeciągu określonego czasu nie nabijał punktów. Podczas odwiedzin ktoś mógłby klka razy wejść na daną stronę i nabić punkt na liczniku co wprowadzało by nas w błąd
co do ilości odwiedzin.
Następnie licznik sprawdza czy wartość cookies równa jest 1, jeśli tak wykonuje się instrukcja warunkowa dodająca i wyświetlająca punkt. Jeśli użytkownik już był przed chwilą na tej stronie otwarty zostanie tylko plik licznika i wyświetlona jego wartość.


.: Zapis do pliku :.
Aby poprawnie i bezpiecznie zapisywać dane do plików, musimy poznać klika istotnych funkcji.

Pierwsza najważniejsza funkcja to fopen() - otwórz plik

$fp=fopen("atrybut1", "atrybut2");

Funkcja ta posiada dwa atrubuty: pierwszy to nazwa pliku, drugi to tryb otwarcia.

Tryby otwarcia to po prostu określenie czy plik ma zostać otwarty tylko do odczytu, zapisu, zamazania itp...

Nam najbardziej będą służyć na początek cztery tryby:

1. tryb "a" - otwarcie do dopisania wartości
2. tryb "r" - otwarcie do odczytu
3. tryb "r+" - otwarcie do odczytu i dopisania
4. tryb "w" - otwarcie do zapisania, poprzednia zawartość pliku jest zamazywana

I tak na przykład aby otworzyć i dopisać np. maila do listy mailowej funkcja fopen() będzie wyglądała tak:

$fp=fopen("lista.txt", "a");

Druga funkcja to fwrite() lub fputs()
obydwie funkcje służą do zapisu danych do plku.

w kodzie będzie to więc wyglądać np. tak:

<?
$dane="tekst do wprowadzenia\n";
$file="lista.txt";
$fp=fopen("$file", "a");
fwrite($fp, $dane);
fclose($fp);
?>

w powyższym przypadku tekst zawarty w zmiennej $dane zostanie dopisany na końcu pliku.

No tak, ale co się stanie jeśli jednocześnie Ala i Zuzia będą nam wprowadzać dane, istnieje duża możliwość że zawartość pliku zostanie po prostu zniszczona. Aby tego uniknąć trzeba poznać jeszcze jedną funkcję flock(). Funkcja ta również posiada dwa atrybuty, pierwszy to nazwa pliku przechowywana już w zmiennej $fp, drugi to cyferka. flock() pozwala nam na zablokowanie pliku na czas odczytu lub zapisu. W kodzie będzie to teraz wyglądać tak:

<?
$dane="tekst do wprowadzenia\n";
$file="lista.txt";
$fp=fopen("$file", "a");
flock($fp, 2); //blokujemy
fwrite($fp, $dane);
flock($fp, 3); //odblokowujemy
fclose($fp);
?>

Jeszcze jedną istotną rzeczą jest to że do odczytu drugi parametr flock() będzie wynosił 1 przy blokowaniu i 3 przy odblokowywaniu.

Natomiast przy otwarciu do zapisu drugi parametr flock() będzie wynosił 2 przy blokowaniu i 3 przy odblokowywaniu.

To tyle na początek, aby poćwiczyć na najprostszych przykładach...


.: Jak wczytać do strony dane z innych plików :.
Jedną z podstawowych rzeczy jakie musimy opanować to umiejętność wstawiania wprowadzanych przez użytkowników danych. Odczyt i zapis do pliku to podstawowa rzecz jaką musisz opanować chcąc zacząć zabawę z php. Poniżej możesz zobaczyć przykłady wstawiania / wczytywania danych z innych plików.

- odczyt lini /przykład ten pobiera tylko pierwszą linię pliku, metoda wykorzystywana na przykład w licznikach/:

<?
$file="plik.txt";
$fp=fopen("$file", "r");
flock($fp, 1);
$dane=fgets($fp, 100);
flock($fp, 3);
fclose($fp);
?>

- odczyt całego pliku /w tym przykładzie pętla while pobiera linię po lini aż skończy się plik/:

<?
$file="plik.txt";
$size=filesize("$file"); // tu ważymy plik
$fp=fopen($file, "r");
flock($fp, 1); //blokujemy plik
while($buffer=fgets($fp, $size));
echo $buffer;
flock($fp, 3); //odblokowujemy plik
fclose($fp);
?>

- wczytanie pliku:

załóżmy że chcemy wczytać kod php3 do edycji online w okienko tekstowe, normalnie kod wykonałby się a wklejony tekst byłby dla nas nie przydatny.

możemy to zrobić funkcją readfile():

<textarea><? $file="plik.php3"; readfile("$file"); ?></textarea>

efektem tego będzie wstawienie w okno tekstowe zawartości pliku plik.php3 bez jego wykonania

- wstawienie pliku:

aby wstawić zawartość pliku do strony wykorzystujemy funkcji include() np:

<? $file="plik.php3"; include("$file"); ?>

To oczywiście tylko kilka przykładów, jak wstawić zawartość plików do stron, istnieje jeszcze wiele możliwości nadbudowania tych skryptów, ale na początek myślę że tyle wystarczy...


.: Wszystkie strony w jednej :.
Niekiedy gdy potrzebujemy wykonać stronę np. z dużą ilością opisów można zastosować metodę wstawiania odpowiednich tekstów z plików. Utwórz stronę np. pokaz.php3 i umieść w niej następujący kod:

<?
$rozsz=".txt";
if(file_exists("opisy/$show$rozsz")){ //sprawdza czy plik do wstawienia istnieje
include("opisy/$show$rozsz");
}
else {
include("opisy/index$rozsz"); // jeśli nie ma pliku, lub parametru wstawia text dla strony głównej
}
?>

W katalogu opisy załóż pliki o nazwach np. kontakt.txt oraz index.txt

Na stronie musisz umieścić linki:

<a href=pokaz.php3?show=kontakt>kontakt</a><br>
<a href=pokaz.php3?show=index>strona główna</a>

parametr show=nazwa w linku spowoduje wstawienie odpowiedniego pliku *.txt do strony pokaz.php3, jeśli plik nie istnieje lub link nie posiadał parametru show, strona wstawia plik dla strony głównej.

To oczywiście najprostszy przykład, obrazujący obsługę stron w jednym pliku, przy odrobinie wyobraźni można sobie tą metodą naprawdę dużo pomóc.


.: Pobieranie informacji o odwiedzających :.
W PHP nie musimy się wiele natrudzić przy pobieraniu informacji o odwiedzających, z pomocą przyjdą nam na pewno zmienne predefiniowane (nadawane automatycznie).

Do zbierania informacji mogą posłużyć nam przykładowe zmienne:

$HTTP_REFERER - pełny adres dokumentu,
$HTTP_USER_AGENT - sygnatura przeglądarki
$REMOTE_HOST - nazwa hosta z którego się odwołano
$REMOTE_ADDR - adres ip komputera z którego się odwołano

przykład:

<?
$browser=$HTTP_USER_AGENT;
$ip=$REMOTE_ADDR;
$host=gethostbyaddr($ip); //funkcja pobierająca nazwę hosta ze zmiennej $ip
echo"Twoja przeglądarka to $browser, adres ip: $ip, wszedłeś z hosta: $host";
?>

powyższy przykład prezentuje w jaki sposób możesz pobrać najprostsze dane o odwiedzającym. Oczywiście wszystko można zapisać do plików, i wyświetlać później w formie statystyk. Oczywiście sygnatura przeglądarki nie będzie bardzo czytelna dla użytkownika, wykorzystać tu można wykrywanie ciągu znaków, a następnie zamianę wpisu na czytelny zapis np:

<?
$browser=$HTTP_USER_AGENT;
$ip=$REMOTE_ADDR;
$host=gethostbyaddr($ip); //funkcja pobierająca nazwę hosta ze zmiennej $ip

if(ereg("IE", $browser)) $browser = "Microsoft Internet Explorer";

echo"Twoja przeglądarka to $browser, adres ip: $ip, wszedłeś z hosta: $host";
?>

To oczywiście tylko drobny przykład, aby zrobić bardziej skomplikowanego "szpiega", trzeba by się posłużyć JavaScriptem, ponieważ php nie umie wykryć wielu rzeczy np. rozdzielczości ekranu odwiedzającego, ale o tym innym razem...


.: Hasło sieciowe :.
Aby twoja strona otwierała się na hasło, umieść poniższy kod na stronie przed znacznikiem <html>. Po otwarciu strony pokaże się okno do wprowadzenia hasła sieciowego.

<?php
$login="twój_login";
$pass="twoje_hasło";
if(!isset($PHP_AUTH_USER) ||
strcmp($PHP_AUTH_USER,$login)
||
strcmp($PHP_AUTH_PW,$pass)) {
Header("WWW-Authenticate: Basic realm=Obszar");
Header("HTTP/1.0 401 Unauthorized");
echo "Brak uprawnień do przeglądania strony";
exit;
}
?>


.: Rozsyłanie wiadomości z listy mailowej :.
Utwórz plik np: lista.txt w której masz zapisane adresy Twoich subskrybentów (adresy muszą być umieszczone linia po lini, lub ze znakami podziału wiersza). Zasada działania jest prosta pobieramy dane z pliku lista.txt i zamieniamy w tablice.Następnie wykonuje się pętla pobierająca kolejną pozycję z tablicy i wstawiająca ją do instrukcji, która rozsyła wiadomość.

przykład:

<form>
temat:<br>
<input type="text" name="temat"><br>
treśc:<br>
<textarea rows="7" name="tresc" cols="40"></textarea><br>
<input type="submit" name="submit" value="wyślij">
</form>
<?
if($submit){
$header = "From: Lista mailowa <adres@com.pl>";
$adresy = file("lista.txt");
for ($index=0; $index < count($adresy); $index++)
{
mail("$adresy[$index]","$temat","$tresc","$header");
}
echo"Wiadomość została rozesłana";
}
?>