PHP verilerini filtreleme ve doğrulama. Sık yapılan hatalar

boş işlev (11)

Sorgu dizgimden gelen bir $ _GET ["myvar"] değişkenim var (veya yok) ve bu değişkenin var olup olmadığını ve ayrıca değerin if ifademdeki bir şeyle eşleşip eşleşmediğini kontrol etmek istiyorum:

Yaptığım ve düşündüğüm şey yapmanın en iyi yolu değil:

if (isset ($ _ GET ["myvar"]) && $ _GET ["myvar"] == "bir şey"): bir şeyler yap

Bu basit bir durum, ancak bu $ myvar değişkenlerinin çoğunu karşılaştırmak istediğinizi hayal edin.

Yanıtlar

Bu, kabul edilen cevaba benzer, ancak bunun yerine in_array kullanır. Bu durumda boş () kullanmayı tercih ederim. Ayrıca PHP 5.4.0+ sürümünde bulunan yeni dize dizisi bildirimini kullanmanızı öneririm.

$ izin verilen = ["bir şey", "hiçbir şey"]; if (! boş ($ _ GET ["myvar"]) && in_array ($ _ GET ["myvar"], $ izin verilir)) (..)

İşte aynı anda birden fazla değeri test etmek için bir fonksiyon.

$ diziKeys = dizi_anahtarları ($ _ GET); $ izin verilen = ["bir şey", "hiçbir şey"]; function checkGet ($ diziKeys, $ izin verilir) (foreach ($ anahtar olarak $ diziKeys) (if (in_array ($ _ GET [$ anahtar], $ izin verilir)) ($ değerleri [$ anahtar];)) $ değerleri döndürür ;)

Tüm kendi yararlı işlevimi kullanıyorum eski (), hangi otomatik olarak değişkenleri bildirir.

$ element1 = exst ($ dizi ["anahtar1"]); $ val2 = exst ($ _ POST ["anahtar2"], "değersiz"); / ** * işlev exst () - Değişkenin ayarlanıp ayarlanmadığını kontrol eder * (kodunuzun herhangi bir yerine kopyalayın / yapıştırın) * * Değişken ayarlanmışsa ve yok boş değişkeni döndürür (dönüşüm yok) * Değişken ayarlanmamışsa veya boşsa, $ varsayılan değerini döndürür * * @param mixed $ var * @param mixed $ default * * @return mixed * / function exst (& $ var, $ default = "") ($ t = ""; if (! isset ($ var) ||! $ var) (if (isset ($ varsayılan) && $ varsayılan! = "") $ t = $ varsayılan;) else ($ t = $ var;) if (is_string ($ t)) $ t = trim ($ t); return $ t;)

Peki, sadece if ($ _ GET ["myvar"] == "something") ile idare edebilirsiniz, çünkü bu koşul değişkenin de var olduğunu varsayar. Değilse, ifade de false olarak değerlendirilir.

Yukarıdaki gibi koşullu olarak yapmanın uygun olduğunu düşünüyorum. Aslında zararı yok.

Sorum şu, değişkeni iki kez bildirmeden bunu yapmanın bir yolu var mı?

Hayır, iki kontrol yapmadan doğru yapmanın bir yolu yok. Ben de ondan nefret ediyorum.

Bunu aşmanın bir yolu, ilgili tüm GET değişkenlerini tek bir merkezi noktada belirli bir türdeki bir diziye veya nesneye aktarmak (çoğu MVC bunu otomatik olarak yapar) ve daha sonra ihtiyaç duyulan özellikleri ayarlamaktır. (İstek değişkenlerine kod aracılığıyla erişmek yerine.)

If (isset ($ _ GET ["myvar"]) == "bir şey")

Mellowsoon ve Pekka sayesinde burada biraz araştırma yaptım ve şunu buldum:

  • Kullanmadan önce (önerildiği gibi) her bir değişkeni (eğer öyleyse) kontrol edin ve boş olarak bildirin:
isset ($ _ GET ["myvar"])? $ _GET ["myvar"] = 0: 0;

* tamam bu basit ama harika çalışıyor, değişkeni bu satırdan sonra her yerde kullanmaya başlayabilirsiniz

  • Tüm durumlar için bir dizi kullanma:
$ myvars = dizi ("var1", "var2", "var3"); foreach ($ myvars as $ key)! isset ($ _ GET [$ key])? $ _GET [$ anahtar] = 0: 0;

* bundan sonra değişkenlerinizi kullanabilirsiniz (var1, var2, var3 ... vb.),

Not: Bir JSON nesnesi alan bir işlev daha iyi olmalıdır (veya patlama / patlama için basit bir sınırlandırılmış dize);

Daha iyi yaklaşımlar takdir edilir :)

GÜNCELLEME:

$ _GET yerine $ _REQUEST kullanın, bu şekilde $ _GET ve $ _POST değişkenlerini kapsarsınız.

İsset ($ _ REQUEST [$ anahtar])? $ _REQUEST [$ anahtar] = 0: 0;

Oyundan bulduğum çözüm bunu yapmak:

If ($ x = & $ _ GET ["myvar"] == "bir şey") (// $ x ile bir şeyler yapın)

Bir ipucu olarak, bu yaklaşımı düşünebilirsiniz:

Gerekli = dizi ("myvar" => "defaultValue1", "foo" => "değer2", "bar" => "değer3", "baz" => "değer4"); $ eksik = array_diff ($ gerekli, dizi_anahtarları ($ _ GET)); foreach ($ anahtar olarak $ eksik => $ varsayılan) ($ _GET [$ anahtar] = $ varsayılan;)

Varsayılanları ayarlarsınız ve alınmayan parametreleri varsayılana ayarlarsınız :)

Ne yazık ki, bunu yapmanın tek yolu bu. Ancak büyük dizilerle çalışmaya yönelik yaklaşımlar var. Örneğin, şöyle bir şey:

$ gerekli = dizi ("myvar", "foo", "bar", "baz"); $ eksik = array_diff ($ gerekli, dizi_anahtarları ($ _ GET));

$eksik değişkeni artık gerekli olan ancak $ _GET dizisinden eksik olan değerlerin bir listesini içerir. Mesajı ziyaretçiye göstermek için $ eksik dizisini kullanabilirsiniz.

Veya şöyle bir şey kullanabilirsiniz:

$ gerekli = dizi ("myvar", "foo", "bar", "baz"); $ eksik = array_diff ($ gerekli, dizi_anahtarları ($ _ GET)); foreach ($ m olarak eksik) ($ _GET [$ m] = null;)

Artık gerekli her öğenin bir varsayılan değeri vardır. Artık, anahtarın ayarlanmaması konusunda endişelenmeden if ($ _ GET ["myvar"] == "something") kullanabilirsiniz.

Yenile

Kodu temizlemenin başka bir yolu, bir değerin ayarlanıp ayarlanmadığını kontrol eden bir işlev kullanmaktır.

