Menü
Bedava
kayıt
ev  /  İpuçları / Bir erkeğe doğum arama öğesi php i. PHP ve MySQL'de çok düzeyli menü

Bir erkeğin doğumu arama öğesi php i. PHP ve MySQL'de çok düzeyli menü

Tarafından Ibrahim Diallo

2 Temmuz 2014'te yayınlandı ~ 16 dakika okundu

Arama, bir web sitesinde önemli bir özelliktir. Birkaç okuyucum blogumda belirli bir pasajı aramak istediğinde, arama kutusunu kullanıyor. Eskiden Google Arama tarafından destekleniyordu, ancak o zamandan beri onu kendi ev yapımı versiyonuma değiştirdim, daha iyisini yapabildiğim için değil, ilginç bir zorluk olduğu için.

Aceleniz varsa ve sadece sitenizin aranabilir olmasını istiyorsanız, daha önce yaptığım şeyi yapın, Google'ı kullanın.

// search.php dosyasında $ term \u003d isset ($ _ GET ["sorgu"])? $ _ GET ["sorgu"]: ""; $ terim \u003d urlencode ($ terim); $ web sitesi \u003d urlencode ("www.websiteniz.com"); $ redirect \u003d "https://www.google.com/search?q\u003dsite%3A($website)+($term)"; başlık ("Konum: $ redirect"); çıkış;

Yaptığı şey oldukça basit. Kullanıcı tarafından geçen terimi alın ve Google arama sayfasına iletin. Arama sorgusunda site: anahtar kelimesini kullanarak arama sonucunu mevcut etki alanımızla sınırlandırın. Google tarafından indekslenen tüm sayfalarınız artık arama yoluyla kullanılabilecektir. Ancak aramanızı evde halletmek istiyorsanız, okumaya devam edin.

Ev yapımı Arama Çözümü

Daha ileri gitmeden önce, bu blogdaki arama kutusunu kullanmayı deneyin. Aşağıda anlatacağımla aynı süreci kullanır. İstediğiniz şeyin bu olduğunu düşünüyorsanız, lütfen okumaya devam edin.

Bu çözüm, küçük web sitelerine yöneliktir. Her iki uçta da Joker kartlarla LIKE kullanıyorum, yani aramanız dizine eklenemez. Bu, çözümün blogunuz veya tonlarca veri içermeyen kişisel web siteniz için iyi çalışacağı anlamına gelir. Daha büyük bir web sitesine aktarırsanız çok yavaşlayabilir. MySQL, burada yaptığımız şey olmayan Tam Metin Arama'yı sunar.

Not: 5000 blog yazınız varsa, hala iyisiniz. ...

Bu blogun yapısını referans alacağız. Her blog gönderisinde şunlar bulunur:

  • Bir başlık p_title
  • Bir url p_url
  • Özet p_summary
  • Bir gönderi içeriği p_content
  • Ve cateringgories kategorisi.tagname

Arama terimimizle eşleşen her alan için bir puan vereceğiz. Skor, maçın önemine bağlı olacaktır:

// tam terim eşleşmeleri $ scoreFullTitle \u003d 6 başlığında bulunur; // $ scoreTitleKeyword \u003d 5 bölümündeki başlığı eşleştir; // tam terim eşleşmeleri özette bulunur $ scoreFullSummary \u003d 5; // $ scoreSummaryKeyword \u003d 4 bölümündeki özeti eşleştir; // tam terim eşleşmeleri $ scoreFullDocument \u003d 4 içeriğinde bulunur; // $ scoreDocumentKeyword \u003d 3 kısmındaki belgeyle eşleşir; // $ scoreCategoryKeyword \u003d 2 kategorisiyle eşleşir; // $ scoreUrlKeyword \u003d 1 url ile eşleşir;

Başlamadan önce, kaldırılması gereken bir aramaya pek katkıda bulunmayan birkaç kelime var. Örnek "in", "it", "a", "the", "of" ... Bunları filtreleyeceğiz ve alakasız olduğunu düşündüğünüz kelimeleri eklemekten çekinmeyin. Başka bir şey de, sorgumuzun uzunluğunu sınırlamak istiyoruz. Bir kullanıcının arama alanına bir roman yazmasını ve MySQL sunucumuzu çökertmesini istemiyoruz.

// Gereksiz kelimeleri arama teriminden kaldırın ve bunları bir dizi işlevi olarak döndürür filterSearchKeys ($ sorgu) ($ sorgu \u003d trim (preg_replace ("/ (\\ s +) + /", "", $ sorgu)); $ kelimeler \u003d array (); // bu listeyi kelimelerinizle genişletin. $ list \u003d array ("in", "it", "a", "the", "of", "veya", "I", "you", "o", "ben", "biz", "onlar", "o", "to", "ama", "o", "bu", "bunlar", "sonra"); $ c \u003d 0; foreach (patlat ("", $ sorgu) $ anahtar olarak) (if (in_array ($ anahtar, $ liste)) (devam;) $ kelimeler \u003d $ anahtar; if ($ c\u003e \u003d 15) (ara;) $ c ++ ;) return $ kelimeler;) // kelimeleri sınırlandır karakter sayısı function limitChars ($ sorgu, $ limit \u003d 200) (dönüş substr ($ sorgu, 0, $ limit);)

