Wpisy otagowane ‘PHP’

Kto trafił szóstkę?

czwartek, 6 Grudzień 2012

Poprzedni artykuł zakończyłem krótkim zadaniem. Prosiłem o policzenie, bez wykonywania tego kodu na serwerze, jaką liczbę wyświetli poniższy kod.

<?php
	$a=8;
	echo $a--+5*--$a+3*$a--+$a++-2*$a;
?>

Nie kwapiliście się specjalnie z odpowiedziami. Nie wiem, czy to brak pewności siebie, by ujawnić swoje obliczenia, czy niechęć do liczenia czegokolwiek. Fakty są takie, że 3 osoby podały 5 odpowiedzi, a żadna z nich nie była poprawna. W związku z tym postanowiłem wyjaśnić ten, przyznam że podchwytliwy, przykład. W tym celu rozbiję obliczenia na kilka kolejnych etapów, z których każdy opatrzę komentarzem. Dla przypomnienia: ++ zwiększa wartość zmiennej o 1, –– zmniejsza. Operator przed zmienną zmienia jej wartość przed jej użyciem, za zmienną po jej użyciu

<?php
	$a=8;
	echo $a--;				//W tej linii operator zmniejsza wartość zmiennej o 1, ale po jej użyciu. 
						//$a jest równe 7, ale użyte w instrukcji (wyświetlone) było 8 
						//(operator za zmienną).
 
	$a=8;
	echo $a--+5*--$a;			//Do 8 dodajemy 5*6. Wartość zmiennej $a została ponownie zmniejszona. 
						//Tym razem przed jej użyciem (operator przed zmienną). Instrukcja wyświetli 38
 
	$a=8;
	echo $a--+5*--$a+3*$a--;		//Do 38 dodajemy 3*6, ale $a równe jest 5. Użyta była wartość przed 
						//zmniejszeniem (operator za zmienną). Instrukcja wyświetli 56
 
	$a=8;
	echo $a--+5*--$a+3*$a--+$a++;		//Do 56 dodajemy poprzednią wartość $a czyli 5, a następnie 
						//zwiększamy ją o 1 (operator za zmienną). Instrukcja wyświetli 61
 
	$a=8;
	echo $a--+5*--$a+3*$a--+$a++-2*$a;	//Od 61 odejmujemy 2*6. Instrukcja wyświetli 49
?>


Operatory arytmetyczne w PHP

sobota, 1 Grudzień 2012

W PHP operatory służą do wykonywania działań na zmiennych. Jest to zagadnienie dosyć proste, ale w pewnych przypadkach bywa dosyć ciekawe. Na tych właśnie przypadkach będę chciał się skupić. Dla porządku przedstawiam tabelkę zawierającą operatory arytmetyczne z przykładami ich zastosowania.

operator przeprowadzana operacja
+ dodawanie $a=$b+3;
- odejmowanie $a=$b-3;
* mnożenie $a=$b*3;
/ dzielenie $a=$b/3;
% dzielenie modulo (zwraca liczbę całkowitą stanowiącą resztę z dzielenia)
++ inkrementacja $a++ ( dodaje do zmiennej wartość 1)
–– dekrementacja $a––(odejmuje od zmiennej wartość 1)

Myślę, że 4 pierwsze operatory nie wymagają żadnych wyjaśnień. Kolejny operator % czyli dzieleni modulo wyjaśnię na dodatkowym przykładzie. Załóżmy, że mamy do wyświetlenia na stronie 37 ikonek. Chcemy to zrobić w tabelce mającej 4 kolumny. Od razu widać, że ostatni wiersz tabeli nie będzie wypełniony do końca. Aby tabelka wyglądała przyzwoicie, musimy wiedzieć ile pustych komórek należy umieścić w ostatnim wierszu. Tę wartość możemy policzyć np. w taki sposób:

<?php
	$elementy = array('ikona1.png', 'ikona2.png', ..., 'ikona37.png');	//tablica z 37 ikonkami
	$liczba_kolumn = 4;
	$liczba_pustych_komorek_na_w_ostatnim_wierszu = $liczba_kolumn - count($elementy) % $liczba_kolumn;
?>

