Wpisy otagowane ‘echo’

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 \'.';
?>


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


Programowanie obiektowe w PHP

środa, 10 Listopad 2010

Dzięki programowaniu obiektowemu możemy tworzyć rozbudowane programy w uporządkowany sposób. Umożliwia nam to podział programu na odrębne części – klasy. W klasie wyodrębniamy fragmenty programów, które są jakąś logiczną całością, odpowiadającą za jedną funkcjonalność, albo jeden spójny zbiór danych.

Ta logiczna całość może być wykorzystana wiele razy w jednym programie, jak również w innych programach. W miejscu, gdzie chcemy użyć daną klasę, tworzymy obiekt tej klasy. Obiektów może być kilka. Stosujemy je wszędzie tam, gdzie potrzebna jest nam dana funkcjonalność, jeżeli tę funkcjonalność musimy zmienić, robimy to w jednym miejscu – w definicji klasy. Skutki tej zmiany będą widoczne wszędzie tam, gdzie występują obiekty tej klasy.

Podobna sytuacja występuje w przypadku, gdy w programie wystąpi jakiś błąd. Ten sam błąd może wystąpić w wielu miejscach, ale dzięki temu, że program jest oparty na klasach i obiektach tych klas, to przyczyna błędu występuje tylko w jednym miejscu w kodzie całego programu – w definicji klasy. Gdy usuniemy błąd, usterka znika z każdego miejsca, w którym wystąpiła.

I coś, co dla wielu będzie prawdopodobnie najważniejszą zaletą. Umiejętność programowania obiektowego umożliwia używanie frameworków i stosowanie wzorców projektowych, co szalenie ułatwia i przyspiesza proces powstawania programów.

Teraz jak to wygląda w praktyce. Utworzę klasę Notatka

class Notatka
{
	private $autor;
	private $notatka;
 
	public function zapisz_autora($autor)
	{
		$this->autor=$autor;
	}
 
	public function zapisz_notatke($notatka)
	{
		$this->notatka=$notatka;
	}
 
	public function wyswietl()
	{
		echo '<h2>'.$this->autor.'</h2>';
		echo '<p>'.$this->notatka.'</p>';
	}
}
 
$obiekt =new Notatka();
$obiekt->zapisz_autora($_POST['autor']);	
$obiekt->zapisz_notatke($_POST['notatka']);	
$obiekt->wyswietl();

Klasa

Klasa jest prototypem obiektu – strukturą zawierającą zarówno dane (pola klasy) jak i funkcje (metody klasy).
Klasę definiuje się słowem kluczowym class po którym podajemy nazwę klasy, a następnie wewnątrz nawiasów klamrowych definiujemy jej pola i metody.

Obiekt

Obiekt jest instancją klasy zawierającą się w konkretnej zmiennej wykorzystywanej w kodzie programu.
Obiekt danej klasy tworzy się podstawiając do zmiennej instancję klasy tworzoną operatorem new. Dostęp do pól i metod klasy następuje poprzez nazwę zmiennej, operator ->, a następnie nazwę pola lub metody. Dostęp do pól i metod wewnątrz klasy otrzymuje się poprzez referencję $this->

Kwalifikatory dostępu

Definiując wewnątrz klasy pola i metody używamy kwalifikatorów dostępu. Do dyspozycji mamy trzy kwalifikatory dostępu: public, private, protected. Składowe o dostępie public są dostępne zarówno wewnątrz klasy jak i na zewnątrz. Do składowych o dostępie private dostęp istnieje jedynie z wewnątrz klasy, w której składowa została zdefiniowana. Do składowych o dostępie protected dostęp istnieje jedynie z wewnątrz klasy, w której składowa została zdefiniowana, oraz klas potomnych.

Metody

Metody klasy są funkcjami zdefiniowanymi wewnątrz klasy. Stosują się do nich wszystkie zasady związane ze zwykłymi funkcjami z uwzględnieniem kwalifikatorów dostępu.

Pola

Pola klasy są składowymi klasy przechowującymi dane dowolnego typu. Stosują się do nich wszystkie zasady dotyczące zwykłych zmiennych z uwzględnieniem kwalifikatorów dostępu.



Podstawy wyświetlania danych w php

piątek, 27 Listopad 2009

Częstym problemem programistów (nie tylko początkujących) jest optymalizacja kodu. Tymczasem mało kto przejmuje się najprostszymi metodami odciążania serwera. Bo czy jest coś prostszego i bardziej powszechnego niż wyświetlanie tekstu przez php. W tym tekście zajmę się instrukcją echo, ale przedstawione zasady są dosyć uniwersalne i przez większość osób niestety zaniedbywane.

echo jest najprostszą instrukcją do wyświetlania tekstu. Można wywołać ją z tekstem przekazanym przez zmienną:

<?php
$tekst='Ala ma kota.';
echo $tekst;
?>

przez łańcuch znaków umieszczony w apostrofach:

<?php
echo 'Ala ma kota.';
?>

lub łańcuch znaków umieszczony w cudzysłowie:

<?php
echo "Ala ma kota.";
?>

Wszystkie trzy sposoby wyświetlą dokładnie to samo. Można też przekazać do instrukcji echo tekst razem ze zmiennymi.

<?php
$zwierz='kota';
echo "Ala ma $zwierz.<br />";
$zwierz='tygrysa';
echo "Ala ma $zwierz.";
?>

Efektem powyższego będą dwie linijki tekstu:

Ala ma kota.
Ala ma tygrysa.

Zmienne umieszczone w cudzysłowie zostaną zinterpretowane. Inaczej jest w przypadku apostrofów. Kod w postaci:

<?php
$zwierz='kota';
echo 'Ala ma $zwierz.<br />';
$zwierz='tygrysa';
echo 'Ala ma $zwierz.';
?>

da efekt nieco odmienny:

Ala ma $zwierz.
Ala ma $zwierz.

Czysty tekst lepiej jest umieszczać w apostrofach niż w cudzysłowie. Cała zawartość cudzysłowu jest przetwarzana przez php co bardziej obciąża serwer. Przy jednej linijce i małej liczbie odwiedzin można to pominąć, ale przy większym serwisie to już jest różnica. Umieszczając tekst ze zmiennymi najlepiej jest stosować apostrofy dla tekstu, a zmienne dołączać operatorem konkatenacji (czyli kropki).

<?php
$zwierz='kota';
echo 'Ala ma '.$zwierz.'.<br />';
$zwierz='tygrysa';
echo 'Ala ma '.$zwierz.'.';
?>

Tu efekt będzie zgodny z oczekiwaniami, a przy tym serwer mniej obciążony.

Ala ma kota.
Ala ma tygrysa.

Jeżeli już ktoś upiera się przy cudzysłowie, to nie ma powodu stosować operatora konkatenacji. Dwie pierwsze linie kodu będą dawały identyczny efekt i podobnie obciążają serwer. Trzecia linia jest bardziej przyjazna dla procesora.

<?php
echo "Zamówienie nr" . $numer . " zostało przyjęte przez " . $user;
echo "Zamówienie nr $numer zostało przyjęte przez $user";
echo 'Zamówienie nr' . $numer . ' zostało przyjęte przez ' . $user;
?>