Yardımcı işlevlerimiz artık karakter sayısını sınırlayabilir ve gereksiz kelimeleri filtreleyebilir. Algoritmamızı uygulama şeklimiz, her eşleşme bulduğumuzda bir puan vermektir. Kelimeleri if ifadesini kullanarak eşleştireceğiz ve daha fazla kelimeyle eşleştikçe puanları biriktireceğiz. Sonunda, sonuçlarımızı sıralamak için bu puanı kullanabiliriz

Not: MySQL veritabanına nasıl bağlanılacağını göstermeyeceğim. Veritabanına verimli bir şekilde bağlanmakta sorun yaşıyorsanız, bunu okumanızı tavsiye ederim.

Önce fonksiyonumuza bir yapı verelim. Not Bölümleri ayrı ayrı uygulayabilmemiz için yer tutucular bıraktım.

İşlev arama ($ sorgu) ($ sorgu \u003d trim ($ sorgu); if (mb_strlen ($ sorgu) \u003d\u003d\u003d 0) (// boş aramaya gerek yok doğru mu? Dönüş yanlış;) $ sorgu \u003d limitChars ($ sorgu) ; // Tartım puanları $ scoreFullTitle \u003d 6; $ scoreTitleKeyword \u003d 5; $ scoreFullSummary \u003d 5; $ scoreSummaryKeyword \u003d 4; $ scoreFullDocument \u003d 4; $ scoreDocumentKeyword \u003d 3; $ scoreCategoryKeyword \u003d 2; $ scoreUrlKeyword \u003d 1; $ anahtar kelimeler \u003d filterSear $ sorgu); $ escQuery \u003d DB :: escape ($ sorgu); // db nesnesini almak için yukarıdaki nota bakın $ titleSQL \u003d array (); $ sumSQL \u003d array (); $ docSQL \u003d array (); $ categorySQL \u003d array (); $ urlSQL \u003d array (); / ** Tam oluşumlarla eşleşiyor PLACE HOLDER ** / / ** Eşleşen Anahtar Kelimeler PLACE HOLDER ** / $ sql \u003d "SELECT p.p_id, p.p_title, p.p_date_published, s. p_url, p.p_summary, p.p_content, p.thumbnail, ((- Başlık puanı ".implode (" + ", $ titleSQL).") + (- Özet ".implode (" + ", $ sumSQL) . ") + (- belge" .implode ("+", $ docSQL). ") + (- etiket / kategori" .implode ("+", $ categorySQL). ") + (- url". implode (" + ", $ urlSQL).")) alaka düzeyi olarak p.status \u003d "yayınlandı" p.status NEREDE İLİŞKİLİ\u003e

Sorguda, tüm puanlar alaka değişkeni olarak toplanacak ve sonuçları sıralamak için kullanabiliriz.

Tam oluşumlarla eşleşiyor

Önce bazı anahtar kelimelerimiz olduğundan emin olduktan sonra sorgumuzu ekliyoruz.

If (count ($ anahtar kelimeler)\u003e 1) ($ titleSQL \u003d "if (p_title LIKE"% ". $ EscQuery."% ", ($ ScoreFullTitle), 0)"; $ sumSQL \u003d "if (p_summary LIKE"% " . $ escQuery. "%", ($ scoreFullSummary), 0) "; $ docSQL \u003d" if (p_content LIKE "%". $ escQuery. "%", ($ scoreFullDocument), 0) ";)

Bunlar daha yüksek skorlu maçlardır. Arama terimi bunları içeren bir makaleyle eşleşirse, en üstte görünme şansı daha yüksek olacaktır.

Eşleşen anahtar kelime oluşumları

Tüm anahtar kelimeleri gözden geçiririz ve alanlardan herhangi biriyle eşleşip eşleşmediklerini kontrol ederiz. Kategori eşleşmesi için, bir gönderi birden fazla kategoriye sahip olabileceğinden bir alt sorgu kullandım.

Öngörme ($ anahtar olarak $ anahtar kelimeler) ($ titleSQL \u003d "if (p_title LIKE"% ". DB :: escape ($ key)."% ", ($ ScoreTitleKeyword), 0)"; $ sumSQL \u003d "if (p_summary GİBİ "%". DB :: escape ($ key). "%", ($ ScoreSummaryKeyword), 0) "; $ docSQL \u003d" if (p_content LIKE "%". DB :: escape ($ key). "% ", ($ scoreDocumentKeyword), 0)"; $ urlSQL \u003d "if (p_url GİBİ"% ". DB :: escape ($ anahtar)."% ", ($ scoreUrlKeyword), 0)"; $ categorySQL \u003d "if ((SELECT count (category.tag_id) kategorisinden JOIN post_category ON post_category.tag_id \u003d category.tag_id NEREDE post_category.post_id \u003d p.post_id AND category.name \u003d "" .DB :: escape ($ key). "")\u003e 0, ($ scoreCategoryKeyword), 0) ";)

Ayrıca aşağıdaki bir yorumcunun işaret ettiği gibi, bu değişkenlerin boş diziler olmadığından emin olmalıyız, yoksa sorgu başarısız olur.

// Boş olsun, 0 ekleyin if (boş ($ titleSQL)) ($ titleSQL \u003d 0;) if (boş ($ sumSQL)) ($ sumSQL \u003d 0;) if (boş ($ docSQL)) ( $ docSQL \u003d 0;) if (boş ($ urlSQL)) ($ urlSQL \u003d 0;) if (boş ($ tagSQL)) ($ tagSQL \u003d 0;)

Sonunda, tüm sorgular birleştirilir ve gönderinin arama terimiyle alaka düzeyini belirlemek için birbirine eklenir.

// Gereksiz kelimeleri arama teriminden kaldırın ve bunları bir dizi işlevi olarak döndürür filterSearchKeys ($ sorgu) ($ sorgu \u003d trim (preg_replace ("/ (\\ s +) + /", "", $ sorgu)); $ kelimeler \u003d array (); // bu listeyi kelimelerinizle genişletin. $ list \u003d array ("in", "it", "a", "the", "of", "veya", "I", "you", "o", "ben", "biz", "onlar", "o", "to", "ama", "o", "bu", "bunlar", "sonra"); $ c \u003d 0; foreach (patlat ("", $ sorgu) $ anahtar olarak) (if (in_array ($ anahtar, $ liste)) (devam;) $ kelimeler \u003d $ anahtar; if ($ c\u003e \u003d 15) (ara;) $ c ++ ;) return $ kelimeler;) // kelimeleri sınırlandır karakter sayısı function limitChars ($ sorgu, $ limit \u003d 200) (return substr ($ sorgu, 0, $ limit);) fonksiyon arama ($ sorgu) ($ sorgu \u003d kırpma ($ sorgu); if (mb_strlen ($ sorgu) \u003d\u003d\u003d 0) (// boş aramaya gerek yok değil mi? return false;) $ sorgu \u003d limitChars ($ sorgu); // Ağırlık puanları $ scoreFullTitle \u003d 6; $ scoreTitleKeyword \u003d 5; $ scoreFullSummary \u003d 5; $ scoreSummaryKeyword \u003d 4; $ scoreFullDocument \u003d 4; $ scoreDocumentKeyword \u003d 3; $ scoreCategoryKeyword \u003d 2; $ scoreUrlKe yword \u003d 1; $ anahtar kelimeler \u003d filterSearchKeys ($ sorgu); $ escQuery \u003d DB :: escape ($ sorgu); // db nesnesini almak için yukarıdaki nota bakın $ titleSQL \u003d array (); $ sumSQL \u003d array (); $ docSQL \u003d dizi (); $ kategoriSQL \u003d dizi (); $ urlSQL \u003d dizi (); / ** Tam oluşumlarla eşleşiyor ** / if (count ($ anahtar kelimeler)\u003e 1) ($ titleSQL \u003d "if (p_title LIKE"% ". $ EscQuery."% ", ($ ScoreFullTitle), 0)"; $ sumSQL \u003d "if (p_summary GİBİ"% ". $ escQuery."% ", ($ scoreFullSummary), 0)"; $ docSQL \u003d "if (p_content LIKE"% ". $ escQuery."% ", ($ scoreFullDocument), 0) ";) / ** Eşleşen Anahtar Kelimeler ** / foreach ($ anahtar olarak $ anahtar kelimeler) ($ titleSQL \u003d" if (p_title LIKE "%". DB :: escape ($ key). "%", ($ ScoreTitleKeyword ), 0) "; $ sumSQL \u003d" if (p_summary LIKE "%". DB :: escape ($ key). "%", ($ ScoreSummaryKeyword), 0) "; $ docSQL \u003d" if (p_content LIKE "% ".DB :: escape ($ key)."% ", ($ ScoreDocumentKeyword), 0)"; $ urlSQL \u003d "if (p_url GİBİ"% ". DB :: escape ($ anahtar)."% ", ( $ scoreUrlKeyword), 0) "; $ categorySQL \u003d" if ((SELECT count (category.tag_id) post_category.tag_id \u003d category.tag_id ÜZERİNE KATILIN post_category post_category.post_id \u003d p.post_id VE kategori.adı \u003d "". DB :: escape ($ key). "")\u003e 0, ($ scoreCategoryKeyword), 0) ";) // Boş bırak, 0 if (boş ($ titleSQL)) ($ titleSQL \u003d 0; ) Eğer (boş ($ sumSQL)) ($ sumSQL \u003d 0; ) if (boş ($ docSQL)) ($ docSQL \u003d 0;) if (boş ($ urlSQL)) ($ urlSQL \u003d 0;) if (boş ($ tagSQL)) ($ tagSQL \u003d 0;) $ sql \u003d " SEÇİN p.p_id, p.p_title, p.p_date_published, p.p_url, p.p_summary, p.p_content, p.thumbnail, ((- Başlık puanı ".implode (" + ", $ titleSQL). ") + (- Özet" .implode ("+", $ sumSQL). ") + (- belge" .implode ("+", $ docSQL). ") + (- etiket / kategori" .implode ("+", $ categorySQL). ") + (- url" .implode ("+", $ urlSQL). ")) alaka düzeyi olarak post p NEREDE p.status \u003d" yayınlandı "alaka düzeyi\u003e 0 ORDER alaka DESC, p.page_views DESC LIMIT 25 "; $ sonuçlar \u003d DB :: sorgu ($ sql); eğer (! $ sonuç) (yanlış dönüş;) $ sonuç döndür; )

Artık search.php dosyanız şöyle görünebilir:

$ terim \u003d isset ($ _ GET ["sorgu"])? $ _ GET ["sorgu"]: ""; $ search_results \u003d arama ($ terim); if (! $ search_results) (echo "Sonuç yok"; çıkış;) // Sonuçları burada içeren sayfayı yazdırın.

Makul miktarda içeriği işleyebilen basit bir arama algoritması oluşturduk. Her maç için keyfi olarak skoru seçtim, sizin için en iyi sonuç veren bir şeye ayarlamaktan çekinmeyin. Ve her zaman iyileştirme için yer vardır.

Kullanıcılarınızdan gelen arama terimini izlemek iyi bir fikirdir, bu şekilde çoğu kullanıcının aynı şeyi arayıp aramadığını görebilirsiniz. Bir model varsa, onları bir geziyi kaydedebilir ve kullanarak sonuçları önbelleğe alabilirsiniz. Memcached.

Bu arama algoritmasını çalışırken görmek istiyorsanız, devam edin ve sayfanın üstündeki arama kutusunda bir makale aramayı deneyin. Metinde eşleşmenin bulunduğu kısmı döndürmek gibi ekstra özellikler ekledim. Sizinkine özellikler eklemekten çekinmeyin.

Bu makaleyi beğendin mi? Daha harika olanları okumak için abone olabilirsiniz. ...

Bununla ilgili olarak, işte bazı ilginç makaleler.

Bir web sunucusunun her gün yaptığı bir şey varsa, o da veritabanına bağlanmaktır. PHP'yi yıllardır kullanıyorum, ancak veritabanından veri almak için bir komut dosyası yazmamı istersen, önce birkaç örnek bulmak için Ultimate PHP kılavuzuna geri dönmeden bunu yapamam.

Birkaç ay önce PHP sürümümü güncelledim. PHP 5.4 - 5.5. PHP'yi güncellerken daha önce hiç sorun yaşamadım. Gelişimini yakından takip ediyorum ve kullanımdan kaldırılan işlevlerimi resmi olarak kaldırılmadan çok önce kaldırmaya çalışıyorum. Ama bu sefer hazırlıksız yakalandım. En aptalca nedenden dolayı web sitemin bir bölümünü sessizce kırdı.

Yorumlar (45)

Zaryel 12 Ağu 2015:

Ian Mustafa 26 Eylül 2015:

Rob 29 Eylül 2015:

saygı 11 Şubat 2016:

Ivan Venediktov 9 Nisan 2016.

30 Nisan 2016'da güncellendi

Size PHP ve MySQL kullanarak nasıl basit arama oluşturacağınızı göstereceğim. Şunları öğreneceksiniz:

  • GET nasıl kullanılır ve POST yöntemis
  • Veritabanına bağlanın
  • Veritabanı ile iletişim kurun
  • Verilen kelime veya kelime öbeğiyle eşleşen veritabanı girişlerini bulun
  • Sonuçları göster

Hazırlık

Apache, MySQL ve PHP'nin kurulu ve çalışır durumda olması gerekir (farklı platformlar veya WAMP için kullanabilirsiniz. pencereler için, MAMP for mac) veya PHP ve MySQL veritabanlarını destekleyen bir web sunucusu / barındırma.

Veritabanı, tablo oluşturalım ve arama için kullanabileceğimiz bazı girişlerle dolduralım:

  • PhpMyAdmin'e gidin, bilgisayarınızda sunucu varsa, http: // localhost / phpmyadmin / adresinden erişebilirsiniz.
  • Veritabanı oluştur, ben kendime tutorial_search adını verdim
  • Tablo oluştur 3 alan kullandım, benim makalelerimi aradım.
  • 1. alan için konfigürasyon. Ad: kimlik, tür: INT, kontrol edin AUTO_INCREMENT, dizin: birincil

INT tam sayı olduğu anlamına gelir
AUTO_INCREMENT, yeni girişlerin öncekinden başka (daha yüksek) sayıya sahip olacağı anlamına gelir
Dizin: birincil, satırı tanımlamak için kullanılan benzersiz anahtar olduğu anlamına gelir

  • 2. alan: Ad: başlık, tür: VARCHAR, uzunluk: 225

VARCHAR, metin dizisi anlamına gelir, maksimum 225 karakter (maksimum uzunluğu belirtmek gerekir), başlıklar, adlar, adresler için kullanın
uzunluk, 225 karakterden uzun olamayacağı anlamına gelir (isterseniz daha düşük bir sayıya ayarlayabilirsiniz)

  • 3. alan: Ad: metin, tür: TEXT

METİN, uzun dizge anlamına gelir, uzunluğu belirtmek gerekli değildir, uzun metin için kullanın.

  • Tabloyu rastgele makalelerle doldurun (bunları haber web sitelerinde bulabilirsiniz, örneğin: CNN, BBC, vb.). Üst menüde ekle'ye tıklayın ve metni belirli alanlara kopyalayın. "İd" alanını boş bırakın. En az üç tane yerleştirin.

Bunun gibi bir şeye benzemeli:

  • Sunucu dizininizde bir klasör ve iki dosya oluşturun: index.php ve search.php (aslında tüm bunları tek bir dosya ile yapabiliriz, ama ikiyi kullanalım, daha kolay olacaktır)
  • Bunları varsayılan html işaretlemesi, doctype, head vb. İle doldurun.

Arama

  • İndex.php'de arama alanı ve gönder düğmesi ile bir form oluşturun, GET veya POST yöntemini kullanabilir, search.php için eylem ayarlayabilirsiniz. Metin alanı adı olarak "sorgu" kullandım

GET - bilgilerinizin url'de saklanacağı anlamına gelir (http: //localhost/tutorial_search/search.php? Query \u003d yourQuery)
POST - bilgilerinizin görüntülenmeyeceği anlamına gelir ve GET'ten çok daha güvenli olan şifreler, özel bilgiler için kullanılır

Tamam, php ile başlayalım.

  • Search.php'yi açın
  • Php'yi başlat ()
  • Bir veritabanına bağlanın (aşağıdaki koddaki yorumları okuyun)

< to > $ sorgu \u003d mysql_real_escape_string ($ sorgu); // hiç kimsenin SQL enjeksiyonu kullanmamasını sağlar $ raw_results \u003d mysql_query ("SELECT * FROM makalelerden (" başlık` GİBİ "%". $ sorgu. "%") VEYA ("metin` GİBİ"% ". $ sorgu."% ")") veya öl (mysql_error ()); // * tüm alanları seçtiği anlamına gelir, ayrıca şunu yazabilirsiniz: "id", "başlık", "metin" // makaleler, tablomuzun adıdır // "% $ sorgu%" aradığımız şeydir ,% herhangi bir şey anlamına gelir, örneğin $ sorgu Merhaba ise // "merhaba", "Merhaba adam", "gogohello" ile eşleşir, tam eşleşme istiyorsanız "title" \u003d "$ sorgu" // kullanın veya isterseniz "gogohello" yerine "% $ query%" ... VEYA ... "$ query%" ... VEYA ... "% $ query" if (mysql_num_rows ($ raw_results)\u003e

". $ sonuçlar [" başlık "]."

". $ sonuçlar [" metin "]."

"; // veritabanından alınan sonuçları yayınlar (başlık ve metin) ayrıca id ($ sonuçlar [" id "])))) da gösterebilirsiniz (// eşleşen satır yoksa, echo" Sonuç yok ";)) else (// sorgu uzunluğu minimum echo'dan küçükse "Minimum uzunluk". $ min_length;)?\u003e

Bitti!

Şimdi çalışıyor. Farklı sözcükler, varyasyonlar, düzenleme kodu, deneyler deneyin. Bir şeyi kaçırdığınızı düşünmeniz durumunda, her iki dosyanın da tam kodunu ekliyorum. Soru sormaktan veya öğreticiler istemekten çekinmeyin.

index.php

Arama

search.php

Arama Sonuçları \u003d $ min_length) (// sorgu uzunluğu minimum uzunluktan fazla veya eşitse $ query \u003d htmlspecialchars ($ sorgu); // html'de kullanılan karakterleri eşdeğerlerine değiştirir, örneğin:< to > $ sorgu \u003d mysql_real_escape_string ($ sorgu); // hiç kimsenin SQL enjeksiyonu kullanmamasını sağlar $ raw_results \u003d mysql_query ("SELECT * FROM makalelerden (" başlık` GİBİ "%". $ sorgu. "%") VEYA ("metin` GİBİ"% ". $ sorgu."% ")") veya öl (mysql_error ()); // * tüm alanları seçtiği anlamına gelir, ayrıca şunu yazabilirsiniz: "id", "başlık", "metin" // makaleler, tablomuzun adıdır // "% $ sorgu%" aradığımız şeydir ,% herhangi bir şey anlamına gelir, örneğin $ sorgu Merhaba ise // "merhaba", "Merhaba adam", "gogohello" ile eşleşir, tam eşleşme istiyorsanız "title" \u003d "$ sorgu" // kullanın veya isterseniz "gogohello" dışında "% $ query%" ... VEYA ... "$ query%" ... VEYA ... "% $ query" if (mysql_num_rows ($ raw_results)\u003e 0) (// bir veya daha fazla satır döndürülürse, aşağıdakileri yapın; döngü yankısı "

". $ sonuçlar [" başlık "]."

". $ sonuçlar [" metin "]."

"; // veritabanından alınan sonuçları yayınlar (başlık ve metin) ayrıca id ($ sonuçlar [" id "])))) da gösterebilirsiniz (// eşleşen satır yoksa, echo" Sonuç yok ";)) else (// sorgu uzunluğu minimum echo'dan küçükse "Minimum uzunluk". $ min_length;)?\u003e

Bu yazıda size nasıl yaratabileceğinizi göstereceğim pHP ve MySQL'de çok düzeyli menü... Tabii ki, yaratılması için birçok seçenek düşünebilirsiniz, ancak bu konuyla ilgili sorularınızın sayısına bakılırsa, bir örneğe ihtiyacınız var. Ve bunu bu yazıda vereceğim. Hemen bu makalenin yalnızca bilenler için anlamlı olduğunu not ediyorum. PHP ve nasıl çalışılacağını biliyor MySQL... Diğer herkesin önce bunun üzerinden geçmesi veya bazı kitaplar okuması gerekir. PHP ve MySQL.

Öncelikle aşağıdaki alanlarla veritabanında bir tablo oluşturalım:

  • İD - benzersiz tanımlayıcı.
  • başlık - menüdeki bağlantı bağlantıları.
  • bağlantı - menü öğesinin gideceği adres.
  • parent_id - ebeveyn kimliği. Üst öğe yoksa, o zaman NULL olacaktır (veya başka bir 0 girebilirsiniz).

Masa dizildi, şimdi zamanı PHP kodu... Tam Php kodu aşağıda gösterilen:

$ mysqli \u003d yeni mysqli ("localhost", "root", "", "db"); // Veritabanına bağlanın
$ sonuç_set \u003d $ mysqli-\u003e sorgu ("SEÇ * MENÜDEN`"); // Menü ile tablodaki tüm kayıtların bir seçimini yapın
$ öğeler \u003d dizi (); // Menü öğeleri için dizi
while (($ satır \u003d $ sonuç_set-\u003e fetch_assoc ())! \u003d yanlış) $ öğeler [$ satır ["id"]] \u003d $ satır; // Diziyi veritabanından bir seçimle doldur
$ çocuk \u003d dizi (); // Çocukları ebeveynleriyle eşleştirmek için dizi
foreach ($ öğe olarak $ öğe) (
eğer ($ öğe ["parent_id"]) $ çocuk [$ öğe ["id"]] \u003d $ öğe ["parent_id"]; // Diziyi doldur
}
function printItem ($ öğe, $ öğe, $ çocuk) (
/ * Menü öğesini görüntüle * /
Eko "

  • ";
    echo "". $ öğe ["başlık"]. "";
    $ ul \u003d yanlış; // Çocuklar oluşturuldu mu?
    while (true) (
    / * Tüm çocukları aradığımız sonsuz bir döngü * /
    $ anahtar \u003d dizi_arama ($ öğe ["kimlik"], $ çocuk); // Bir alt öğe aranıyor
    eğer (! $ anahtar) (
    / * Çocuk bulunamadı * /
    eğer ($ ul) yankı ""; // Alt öğeler görüntüleniyorsa, listeyi kapatın
    kırmak; // Döngüden çık
    }
    ayarlanmamış ($ çocuk [$ anahtar]); // Bulunan öğeyi kaldırın (böylece bir daha görüntülenmemesi için)
    eğer (! $ ul) (
    Eko "
      "; // Henüz çocuk yoksa dahili listeyi başlat
      $ ul \u003d doğru; // Bayrağı ayarlayın
      }
      echo printItem ($ öğeler [$ anahtar], $ öğeler, $ çocuklar); // Tüm çocukları özyinelemeli olarak göster
      }
      Eko "";
      }
      ?>

      Bu kod tamamen çalışıyor, ancak kimsenin böyle yazmadığını anlamalısınız (özellikle eko HTML etiketleri). Ve sizin göreviniz algoritmayı bu koddan almaktır, kodun kendisini değil. Ve sonra bu algoritmayı motorunuza bağlayın. Çıktı kodunu dikkatlice yorumlamaya çalıştım pHP ve MySQL'de çok düzeyli menüama tabii ki en şeffaf olanı değil ve zaten oldukça iyi bir başlangıç \u200b\u200bbilgisi gerektiriyor. Henüz bilmiyorsan PHP ve MySQL, o zaman öncelikle bunu gözden geçirmenizi şiddetle tavsiye ederim

      Adamın doğum günü senaryosu özel dikkat gerektirir. Sonuçta, daha güçlü seks genellikle tatilin formatını daha katı bir şekilde değerlendirir. Tatil yapma konusundaki engin deneyimimiz, doğum günü kişisinin yaşına, karakterine ve ilgi alanlarına bağlı olarak bir doğum günü için ideal senaryoyu seçmemizi sağlar. Örneğin, müşterilerimiz arasında en popüler olan bir erkeğin doğum günü için bir senaryo sunuyoruz:

      Sunucu diyor ki doğum günü çocuğuna tost ve şu sözlerle bitirir:

      Şampanyayı bardaklara dökün
      Ve birlikte her şeyi dibine kadar içeriz!
      Tostumuzu gençliğe kaldırıyoruz,
      Ve gençlik bir değil!

      İlk çember bitti, yenisi başladı
      İkinci gençliğinize girdiniz.
      Adam öne çıkan, güçlü ve sağlıklıdır,
      Taze fikirlerle ve güçle dolusunuz.

      Aynı şekilde enerjik kalın
      Yıllardır boşuna çalışmadın!
      Çok neşeli, tatlı ol
      Ve kader sizi sıkıntılardan uzak tutabilir!

      Konuklar olayın kahramanı için performans sergiliyor eski çingene romantizmi
      (ikisi birlikte şarkı söyleyebilir ve diğer herkes koroyu çalar):

      Bardaklar dökülür
      Kehribar bir yansıması var,
      Ve yüzler parlıyor
      İlkbahar şafak gibi!

      Hasret şarapla götürülür,
      Daha parlak hale gelir
      Ve kalbime bir tost soruyor:
      Yıldönümüne içiyoruz!

      Koro:

      Koromuz eski bir melodi söylüyor
      Nehir gibi şampanya döküyor!
      Senin için sevgili dostumuz,
      Doğum günü oğlumuz (belki onun adı) canım!

      Daha harika ne olabilir
      Aşk eridiğinde
      Bir şarkıyla karşılanıyorsun
      Aile ve arkadaşlar!

      Akşam başlasın
      Hayat nasıl yeni bir çember
      Ve tüm rüyalar gerçekleşir
      Ve etrafta her şey çiçek açar!

      Koro:
      Dipler Yukarı! Dipler Yukarı! Dipler Yukarı!

      Müzikal duraklama.

      Sonra tanınır ebeveynlere tost.

      Lider:

      Pekala, arkadaşlar, an geldi
      Ailen için bir bardak doldur!
      Yaşama sevinci verenler için
      Ve güzel dünyanın kapılarını açtı

      Ona iyilik öğretenler için
      Ve cesaret asasını verdi.
      Kime teşekkür edenler için, şimdi
      Doğum günü oğlumuz aramızda oturuyor!

      Yani, ebeveynlerimize içiyoruz ... (onları adıyla ve soyadıyla çağırır)

      Müzikal duraklama.

      Sunucu, günün kahramanının hayatını kısaca anlatıyor.

      Ev sahibi: Ve şimdi şarkı söyleyeceğiz "Tatilimizin ana kahramanı hakkında eski şarkılar".

      (Konuklar pilotlar hakkında bir şarkının melodisiyle şarkı söyler)


      Açıkçası günün kahramanı olmadan yapacak bir şey yok.
      Masada toplanacağız
      Dolu bardak dökün
      Ve sağlığı için bir şarkı söyleyeceğiz:

      Bizim için kutlama zamanı
      Ve bu gün tanış

      Yirmi otuz olmasın, bırak olsun!
      Neşenizin çıtasını düşürmeyin!
      Kesinlikle takip edeceğiz
      Bizden saklanamazsın, sadece biliyorsun!

      Cesur, cesur, cesur görürüz
      İnce, yakışıklı, kıvırcık saçlı bir adam!
      Yıllar geçsin
      Ama hep bunu diliyoruz
      Ruhun genç kaldı!

      Bizim için kutlama zamanı
      Kutlama zamanı, görkemli bir yıldönümü kutlaması!
      Ve bu gün tanış
      Büyük bir akraba ve arkadaş şirketinde!

      Kader bize bazen acımasız gelse bile, bırakın olsun!
      Ona yanıt olarak, şakalarınızı bıraktınız!
      Aynı katı tut
      Umutsuzluğa izin vermeyin!

      Bu gece, bu gece, bu gece
      Günün sevgili bir kahramanı olmadan yapacak hiçbir şey yok!
      Bir tane içeceğiz, iki tane içeriz
      Yıldönümü ve tapular için,
      Ama yarın başım ağrımayacak!

      Günün kahramanını seviyoruz ve saygı duyuyoruz
      Ve tebriklerimize devam ediyoruz!

      (Konuklar "Doğum Gününde Seni Yapamam ..." şarkısının melodisini söyler :)

      Doğum gününde seni yapamayız
      Sevgili Mercedes, ver
      Ama sana bir hediye vereceğiz, şüphesiz
      Ve yüz kez tekrar etmeye hazırız:

      Nazik, neşeli, dikkatli
      Ve iş dünyasında, genel olarak tanınan bir uzman,
      Genel olarak bizimle harikasın
      Ve yoldaş, koca ve baba!

      Lider:

      Sizi içtenlikle tebrik etmek istiyoruz,
      Ve pasaporttaki yaşı da düzeltin,
      Sonuçta, görünüşün konuşuyor, gülüşün,
      Pasaportta on yıl için ne büyük bir hata!

      (Misafirler, askerin şarkısı olan "Yol seninle benimle çok uzakta ...")

      Doğum günü çocuğu cesur bir adam
      Saflarda bir şahin gibi görünüyor!
      Hepimiz ona saygı duyuyoruz
      Ve savaşta olduğu gibi hizmette!

      Koro:

      ________ (doğum günü kişisinin adı) Git! Yola çıkalım! Yola çıkalım!
      Yüz yıla varmak için
      Ve güçlü kal
      Kader seni çağırıyor!
      ________ (doğum günü kişisinin adı) Devam edin!

      Sevgili günün kahramanı
      Kalplerimizin derinliklerinden tebrikler!
      Hem madalyayı hem de hediyeyi sunuyoruz
      Onun büyük erdeminin bir işareti olarak!

      Koro.

      Günün kahramanına bir hediye ve unutulmaz bir hediye verilir yazıtlı madalya: "İş, dostluk ve aşkta harika hizmetler için." (Madalya tahtadan kesilebilir ve doğum günü çocuğunun boynuna bir kurdele ile asılabilir

      "Doğum günü çocuğunu kim daha iyi bilir" konulu rekabet!

      Doğum günü görevlisinin kendisi yargıç olacak.
      Sunum yapan kişi sorular sorar ve doğru cevaplar için fişleri verir. Oyunun sonunda en çok fişe sahip olan kişi doğum günü adamının aftografı ile ödül alır.

      Müzikal duraklama.

      Filmde Doğum Günü Sınavı

      Sevgili arkadaşlar! En bilgili konuğu belirlemeye çalışalım! Tabii ki tema hala aynı - Doğum günü. Sadece hayatta değil, ekranda!

      Her doğru veya esprili cevap için bir belirteç verilir. Testin sonuçlarına göre, en fazla sayıda fişe bir ödül verilir. Örneğin, bir çikolata. Konuklar tahmin edemiyorsa, sunucu bir ipucu vermeli, onlara bu filmi biraz hatırlatmalı.

      Komik sorular ve cevaplar

      İki torba soru ve cevap hazırlıyorsunuz. Önce kişi soruyu kime soracağını duyurur, soruyu çizer ve okur. Adını verdiği cevaba bir çanta dolusu cevap verir. Sonra adı verilen kişi cevabı çıkarır ve okur. Sonra soruyu kime soracağını da duyurur, soruyu çıkarır ve okur. Vb.

      Liderin emriyle dans edin

      Tebrik telgrafları-bilmeceler (misafirlerden gelenler dahil)

      Sunucu duyurur: Tanya için tebrik telgrafları geldi, ancak hepsi imzasız. Göndereni tahmin etmeniz gerekiyor. Bunlar herkesin bildiği insanlar kadar misafirlerdir. Ve hatta harika kahramanlar!

      Kulağına aşk hakkında fısıldamalarına izin ver!
      Takma adıyla prenses ... Kurbağa

      Sadece eski şaraplar içmek istiyorum!
      Mutlu tatiller! ... Malvina

      Gitarla daha sık şarkı söylemeni dilerim!
      Size iyi şirket! ... Rotaru

      Planlanmamış aşkla tanışmamanı dilerim!
      Müzikale selamlar ... Bulanova

      Canlı, seryozha, eğlenceli ve havalı!
      Çocukluğunuzu unutmayın! ... Kraliçe

      Size bol müzik ve kahkaha diliyorum,
      aşk ve sonsuz gençlik! ... Piekha

      İncire her zaman para olsun!
      Ve tavuk budu! ... Baba Yaga

      Tarlayı ve ormanı daha sık ziyaret edin!
      Size sağlık! ... Alsou

      umutsuzluğa asla izin verme!
      Annemden büyük bir merhaba! ... Orbokayte

      Acil durumlara ve çatışmalara girmeyin!
      Sana uzun bir ömür dilerim! Grup… Oklar

      Doğru cevabı ilk verene fiş verilir. En yüksek fiş sayısına ödül verilir.

      Bilmece Piyango

      Ödül, ev sahibinin çantada ne tür bir nesne olduğunu tahmin eden kişiye gider. Moderatöre yönlendirici sorular sorabilirsiniz. "Evet" veya "hayır" diye cevap veriyor.

      Piyango - tahmin

      Herkes bilet çıkarır ya da şaka, anekdot için alır. Çizim sırasında Moderatör şunları söylüyor:
      - Şimdi kaderi deneyeceğiz ve kimin için ne hazırladığını öğreneceğiz.
      İlk sayıdan itibaren hediye verir ve gelecek yıl için öngörüleri okur.

      "Varolmayan bir hayvan çizin" testi

      Konuklardan var olmayan bir hayvanı çizmelerini ve adını yazmalarını istersiniz.

      Bir erkek testi çizin

      12 rakamdan bir kişi çizmeniz gerekiyor: tüm rakamları kullanmanız gerekiyor - bir daire ve üçgenler, kareler. (Toplamda 12 tane var)

      Akşamın sonunda, konukları doğum günü için bir banka hesabı açmaya davet edebilirsiniz. Sonra tüm misafirlerin bir düzine fırlatabileceği 3 litrelik bir kavanoz çıkarın.