Mam tablicę $elementy z 37 ikonkami i zmienną $liczba_kolumn. W kolejnej instrukcji funkcją count() obliczam ilość elementów tablicy i otrzymuję wartość 37. Na otrzymanym wyniku wykonuję operację modulo (%), która w wyniku daje mi wartość 1. Odejmuję tę wartość od liczby kolumn i otrzymuję ilość komórek, które muszę uzupełnić.

Kolejne dwa operatory to inkrementacja i dekrementacja. Obydwa mogą występować zarówno przed, jak i po zmiennej. Jeżeli występują przed, to wartość zmiennej jest najpierw zmieniana przez operator, a dopiero potem nowa wartość jest wykorzystywana. Jeżeli operator jest umieszczony za zmienną, to najpierw wykorzystywana jest wartość zmiennej, a dopiero później działa operator inkrementacji lub dekrementacji.

Doskonale zdaję sobie sprawę, że powyższe wyjaśnienie może być mało czytelne, dlatego posłużę się ponownie przykładem:

<?php
	$a=5;
	echo $a++;		//najpierw wyświetlana jest wartość zmiennej - czyli 5, a następnie operator '++' zmienia jej wartość do 6.
	echo $a;		//wyświetlana jest nowa wartość - czyli 6
	echo ++$a;		//ty razem najpierw zwiększa się wartość zmiennej do 7 i ta właśnie nowa wartość jest wyświetlana
?>

Myślę, że teraz wszyscy już doskonale rozumieją na czym to polega. Jeżeli ktoś chciałby się sprawdzić, to proszę policzyć, ale bez komputera, jaki wynik wyświetli poniższy kod. Wyniki proszę podawać w komentarzach. Jeżeli zetknąłeś się z tym tematem po raz pierwszy, nie przejmuj się, jeżeli sprawi Ci trudność. Na jednym ze szkoleń, które ostatnio prowadziłem, przy 8 uczestnikach, padło 9 różnych odpowiedzi.

<?php
	$a=8;
	echo $a--+5*--$a+3*$a--+$a++-2*$a;
?>


Typ string, czyli ciągi znaków w PHP

czwartek, 27 Wrzesień 2012

Jako ciąg znaków traktowane są wszystkie napisy znajdujące się pomiędzy ‘ a ‘ lub " a ". Przy tym ciągi znaków umieszczone pomiędzy " a " są interpretowane przez PHP. W związku z tym wpisanie poniższych linijek kodu nie we wszystkich przypadkach da te same rezultaty.

<?php
  $wiek=3;
  echo '<p>Ala ma 3 lata.</p>';
  echo "<p>Ala ma 3 lata</p>";
  echo "<p>Ala ma $wiek lata</p>";
  echo '<p>Ala ma $wiek lata</p>';
  echo "<p>Ala ma $wiek lata</p>";
  echo '<p>Ala ma '.$wiek.' lata</p>';
  echo "<p>Ala ma ".$wiek." lata</p>";
?>

Aby wewnątrz " i " wyświetlić znaki specjalne należy je „zacytować” – poprzedzić symbolem „\” (backslash).

<?php
  $lata=36;
  echo "Zmienna \$lata ma wartość $lata.";
?>

Najczęściej wykorzystywane znaki specjalne to:

  • \$ – dolar
  • \” – podwójny apostrof
  • \n – koniec linii
  • \r – powrót karetki
  • \t – tabulator

W przypadku ciągów znaków w pojedynczych apostrofach, cytowania wymaga jedynie apostrof.

<?php
  echo 'Ciąg znaków umieszczony pomiędzy \' a \'.';
?>


True lub false – typ logiczny w PHP

piątek, 14 Wrzesień 2012

W tym artykule przedstawię typ logiczny (bool), Zmienne tego typu mogą przyjmować dwie wartości logiczne – prawda lub fałsz; zapisane jako true i false. Wartości mogą być też zapisane wielkimi literami.

<?php
  $prawda=true;
  $falsz=false;
?>

Do rzutowania na typ logiczny służy (bool) lub (boolean). Wartości innych typów przy rzutowaniu na typ logiczny będą przyjmowały wartość false w przypadkach:

  • liczba całkowita 0
  • liczba zmiennoprzecinkowa 0.0
  • pusty ciąg znaków
  • ciąg znaków ’0′
  • tablice z zerową ilością elementów
  • wartość null