işlev getValue ($ anahtarı) (if (! Isset ($ _ GET [$ anahtar])) (yanlış döndür;) dönüş $ _GET [$ anahtar];) if (getValue ("myvar") == "bir şey") ( // Bir şeyler yap)

neden bunu yapmak için bir fonksiyon yaratmıyorsunuz, kontrol etmek istediğiniz değişkeni gerçek bir değişkene dönüştürün örn.

Fonksiyon _FX ($ isim) (if (isset ($$ isim)) $$ isim döndürür; aksi takdirde null döndürür;)

sonra _FX ("param") == "123" yaparsınız, sadece bir düşünce

Herhangi bir şeyi test etmek istiyorsanız, bunu yapmak için (çok) daha iyi kod buldum.

[[$ 1 = ""]] ise echo "$ 1 boş" değilse echo "$ 1 dolu" fi

Bütün bunlar neden? Bash'de bulunan her şey var, ancak varsayılan olarak boştur, bu nedenle test -z ve test -n size yardımcı olamaz.

[$ (# 1) = 0] ise, echo "$ 1 boştur" aksi takdirde echo "$ 1 doldurulur" fi

Bir değişken olup olmadığını kontrol etmek istiyorum. Şimdi şöyle bir şey yapıyorum:

Deneyin: NameError dışında myVar: # Bir şeyler yapın.

İstisnasız başka yollar var mı?


2018-05-09 13:10

Yanıtlar:

Yerel bir değişkenin varlığını kontrol etmek için:

Yerellerde () "myVar" varsa: # myVar var.

Global bir değişkenin varlığını kontrol etmek için:

Globallerde () "myVar" varsa: # myVar var.

Bir nesnenin bir niteliği olup olmadığını kontrol etmek için:

hasattr (obj, "attr_name") ise: # obj.attr_name var.


2018-05-09 13:16

Tanımlanmamış veya ayarlanmamış (örtülü veya açık olarak) değişkenleri kullanmak neredeyse her zaman kötüdür. Herhangiçünkü bu, program mantığının doğru şekilde düşünülmediğini ve tahmin edilemez davranışlara yol açmasının muhtemel olduğunu gösterir.

Sizinkine benzeyen bir sonraki numara, değişkenin biraz kullanmadan önce değer:

Deneyin: NameError hariç myVar: myVar = Yok # Artık Python'dan şikayet etmeden myVar'ı kullanmakta özgürsünüz.

Ancak yine de bunun iyi bir fikir olduğunu düşünmüyorum - bence bu durumdan kaçınmak için kodunuzu yeniden düzenlemelisiniz.


2018-05-09 13:19

Bir değişkenin olup olmadığını kontrol etmenin en iyi yolu try / hariç kullanmaktır. Ancak, yaptığınız şeyi yapmanın küreselleri ayarlamak/test etmekten daha iyi bir yolu neredeyse kesinlikle vardır.

Örneğin, bir işlevi ilk kez çağırdığınızda modül düzeyinde bir değişken başlatmak istiyorsanız, kodla şöyle bir şey yapsanız iyi olur:

Değişkenim = Yok def InitMyVariable (): my_variable Yok ise global my_variable: my_variable = ...


2018-05-09 13:27

nesneler / modüller için ayrıca

dir (obj) içinde "var"

Örneğin,

>>> class Bir Şey (nesne): ... pass ... >>> c = Bir şey () >>> ca = 1 >>> "a" in dir (c) True >>> "b" in dir (c) Yanlış


2017-10-28 18:39

Kolay yol, önce onu başlatmaktır myVar = Yok

Daha sonra:

myVar Hiçbiri değilse: # Bir şeyler yapın


2018-06-04 18:46

Tahminim, testin user97370'in cevabına benzer bir fonksiyonda kullanılacağı yönünde. Bu cevabı beğenmedim çünkü global isim alanını kirletiyor. Bunu düzeltmenin bir yolu, bunun yerine bir sınıf kullanmaktır:

Sınıf InitMyVariable (nesne): my_variable = Yok def __call __ (self): self.my_variable ise None: self.my_variable = ...

Bunu sevmiyorum çünkü kodu karmaşıklaştırıyor ve Singleton programlama modelini doğrular mı? Neyse ki Python, bir süreliğine fonksiyonların özniteliklere sahip olmasına izin verdi, bu da bize şu basit çözümü veriyor:

Def InitMyVariable (): InitMyVariable.my_variable Yok ise: InitMyVariable.my_variable = ... InitMyVariable.my_variable = Yok


2018-03-25 20:31

2018-05-09 13:12

Bu tür bir durumla başa çıkmak için genellikle iyi çalışan bir yol, değişkenin var olup olmadığını açıkça kontrol etmek değil, devam etmek ve muhtemelen var olmayan değişkenin ilk kullanımını bir denemede / NameError dışında sarmak.

Materyal esas olarak yeni başlayan web programcıları için tasarlanmıştır.

Tanıtım.

Genellikle kendi kendine yazılmış CMS'ye sahip olan veya acemi web programcıları tarafından yazılmış modülleri olan ve verileri korumak için neyin gerekli olduğunu anlamayan ve genellikle nasıl çalıştıklarını ve bunlarla tam olarak ne yapılması gerektiğini düşünmeden filtreleme işlevlerini kopyalayan müşterilerle görüşüyorum. .

Burada, verileri filtrelerken olası yaygın hataları mümkün olduğunca ayrıntılı olarak açıklamaya çalışacağım. PHP betiği ve verilerinizi nasıl düzgün bir şekilde filtreleyeceğinize dair basit ipuçları verin.

İnternette veri filtreleme hakkında birçok makale var, ancak bunlar tam değil ve ayrıntılı örnekler içermiyor.

Bilgilendirme.

Filtreleme. 1 numaralı hata
Sayısal değişkenler için aşağıdaki kontrol kullanılır:
$ sayı = $ _GET ["girdi_sayısı"]; if (intval ($ sayı)) (... SQL sorgusu yürüt ...)
neden yol açacak SQL enjeksiyonu? Mesele şu ki, kullanıcı değişkende belirtebilir Numara giriniz anlam:
1"+ BİRLEŞTİR + SEÇ
Bu durumda, kontrol başarıyla geçilecektir. intval işlevi, değişkenin tamsayı değerini alır, yani. 1, ancak değişkenin kendisinde $ sayısı hiçbir şey değişmedi, bu nedenle tüm kötü amaçlı kodlar SQL sorgusuna geçirilecek.
Doğru filtreleme:
$ sayı = iç değer ($ _ GET ["girdi_sayısı"]); if ($ sayı) (... SQL sorgusunu çalıştır ...)
Tabii ki koşul değişebilir, örneğin yalnızca belirli bir aralık almanız gerekiyorsa:
if ($ sayı> = 32 VE $ sayı<= 65)

Sayısal değerlere sahip onay kutuları veya çoklu seçim kullanıyorsanız şunu kontrol edin:
$ checkbox_arr = array_map ("intval", $ _POST ["onay kutusu"]);
dizi_haritası
Ayrıca şu şekilde filtreleme ile karşılaşıyorum:
$ sayı = htmlspecialchars (intval ($ _ GET ["giriş_numarası"]));
htmlözel karakterler
Veya:
$ sayı = mysql_escape_string (intval ($ _ GET ["input_number"]));
mysql_escape_string

Bir gülümsemeden başka bir şeye neden olamaz :)

Filtreleme. Hata # 2.
Dize değişkenleri için aşağıdaki filtreleme kullanılır:
$ input_text = lashes ($ _ GET ["input_text"]);
Addslashes işlevi özel durumlardan kaçar. karakterler, ancak veritabanı kodlamayı dikkate almaz ve filtreleme atlanabilir. Bu güvenlik açığını tanımlayan yazarın metnini kopyalamayacağım ve sadece Chris Shiflett'e bir bağlantı vermeyeceğim (çeviri Rusça İnternet'te bulunabilir).

mysql_escape_string veya mysql_real_escape_string işlevini kullanın, örnek:
$ input_text = mysql_escape_string ($ _ GET ["input_text"]);
girmeyi düşünmüyorsanız html etiketleri, o zaman aşağıdaki filtrelemeyi yapmak en iyisidir:
$ input_text = strip_tags ($ _ GET ["input_text"]); $ input_text = htmlözel karakterler ($ input_text); $ input_text = mysql_escape_string ($ input_text);
strip_tags - html etiketlerini soyun.
htmlspecialchars - özel dönüştürür. html varlığındaki karakterler.
Bu, SQL enjeksiyonu dışındaki XSS saldırılarından kendinizi koruyacaktır.
Html etiketlerine ihtiyacınız varsa, ancak yalnızca kaynak kodunu görüntülemek için, kullanmanız yeterlidir:
$ input_text = htmlözel karakterler ($ _ GET ["input_text"]); $ input_text = mysql_escape_string ($ input_text);

Değişkenin değerinin boş olmaması sizin için önemliyse, trim işlevini kullanın, örneğin:
$ input_text = kırpma ($ _ GET ["input_text"]); $ input_text = htmlözel karakterler ($ input_text); $ input_text = mysql_escape_string ($ input_text);

Filtreleme. 3 numaralı hata.
Veritabanı aramasıyla ilgilidir.
Sayılara göre arama yapmak için ilk hatada açıklanan filtrelemeyi kullanın.
Metne göre arama yapmak için ikinci hatada açıklanan filtrelemeyi kullanın, ancak uyarılarda bulunun.
Kullanıcının mantıksal bir hata yapamaması için özeli silmesi veya tarama yapması gerekir. SQL sembolleri.
Eklemeden örnek. satır işleme:
$ input_text = htmlözel karakterler ($ _ GET ["input_text"]); // Ara: "%" $ input_text = mysql_escape_string ($ input_text);
Çıktıda, formun bir isteğini alıyoruz:
... WHERE text_row LIKE "%". $ Input_text. "%" ... // WHERE text_row LIKE "%%%"
Bu, tabandaki yükü önemli ölçüde artıracaktır.
Komut dosyamda, istenmeyen karakterleri aramadan kaldıran bir işlev kullanıyorum:
işlev strip_data ($ metin) ($ tırnak = dizi ("\ x27", "\ x22", "\ x60", "\ t", "\ n", "\ r", "*", "%", "<", ">","? ","! "); $ iyi alıntılar = dizi (" - "," + "," # "); $ repquotes = dizi (" \ - "," \ + "," \ # "); $ metin = trim (strip_tags ($ metin)); $ metin = str_replace ($ tırnak işareti, "", $ metin); $ metin = str_replace ($ goodquotes, $ repquotes, $ metin); $ metin = ereg_replace ("+" , "", $ metin); $ metin döndür;)
Tabii ki, yukarıdaki karakterlerin hepsi tehlikeli değil, ama benim durumumda bunlara gerek yok, bu yüzden araştırıp değiştiriyorum.
Filtreleme kullanımına bir örnek:
$ input_text = strip_data ($ _ GET ["input_text"]); $ input_text = htmlözel karakterler ($ input_text); $ input_text = mysql_escape_string ($ input_text);
Ayrıca aramadaki karakter sayısını en az 3'ten az olmayacak şekilde sınırlamanızı tavsiye ederim, çünkü veritabanında çok sayıda kaydınız varsa, 1-2 karakterlik bir arama, veritabanı üzerindeki yükü önemli ölçüde artıracaktır.
Filtreleme. Hata # 4.
Bir değişkendeki değerler filtrelenmez $ _ÇEREZ... Bazı insanlar, bu değişken formdan geçirilemeyeceği için bunun bir güvenlik garantisi olduğunu düşünüyor.
Bu değişken, sitenin çerezlerini düzenleyerek herhangi bir tarayıcı tarafından taklit edilmesi çok kolaydır.
Örneğin, iyi bilinen bir CMS'de kullanılan site şablonunun kontrolü vardı:
if (@is_dir (MAIN_DIR. "/ şablon /". $ _COOKIE ["skin"])) ($ config ["skin"] = $ _COOKIE ["skin"];) $ tpl-> dir = MAIN_DIR. "/ şablon /". $ config ["cilt"];
Bu durumda, değişkenin değerini değiştirebilirsiniz. $ _COOKIE ["cilt"] ve bir hataya neden olur, bunun sonucunda site klasörünün mutlak yolunu görürsünüz.
Veritabanına kaydetmek için çerezlerin değerini kullanırsanız, yukarıda açıklanan filtrelemeden birini kullanın, bu aynı zamanda değişken için de geçerlidir. $ _SERVER.
Filtreleme. Hata #5.
Dahil edilen yönerge register_globals... Açıksa kapattığınızdan emin olun.
Bazı durumlarda geçilmemesi gereken bir değişkenin değerini iletebilirsiniz, örneğin sitede gruplar varsa o zaman $ group değişkeni grup 2 için boş veya 0'a eşit olmalıdır, ancak bu yeterlidir. kodu ekleyerek formu taklit etmek için:

PHP betiğinde, değişken $ grubu komut dosyasında varsayılan bir değerle bildirilmemişse 5'e eşit olacaktır.
Filtreleme. Hata #6.
İndirilen dosyaları kontrol edin.
Aşağıdaki noktaları kontrol edin:
  1. Dosya uzantısı. Uzantıları olan dosyaların indirilmesinin yasaklanması arzu edilir: php, php3, php4, php5, vb.
  2. Dosya, move_uploaded_file sunucusuna yüklendi mi?
  3. Dosya boyutu
muayene 1 numaralı hata.
Bir AJAX talebi için (örneğin: itibarın arttırılması) kullanıcı adının veya kimliğinin (itibarın artırıldığı) iletildiği durumlarla karşılaştım, ancak PHP'nin kendisinde böyle bir kullanıcının varlığına dair bir kontrol yoktu.
Örneğin:
$ user_id = intval ($ _ REQUEST ["user_id"]); ... REPLOG'A EKLE SET uid = "($ user_id)", artı = "1" ... ... UPDATE Users SET itibar = itibar + 1 WHERE user_id = "($ user_id)" ...
Veritabanında bizim için tamamen yararsız olan bir kayıt oluşturduğumuz ortaya çıktı.
muayene Hata # 2.
Verilerle çeşitli eylemler (ekleme, düzenleme, silme) gerçekleştirirken, kullanıcının bu işleve erişim haklarını kontrol etmeyi unutmayın ve Ek özellikler (html kullanarak etiketler veya doğrulama olmadan materyal yayınlama yeteneği).

Uzun bir süredir, herhangi bir kullanıcının yönetim mesajını düzenleyebildiği forumun bir modülünde benzer bir hatayı düzelttim.

muayene 3 numaralı hata.
Birden fazla php dosyası kullanırken basit bir kontrol yapın.
Dosyada index.php(veya başka bir ana dosyaya) diğer php dosyalarını eklemeden önce bu satırı yazın:
define ("READFILE", true);
Diğer php dosyalarının başına şunu yazın:
tanımlı ("READFILE")) (çıkış ("Hata, dosyanın yanlış yolu.
Ana sayfaya git."); }
Bu, dosyalara erişimi kısıtlayacaktır.
muayene Hata # 4.
Kullanıcılar için karma kullanın. Bu, XSS'nin belirli bir işlevi çağırmasını önlemeye yardımcı olacaktır.
Kullanıcılar için bir karma oluşturma örneği:
$ secret_key = md5 (strtolower ("http://site.ru/". $ üye ["ad"]. sha1 ($ şifre). tarih ("Ymd"))); // $ secret_key bizim karmamız
Ardından, tüm önemli biçimlerde, bir girdiyi kullanıcının mevcut karma değeriyle değiştirin:

Komut dosyası yürütme sırasında şunları kontrol edin:
if ($ _POST ["secret_key"]! == $ secret_key) (çıkış ("Hata: secret_key!");)
muayene Hata #5.
SQL hatalarını görüntülerken bilgi erişiminde basit bir kısıtlama yapın. Örneğin, bir GET değişkeni için bir parola belirleyin:
if ($ _GET ["passsql"] == "password") (... SQL hata çıktısı ...) else (... Sadece hata bilgisi, detay yok ...)
Bu, siteyi hacklemede kendisine yardımcı olabilecek bilgileri bilgisayar korsanından gizleyecektir.
muayene Hata #5.
Dosya adlarını harici olarak alarak dosyaları dahil etmemeye çalışın.
Örneğin:
if (isset ($ _ GET ["dosya_adı"])) ($ _GET ["dosya_adı"] içerir. ".php";)
anahtarı kullan

Belirli bir değişkenin var olup olmadığını kontrol edebilirsiniz (yani, başlatıldı mı yoksa o). Bunu yapmak için işlevi kullanın:

Iset (değişken);

içindeki değişken ise şu an mevcut değil (daha önce herhangi bir yere bir değer atanmamış veya bir işlev tarafından kaldırılmış) ayarsız () ), ardından fonksiyon isset () İadeler YANLIŞ , aksi halde - NS :

$x = 5;

if (isset ($ x))

Eko ‘< BR > Değişken $ x var, '," değeri $ x < BR >”;

Ekran şunları gösterecektir:

Değişken $ x var, değeri 5

Programda başlatılmamış bir değişken kullanamayacağımızı hatırlamak önemlidir - bu, yorumlayıcıdan bir uyarı üretecektir. PHP .

Bir değerin değişken olup olmadığını öğrenmek için boş , işlev kullanılır:

boş ( değişken);

Değişkenin değeri ise sıfır ,“0”, BOŞ , boş satır (“” ), false, değişken bildirilmedi veya boş bir dizi sonra bu fonksiyon döner NS , aksi halde - YANLIŞ .

Kontrol etmek bir çeşit değişken, işlevler kullanılır:

Is_string (değişken);

NS _ int (değişken);

NS _ batmadan yüzmek (değişken);

NS _ boş (değişken);

NS _ dizi (değişken);

NS _ sayısal (değişken); - değişken sayısal ise ( tam sayı , batmadan yüzmek ) veya yalnızca sayıları içeren bir dize.

Bu işlevler geri döner NS değişken belirtilen türdeyse.

Veri çıkışı

Formatsız çıktı

biçimsiz dizilerin veya değişkenlerin değerlerinin çıktısı şu fonksiyon tarafından gerçekleştirilir:

Eko değişken listesi;

Eko hat;

nerede değişken listesi - virgülle ayrılmış çıktı değişkenlerinin adları.

Bir web tarayıcısı ile çalışıyorsak, bu fonksiyon çıktıyı tarayıcının istemci tarafına (penceresine) yönlendirir.

Daha önce de belirtildiği gibi, çift tırnak içine alınmış bir dizede değişken adları bulunursa, ekranda bu adların yerine karşılık gelen değerler görüntülenir. Ayrıca, böyle bir dize etiketler içeriyorsa HTML (kollar açılı ayraç içine alınır), ardından tarayıcı bunu görüntüler HTML - yorumlarken yapması gereken şekilde kodlayın HTML -belge:

$ yıl = 2012;

$ mesaj = “ Dilek herkese mutluluk !”;

Eko "

Benim Tebrikler !

”;

Eko " Geldi $ yıl yıl !
$ mesaj
”;

?>

Seviyenin başlığı görüntülenecektir. H 3 ve ardından “ kelimeli bir selamlama mutluluk!" kalın italik olarak gösterilecektir:

Tebrikler!

2012 geldi! herkese diliyorum mutluluk!

Bu şekilde dinamik siteler oluşturabilirsiniz.

biçimlendirilmiş çıktı

biçimlendirilmiş çıktı, farklı sayı sistemlerinde ve ondalık sistemde - farklı biçimlerde ( biçimler ). Biçimlendirilmiş çıktıya benzer Si ve işlevler tarafından gerçekleştirilir:

baskı (“Biçim”, çıktı listesi);

sprintf (“Biçim”, çıktı listesi);

İlk işlev, biçimlendirilmiş verileri tarayıcı penceresine verir ve miktarını döndürür.

İkinci işlev yalnızca çıktı verilerini biçimlendirir, ancak çıktı vermez.

Biçim Çıktı değerleri için bir dönüşüm tanımlayıcı dizisidir.

Dönüşüm Tanımlayıcısı her değer için şu forma sahiptir:

% Dolgu Hizalama Uzunluğu Doğruluk Türü

- Toplama - bu, belirtilen sonuca dönüştürme sonucunu tamamlamak için kullanılacak karakterdir. uzunluk (varsayılan - Uzay ); başka bir karakterse, önüne tek bir alıntı gelir ( kesme işareti ),

- hizalama - varsayılan olarak - tarafından sağ çıktı alanının kenarı; eksi varsa ( - ), ardından sol ,

- Uzunluk - çıktı alanının genişliği - bu değerin çıktısı için ayrılan karakter boşluklarının sayısı. Görüntülenen değer verilenden daha az aşinalık içeriyorsa uzunluk sonra kalan boşluk doldurulacak boşluklar veya karakterleri doldurma,

- Kesinlik - sayının kesirli kısmındaki ondalık basamak sayısı,

- Bir çeşit - çıktı değeri türü:

B ikili ,

ile birlikte sembol ,

NS tüm ondalık gösterimde,

e malzeme üstel biçimde (kayan nokta),

F malzeme sabit nokta formunda,

s hat ,

Ö tüm sekizli sayı sisteminde,

x tüm onaltılık gösterimde.

Örnek:

php

$ zarp _1 = 6543.21;

$ zarp _2 = 45321.67;

$ dostum _1 = "Balaganov";

$ dostum _2 = "Bükücü";

baskı ("< H 1> Bordro H 1>");

printf ("%" .- 12s% ". 10.2f ov.", $ fam_1, $ zarp_1);

Eko "
";

printf ("%" .- 12s% ". 10.2f ov.", $ fam_2, $ zarp_2);

Eko "
";

?>

Nokta yer tutucu olarak seçildi ( ‘. ). Soyadı sola dayalı ( - ) genişlik alanında 12 karakterler. Sayılar, bir alan genişliğinde sabit nokta biçiminde temsil edilir 10 karakterler ve hassasiyetle 2 ondalık basamaklar, sağa dayalı.