<?php
  $nie=(bool)0;
  $tak=(boolean)34;
  $nie2=(bool)0.0;
  $nie3=(bool)'';
  $nie4=(bool)'0';
  $nie5=(bool)array();
  $nie6=(bool)null;
?>


Float, double, real czyli typ zmiennoprzecinkowy w PHP

środa, 29 Sierpień 2012

Kolejny artykuł o typach. Dziś przedstawię typ zmiennoprzecinkowy, czyli typ który pozwala zapisać wartości rzeczywiste np. 4.487376 albo 0.00000000000341

Wartości tego typu możemy zapisywać w notacji zwykłej i naukowej.

<?php
  $liczba5=9.49;		//Zapis zwykły
  $liczba6=19.401e-4;	//Notacja naukowa liczby  0.0019401
?>

Liczby zmiennoprzecinkowe mają ograniczoną precyzję. Zazwyczaj jest to 1.11e-16. Reprezentacja wewnętrna liczb zmiennoprzecinkowych powoduje, że ostatnia cyfra liczby nie jest całkowicie wiarygodna.

<?php
  echo (int)((0.7+0.1)*10);	//wyświetli 7
?>

Do rzutowania na typ zmiennoprzecinkowy służy (float), (double) lub (real). Jeżeli w obliczeniach pierwszym elementem jest liczba typu zmiennoprzecinkowego lub ciąg znaków, który po rzutowaniu jest typu zmiennoprzecinkowego, to wynik działania jest również rzutowany na typ zmiennoprzecinkowy.

<?php
  $liczba1=(float)'3.4';
  $liczba2=(double)4*2;
  $liczba3=(real)99;
  $liczba4=2.5*8;
  $liczba5='0.75'*4;
?>


Int, integer czyli typ całkowity w PHP

piątek, 17 Sierpień 2012

Jak pewnie wszyscy wiedzą w języku PHP tworząc nową zmienną nie podajemy jej typu. Typ zmiennej jest określany przez jej wartość. Są to podstawy i jeżeli przynajmniej próbowałeś programować w PHP, to powinno być dla Ciebie oczywiste. Nie oznacza to wcale, że do programowania nie potrzebna jest absolutnie żadna wiedza o typach. Dziś przedstawię kilka informacji o typie całkowitym.

Wartości tego typu możemy zapisywać w formie dziesiętnej, binarnej, ósemkowej i szesnastkowej.

<?php
  $liczba1=2012;		//Liczba dziesiętna
  $liczba2=-99;		//Liczba ujemna
  $liczba3=0b1001010;	//Liczba 2012 w zapisie binarnym
  $liczba4=03734;	//Liczba 2012 w zapisie ósemkowym
  $liczba5=0x7DC;	//Liczba 2012 w zapisie szesnastkowym
?>

Liczby całkowite w systemach 32 bitowych zawierają się w zakresie od -2147483647 do 2147483647, a w systemach 64 bitowych w zakresie od -9223372036854775807 do 9223372036854775807. Po przekroczeniu zakresu typ liczby zamieniany jest na float.

Do rzutowania na typ całkowity służy (int) lub (integer).

<?php
  $liczba1=(int)89/5;
  $liczba2=(integer)45/8;
  echo $liczba1.'<br />';
  echo $liczba2.'<br />';
?>

Rzutowanie powoduje przycięcie wartości wyrażenia do części całkowitej. W powyższym przypadku zostaną wyświetlone wartości 17 i 5.



Jak poprawiać cudzy kod czyli co w skrypcie piszczy.

czwartek, 29 Marzec 2012

Od jakiegoś czasu większość zleceń, które dostaję, dotyczy poprawiania i modyfikacji istniejących skryptów. Czasem jest to bardzo proste, ale nie zawsze. W zasadzie to prosto jest w małych skryptach składających się z kilku plików po kilkaset linii kodu. Większe projekty już takie nie są i dziwnym trafem nigdy nie posiadają aktualnej dokumentacji. Brzmi znajomo?

Nagle okazuje się, że zmienne, które trafiają do skryptu zostały przetworzone przez tajemnicze funkcje. Pojawiają się dziwne dane, a informacje, których się spodziewamy rozpłynęły się w meandrach protokołu HTTP. Co robić w takiej sytuacji?

Poniżej podaję trzy sposoby na poznanie interesujących informacji

Jak wyświetlić wszystkie zmienne przekazane do skryptu?

To stosunkowo proste i pewnie wielu z was zna ten sposób i stosuje, ale niektórzy nie dokopali się pewnie jeszcze do tego rozwiązania, więc proszę bardzo: print_r($GLOBALS);

Jak wyświetlić wszystkie zmienne zadeklarowane w skrypcie?

Wystarczy wywołać funkcję: print_r(get_defined_vars());

Jak wyświetlić wszystkie funkcje dostępne w skrypcie?

Wystarczy wywołać funkcję: print_r(get_defined_functions());

Mam nadzieję, że te informacje pomogą wielu z Was. Jeżeli chciałbyś podzielić się swoimi spostrzeżeniami, własnymi rozwiązaniami podobnych problemów, lub opisać jakąś ciekawszą sytuację, w której znalazłeś się rozwijając lub poprawiając cudzy kod, poniżej jest najlepsze do tego miejsce. Czekam na Twój komentarz.



Czy programowanie w PHP oznacza wcześniejszą emeryturę?

piątek, 9 Grudzień 2011

Na postawione w tytule pytanie nie udzielę jednoznacznej odpowiedzi. Będąc programistą z pewnością ma się większe możliwości. Jeżeli programujesz zawodowo, to już po kilku latach powinieneś zarabiać więcej niż większość ludzi wokół Ciebie. Taki zawód. Przekroczenie średniej krajowej nie jest w nim żadnym wyczynem. Natomiast co zrobisz z zarobionymi pieniędzmi, to już Twoja sprawa.

Jeżeli odpowiednio wcześniej zatroszczysz się o siebie, perspektywa wydłużonego wieku emerytalnego może Cię w ogóle nie dotyczyć. Jeżeli jednak będzie dotyczyć?

Dostałem dzisiaj od znajomej kilka zdjęć. Zainspirowały mnie one do wstukania tych kilku zdań. Posłużę się nimi również w roli podsumowania tego tematu. Możesz oczywiście mieć inne zdanie. Możesz chcieć podzielić się swoimi przemyśleniami ze mną i innymi czytelnikami. Skorzystaj z formularza na dole strony.

Programowanie w php oznacza wcześniejszą emeryturę.

Programowanie w php oznacza wcześniejszą emeryturę.

Programowanie w php oznacza wcześniejszą emeryturę.



Problemy z funkcjami.

czwartek, 15 Wrzesień 2011

Podczas niedawnych prac nad kursem dotyczącym integracji systemów płatności internetowych ze stroną WWW natknąłem się na wadliwe działanie funkcji htmlentities(). Problem polegał na tym, że ciągi znaków zakodowane w UTF-8 pomimo przesłania do funkcji informacji o kodowaniu, miały zamieniane litery ‘ó’ oraz ‘Ó’ na encje ‘&oacute;’ oraz ‘&Oacute;’. Sprawa wygląda dosyć dziwnie, bo szukając informacji o tym błędzie natknąłem się na kilka dyskusji i podobne problemy napotkali też inni programiści, ale niekoniecznie dotyczyły one tych samych liter.

Rozwiązanie problemu jest oczywiście dosyć proste. Należy encje zamienić z powrotem na odpowiedni litery. Należy przy tym pamiętać, by plik z kodem był również zakodowany w UTF-8.

<?php
	$value=htmlentities($value, ENT_COMPAT, 'UTF-8');
	$value=str_replace(array('&oacute;', '&Oacute;'), array('ó', 'Ó'), $value);
?>

Funkcja str_replace() zamienia w zmiennej $value fragmenty z tablicy, która jest pierwszym argumentem tej funkcji na elementy tablicy, która jest argumentem drugim.

Z kolei wczoraj, konfigurując portal pewnej szkoły zauważyłem, że w pewnych miejscach polskie znaki również nie wyświetlają się poprawnie. Przeglądarka poprawnie interpretowała kodowanie strony, również w bazie danych wszystkie napisy były zapisane prawidłowo. Po bliższym przyjrzeniu się problemowi, winowajcą okazała się funkcja strtolower() zmieniająca wszystkie znaki na małe. Funkcja ta również nie radziła sobie z kodowaniem UTF-8. W tym przypadku jednak znalazł się zamiennik: funkcja mb_strtolower(). Jej użycie dla tekstów kodowanych w UTF-8 wygląda następująco

<?php
	$tytul=mb_strtolower($tytul, 'UTF-8');
?>


Jak pobrać plik

czwartek, 8 Wrzesień 2011

Strony internetowe oprócz prezentowania rozmaitych treści często udostępniają swoje zasoby do pobrania. Jeżeli również chciałbyś umożliwić internautom pobieranie pewnych dokumentów, grafik, programów i wielu innych zasobów, z tego tekstu dowiesz się jak to zrobić.

Rozwiązanie jest bardzo proste, a do tego pozwala też ukryć rzeczywistą lokalizację plików. Przypuśćmy, że plik mapa.jpg znajduje się w katalogu tajne-dane. Jeżeli w jakimś miejscu na stronie umieścimy link:

<a href="tajne-dane/mapa.jpg">mapa.jpg</a>

to zdradzimy tajną lokalizację.

Natomiast link do dokumentu html lub skryptu php otworzy stronę lub uruchomi skrypt na serwerze. Wprawdzie w zdecydowanej większości tak właśnie powinno być, ale czasem potrzebujemy niestandardowych działań.

Rozwiązanie powyższych i wielu innych podobnych problemów sprowadza się do wysłania odpowiednich nagłówków do przeglądarki. Link umieszczony na stronie prowadzi do skryptu, który pozwala na pobranie innego pliku nawet z zupełnie innej lokalizacji. Skrypt możemy zapisać w katalogu głównym serwisu w pliku o nazwie mapa.php

<?php
 $file='tajne-dane/mapa.jpg';
 header('Content-disposition: attachment; filename='.basename($file));
 header('Content-type: image/jpeg');
 readfile($file);
?>

Chcemy udostępnić internautom do pobrania skrypt: jak-to-zrobilem.php? Tworzymy plik skrypt.php, a w nim:

<?php
 $file='jak-to-zrobilem.php';
 header('Content-disposition: attachment; filename='.basename($file));
 header('Content-type: text/plain');
 readfile($file);
?>

Teraz należy Ci się kilka słów wyjaśnienia. W pierwszej linii podstawiam do zmiennej $file nazwę pliku wraz ze ścieżką. Ścieżka nie będzie dla nikogo widoczna, więc nie zdradzamy lokalizacji tego pliku. Następna linia wysyła nagłówek z informacją o przesyłanym załączniku i jego nazwie. Zauważ, że zmienna $file jest przekazywana przez funkcję basename(), która zwraca samą nazwę pliku bez ścieżki dostępu. Trzecia linia wysyła informację o typie MIME załącznika. Najpopularniejsze typy MIME umieszczam nieco niżej. Ostatnia linia przy pomocy funkcji readfile() wczytuje wskazany plik.

Pamiętaj aby nie wyświetlać niczego w tym skrypcie. Sprawdź czy poza blokiem kodu PHP nie znajdują się żadne białe znaki.

Popularne typy MIME

  • pliki specyficzne dla programów
    • application/javascript – JavaScript
    • application/xhtml+xml – XHTML
    • application/x-shockwave-flash – pliki Adobe Flash
    • application/json – Notacja Obiektowa JavaScript JSON
  • pliki audio
    • audio/mpeg – MP3 lub inny MPEG audio
    • audio/x-ms-wma – Windows Media Audio
    • audio/vnd.rn-realaudio – RealAudio
    • audio/x-wav – WAV
  • pliki z grafiką
    • image/gif – Obraz GIF
    • image/jpeg – Obraz JPEG
    • image/png – Obraz PNG
    • image/tiff – Obraz TIFF
    • image/vnd.microsoft.icon – Obraz ICO
  • tekst zrozumiały dla ludzi lub kod źródłowy
    • text/css – Cascading Style Sheets (pliki styli css)
    • text/html – HTML
    • text/plain – Dane tekstowe
    • text/xml – eXtensible Markup Language
  • pliki wideo
    • video/mpeg – MPEG-1 wideo z multiplexed audio
    • video/mp4 – MP4 wideo
    • video/quicktime – QuickTime wideo
    • video/x-ms-wmv – Windows Media Video