İnşaat portalı - Kapılar ve kapılar.  İç mekan.  Kanalizasyon.  Malzemeler.  Mobilya.  Haberler

Yazardan: PHP arama betiği, modern kaynağın ayrılmaz bir parçasıdır. Ancak acemi geliştiriciler için uygulanması bir "temel taşı" olabilir. Bugün böyle bir modülün yapısını olabildiğince basit bir şekilde açıklamaya çalışacağım, böylece kodu aşırı karmaşıklığı ile sizi korkutmasın.

PHP'yi arıyorum

Sitedeki dahili arama sisteminin organizasyonu önemli bir görevdir. Bu tür bir işlevselliğin varlığı, kaynağı herhangi bir kullanıcının gözünde önemli ölçüde yükseltir. Bu özellikle, içeriği belirli “sorunları” çözmeye adanmış, oldukça uzmanlaşmış siteler için geçerlidir. Örneğin, web programlamada.

Çoğu zaman, PHP'de bir site arama komut dosyası yazmak için, bu programlama dilinin . AJAX teknolojisi, etkileşimli bir arama motorunu uygulamak için kullanılır. Ancak bugün bu tür vahşi ortamlarda “kaçmayacağız” ve klasik versiyona odaklanacağız.

En basit arama örneğini vereceğim. DBMS ile bir bağlantı olup olmadığını kontrol etmeyecek, döndürülen seçimin sonuçlarını kontrol etmeyecek, vb. Tüm bu incelikleri kendiniz ekleyebilirsiniz. Malzemenin amacı, modern bir İnternet kaynağı üzerinde dahili bir arama sistemi oluşturma hakkında genel bir fikir vermektir. Gitmek!

Başlangıç ​​olarak, bir arama sorgusu girmek için form kodunu vereceğim. Bu, en ufak bir stil "fırfırlar" olmadan basit bir işaretlemedir.




< form name = "f1" method = "post" action = "search.php" >

< input type = "search" name = "search_q" / > < / br >

< / br >

< input type = "submit" value = "Arama" / > < / br >

< / form >

Form tarayıcıda şöyle görünür:

Gelelim senaryoya

Şimdi doğrudan program koduna geçiyoruz. Başlangıç ​​olarak, içinde oluşturulması gereken tablonun yapısını vereceğim. Yayınlanmış materyalleri başlıklarına göre arayacağız. Aynı prensiple, sitede kelime aramak için bir PHP betiği oluşturabilirsiniz. Her şey yetenekli ellerinizde.

İlk olarak, kullanıcının formda girdiği değeri kesiyoruz. Sonra onu "çöp"ten temizleriz: fazladan boşluklar, etiketler ve veritabanına bağlanırız. Bundan sonra, arama sorgusunun değerini tabloda depolanan malzemelerin adıyla karşılaştırdığımız bir SQL sorgusu çalıştırıyoruz. Bir eşleşme varsa, ilgili içeriği görüntüleriz. Sonunda MySQL bağlantısını kapatıyoruz ve sorguyu "sıfırlıyoruz". İşte örneğin tüm kodu:

$search_q = $_POST [ "search_q" ];

$l = mysqli_connect ("localhost", "root", "", "site");

$search_q = kırp ($search_q ) ;

$search_q = strip_tags ($search_q ) ;

$itog = mysqli_fetch_assoc ($q);

Bir form kullanarak sunucuya veri aktarımını organize etmek için, site ziyaretçilerinin bilgilerini ve PHP kodunu gireceği bir HTML formu uygulamanız gerekecektir, amacı sunucuda alınan verileri kabul etmek ve işlemektir.

HTML Gönderim Formu

Sayfadaki form etiketlerden oluşur

...
, içine metinsel bilgi girmek için alan etiketleri, özel bileşenler için etiketler (örneğin, bir birleşik giriş kutusu), bir seçim alanı için etiketler ve dosya yükleme için etiketler yerleştirilir.

* HTML5 için, form alanı etiketlerini form etiketlerinin içine değil, sayfanın herhangi bir yerine yerleştirmek de mümkündür. Aynı zamanda, bu tür her bir alan için, hangi gönderim biçimiyle etkileşime girmesi gerektiğini belirlemek için "form" özniteliği belirtilmelidir.

Bu nedenle, en basit form gönderimi aşağıdaki kodu içerebilir:


Bir değer:
B değeri:

Form elemanları ve parametreleri:

action="formum.php"– "action" özelliği, gönderilen verileri hangi php dosyasının işleyeceğini belirler. Bu örnekte veriler, form sayfasıyla aynı dizinde bulunan "myform.php" dosyasına gönderilecektir. Bu öznitelik açıkça belirtilmezse, form verileri formun kendisinin sayfa adresine gönderilir.

yöntem = "gönder"– yöntem parametresi, POST veya GET veri aktarım yöntemini tanımlar. Bununla ilgili daha fazla bilgiyi "POST ve GET yöntemleri arasındaki farklar" makalesinde bulabilirsiniz. Niteliği açıkça belirtmezseniz, varsayılan olarak GET yöntemi kullanılacaktır.

Metin "A değeri:" ve "B değeri:" sadece formun tasarımı ve kullanıcı için anlaşılırlığı amacıyla eklenmiştir. Veri aktarımı için bunu eklemek gerekli değildir ancak kullanıcının ne gireceğini anlaması için belirtmekte fayda var.

etiketler çeşitli form kontrolleri oluşturmak için kullanılır.

tür = "metin"– "type" özelliği, alanın türünü tanımlar. Hangi tür belirtildiğine bağlı olarak, elemanın hem görünümü hem de amacı değişir. "Metin" özniteliğinin değeri, öğenin tarayıcıda kullanıcının dizesini girebileceği tek satırlık bir metin alanı olarak görüntüleneceğini belirtir.

isim = "veri1"– "name" özelliği, sunucu tarafından alınan dizideki verinin adını veya dizinini belirtir. Bu, php işleyicisinde daha sonra iletilen değere erişmenin mümkün olacağı gerekli bir parametredir. Ad isteğe bağlı olarak seçilebilir, ancak bu değerin açık bir anlamı olduğunda daha uygundur.

type="gönder"- etiket bu değer ile "type" parametresi sayfada buton olarak görüntülenecektir. Aslında, formda bir düğme olmadan yapabilirsiniz. Örneğin, formda metin alanları varsa, klavyedeki "Enter" tuşuna basılarak gönderme işlemi yapılabilir. Ancak bir düğmeye sahip olmak, formu daha net hale getirir.

değer="(!LANG:Gönder" !}– bu durumda (type="submit" için) yalnızca düğmedeki başlığı tanımlar. Örneğin type="text" için bu, metin alanında görüntülenecek metin olacaktır.

Sonuç olarak, sayfada bu kod şöyle görünecektir:

Butona tıklandığında veriler belirtilen sayfaya gönderilecek ve mevcutsa ve doğru çalışıyorsa veriler işlenecektir.

PHP'de HTML formu gönderilen verileri işleme

Açıklanan şekilde gönderilen veriler $_POST, $_GET ve $_REQUEST süper küresel dizilerine yerleştirilir. $_POST veya $_GET, hangi yöntemin gönderildiğine bağlı olarak veri içerecektir. $_REQUEST, belirtilen yöntemlerden herhangi biri tarafından gönderilen verileri içerir.

$_POST, $_GET ve $_REQUEST, indeks alanları etiketlerin "name" nitelikleriyle eşleşen ilişkisel dizilerdir. . Buna göre myform.php dosyasındaki verilerle çalışmak için alan adını indeks olarak belirterek böyle bir dizinin elemanlarının değerlerini değişkenlere atayabilirsiniz:

// GET yöntemi için
$a = $_GET[ "veri1" ];
$b = $_GET[ "veri2"];

// POST yöntemi için
$a = $_POST[ "veri1" ];
$b = $_POST[ "veri2"];

// herhangi bir yöntemle
$a = $_REQUEST[ "veri1" ];
$b = $_REQUEST[ "veri2"];

Form alanlarının doldurulmasının kontrol edilmesi

Bazen veri alırken, kullanıcının boş bir form gönderip göndermediğini kontrol etmeniz gerekir. Bunun için boş fonksiyonunu kullanabilirsiniz.

if (boş ($_REQUEST["data1" ])) (
Eko "Alan doldurulmadı";
} başka(
Eko "Alan doldu";
$a = $_REQUEST[ "veri1" ];
}

Genellikle bu çözüm yeterlidir. Metin girmeniz gerekiyorsa, girilip girilmediği anlaşılır. Ancak, kullanıcı hesaplama için bilerek sıfır girerse, boş fonksiyon hiçbir değer olmadığını gösterecektir. Bu nedenle, bu tür durumlar için isset işlevini kullanmak daha iyidir. Değerin ayarlanıp ayarlanmadığını açıkça kontrol edecektir.

if (isset ($_REQUEST["data1" ])) (
Eko "Alan doldu";
$a = $_REQUEST[ "veri1" ];
} başka(
Eko "Alan doldurulmadı";
}

30 Nisan 2016'da güncellendi

PHP ve MySQL kullanarak basit aramanın nasıl oluşturulacağını size göstereceğim. Şunları öğreneceksiniz:

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

hazırlık

Elbette Apache, MySQL ve PHP'nin kurulu ve çalışır durumda olması (farklı platformlar için veya Windows için WAMP, mac için MAMP kullanabilirsiniz) veya PHP ve MySQL veritabanlarını destekleyen bir web sunucusu/hosting'iniz olmalıdır.

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

  • phpMyAdmin'e gidin, bilgisayarınızda sunucu varsa ona http://localhost/phpmyadmin/ adresinden erişebilirsiniz.
  • Veritabanı oluştur, benimkini tutorial_search olarak adlandırdım
  • Tablo oluştur 3 alan kullandım, makaleler olarak adlandırdım.
  • 1. alan için yapılandırma. Ad: id, yazın: INT, AUTO_INCREMENT'i kontrol edin, dizin: birincil

INT tamsayı anlamına gelir
AUTO_INCREMENT, yeni girişlerin öncekinden farklı(daha yüksek) numaraya 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 karakterdir (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: METİN

METİN, "uzun dize" anlamına gelir, uzunluk belirtmek gerekli değildir, uzun metin için kullanın.

  • Tabloyu rastgele makalelerle doldurun (bunları haber sitelerinde bulabilirsiniz, örneğin: CNN, BBC, vb.). Üst menüde ekle'yi tıklayın ve metni belirli alanlara kopyalayın. "id" 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ı sadece bir dosya ile yapabiliriz, ancak iki tane kullanalım, daha kolay olacak)
  • Bunları varsayılan html işaretlemesi, doctype, head vb. ile doldurun.

Arama

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

GET - bilgilerinizin url'de saklanacağı anlamına gelir (http://localhost/tutorial_search/search.php?query= senin sorgun)
POST - bilgilerinizin gösterilmeyeceği anlamına gelir, şifreler, özel bilgiler için kullanılır, GET'ten çok daha güvenlidir

Tamam, php ile başlayalım.

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

< to >$sorgu = mysql_real_escape_string($sorgu); // kimsenin SQL enjeksiyonu kullanmadığından emin olur $raw_results = mysql_query("SELECT * FROM makalelerden WHERE (`title` LIKE "%".$query."%") VEYA (`text` LIKE "%".$query."% ")") veya die(mysql_error()); // * tüm alanları seçtiği anlamına gelir, ayrıca şunu da yazabilirsiniz: `id`, `title`, `text` // makaleler tablomuzun adıdır // "%$query%" aradığımız şey , % herhangi bir anlama gelir, örneğin $query Hello ise // "merhaba", "Merhaba adam", "gogohello" ile eşleşir, tam eşleşme istiyorsanız `title`="$query" // kullanın veya isterseniz sadece tam kelimeyi eşleştirmek için "gogohello" dışarıda, "% $query %" ...VEYA ... "$query %" ... VEYA ... "% $query" if(mysql_num_rows($raw_results) > kullanın

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

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

"; // veritabanından alınan sonuçları gönderir(başlık ve metin) ayrıca id ($results["id"]) ) )else( // eğer eşleşen satır yoksa echo "Sonuç yok"; ) ) gösterebilirsiniz else( // sorgu uzunluğu minimumdan küçükse echo "Minimum uzunluk ".$min_length; ) ?>

Tamamlandı!

Şimdi çalışıyor. Farklı kelimeler, varyasyonlar, düzenleme kodu, deneme deneyin. Bir şeyleri kaçırdığınızı düşünürseniz, her iki dosyanın da tam kodunu ekliyorum. Soru sormaktan veya eğitimler istemekten çekinmeyin.

index.php

Arama

arama.php

Arama Sonuçları = $min_length)( // sorgu uzunluğu minimum uzunluktan daha fazla veya eşitse, o zaman $query = htmlspecialchars($query); // html'de kullanılan karakterleri eşdeğerleriyle değiştirir, örneğin:< to >$sorgu = mysql_real_escape_string($sorgu); // kimsenin SQL enjeksiyonu kullanmadığından emin olur $raw_results = mysql_query("SELECT * FROM makalelerden WHERE (`title` LIKE "%".$query."%") VEYA (`text` LIKE "%".$query."% ")") veya die(mysql_error()); // * tüm alanları seçtiği anlamına gelir, ayrıca şunu da yazabilirsiniz: `id`, `title`, `text` // makaleler tablomuzun adıdır // "%$query%" aradığımız şey , % herhangi bir anlama gelir, örneğin $query Hello ise // "merhaba", "Merhaba adam", "gogohello" ile eşleşir, tam eşleşme istiyorsanız `title`="$query" // kullanın veya isterseniz sadece tam kelimeyi eşleştirmek için "gogohello" dışarıda, "% $query %" ...VEYA ... "$query %" ... VEYA ... "% $query" if(mysql_num_rows($raw_results) > kullanın 0)( // eğer bir veya daha fazla satır döndürülürse aşağıdakileri yapın while($results = mysql_fetch_array($raw_results))( // $results = mysql_fetch_array($raw_results) veri tabanından veriyi diziye koyar, geçerli iken yapar döngü yankısı "

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

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

"; // veritabanından alınan sonuçları gönderir(başlık ve metin) ayrıca id ($results["id"]) ) )else( // eğer eşleşen satır yoksa echo "Sonuç yok"; ) ) gösterebilirsiniz else( // sorgu uzunluğu minimumdan küçükse echo "Minimum uzunluk ".$min_length; ) ?>

Birkaç kez hakkında bir makale yazmam istendi. php kullanarak site araması nasıl yapılır. Bu görev kolay değil, hatta söyleyebilirim - çok zor, çünkü çok sayıda nüans ve engel var. Bu yazıda analiz edeceğim site arama algoritması.

Diyelim ki sitemizde birçok farklı materyal var (makaleler, haberler, notlar vb.). Bütün bu iyilikler veritabanındadır. Ve görevimiz site aramasını uygula. En basit algoritma şudur:

  1. Oluşturmak HTML formu bir arama çubuğunun yanı sıra bir düğme ile " Göndermek". Metin alanına kullanıcılar bir arama sorgusu girecek ve ardından düğmesine tıklayacaktır.
  2. Arama sorgusunu alın (genellikle yöntem tarafından iletilir ALMAK, ama bazen kullanılır İLETİ) karşı korumak için XSS, fonksiyondan geçir htmlözel karakterler().
  3. Arama sorgusunu içeren kayıtların ilgili tablosundan (makaleler, haberler, notlar vb. ile) bir seçim yapın. Bu tür durumlar için örnek bir SQL sorgusu gösteriyorum: SELECT * FROM WHERE `text_article` LIKE %search% Ara arama dizesi değiştirilir.
  4. Kayıtları aldıktan sonra, bunları tercihen alaka düzeyine göre gerekli biçimde gösteririz. Örneğin, bunu sitemde yaptım: en çok eşleşmenin olduğu yerde, o makale daha alakalı, bu yüzden ilk sıraya koydum. Büyük olasılıkla, bu alaka düzeyini değerlendirme yöntemi de size uyacaktır.

Birçoğunuz burada karmaşık bir şey olmadığını söyleyecektir. Ve kısmen haklı olacaklar, ancak şu arama dizesi örneğine bakalım: " bu metni arıyorum". Bir soru ortaya çıktı:" Aslında aranan nedir?". Metnin tam olarak geçtiği yerin aranıp aranmadığı " bu metni arıyorum Ya da belki üç kelimenin de bulunduğu ancak birbirini takip etmeyen bir metin aranır. Ya da belki bu kelimelerden en az birinin bulunduğu bir metin aranır.

Ve burada görev çok daha karmaşık hale geliyor. Karmaşık bir sözdizimi sistemi yapabilirsiniz (arama motorlarında olduğu gibi), örneğin sorgu tırnak içinde verilirse tam eşleşme aranır. Ve kullanıcılara nasıl arama yapmak istedikleri konusunda bir seçenek sunabilirsiniz (radyo düğmelerini kullanarak). Böylece sitemde yapılıyor. Bu nedenle, önceki algoritmaya bir öğe daha eklenir: SQL sorgusu derlemek. İşte sorgudan en az bir kelime içeren tüm malzemeleri çıkarmanız gerektiğinde bir SQL sorgusu örneği " bu metni arıyorum":

* YERİNDEKİ (`text_article` GİBİ "%search%" VEYA `text_article` GİBİ "%this%" VEYA `text_article` GİBİ "%text%" GİBİ) makalelerden * SEÇİN

Buna göre, arama komut dosyasında benzer oluşturmalısınız SQL sorguları, veritabanına gönderin, yanıtı alın ve çıktısını alın. Hangisinin daha alakalı olması gerektiğini hemen söylemek zor olduğundan, gönderileri alaka düzeyine göre görüntülüyorsanız bu daha da karmaşık hale gelir: 3 isteğin tam eşleşmeleri veya 10 sorgu bölümlerinin oluşumları. Benim sitemde her zaman kesin olaylar tercih edilir, ancak bu nokta zaten oldukça tartışmalıdır. Tabii ki, bu zor ve bunu ilk kez yapıyorsanız, kesinlikle birkaç saat geçireceksiniz. umut benim PHP aracılığıyla sitede arama yapmak için algoritma Sana yardım edeceğim.

Son güncelleme: 1.11.2015

Verilerin bir web sitesine iletilmesinin ana yollarından biri, formların işlenmesidir. Formlar, metin alanları, düğmeler vb. gibi çeşitli girdi öğelerini içeren özel HTML işaretleme öğeleridir. Ve form verilerinin yardımıyla bazı verileri girip sunucuya gönderebiliriz. Ve sunucu zaten bu verileri işliyor.

Form oluşturma aşağıdaki yönlerden oluşur:

    Öğe oluştur

    HTML işaretlemesinde

    Bu öğeye bir veya daha fazla giriş alanı ekleme

    Veri aktarım yöntemini ayarlama: GET veya POST

    Girilen verilerin gönderileceği adresi ayarlama

O halde yeni bir form oluşturalım. Bunu yapmak için, aşağıdaki içeriği yerleştireceğimiz yeni bir form.php dosyası tanımlayacağız:

siteye girin

Giriş yapmak:

Şifre:

Form öğesinin action="login.php" özelliği, form verilerinin komut dosyası tarafından işleneceğini belirtir. login.php, dosyayla birlikte olacak form.php bir klasörde. Ve method="POST" özelliği, veri aktarım yöntemi olarak POST yönteminin kullanılacağını belirtir.

Şimdi bir dosya oluşturalım login.php, aşağıdaki içeriğe sahip olacak:

Şifreniz: $şifre"; ?>

Form verilerini almak için $_POST global değişkeni kullanılır. POST yöntemi kullanılarak gönderilen ilişkisel bir veri dizisini temsil eder. Anahtarları kullanarak gönderilen değerleri alabiliriz. Bu dizideki anahtarlar, form giriş alanlarının ad niteliklerinin değerleridir.

Oturum açma giriş alanının ad özelliği oturum açma olarak ayarlandığından ( ), sonra $_POST dizisinde bu alanın değeri "login" anahtarını temsil edecektir: $_POST["login"]

Ve giriş alanının ayarlanmayacağı durumlar olduğu için, örneğin doğrudan betiğe giderken: http://localhost:8080/login.php. Bu durumda, isset() işlevini kullanarak verileri işlemeden önce varlıklarının kontrol edilmesi istenir. Değişken ayarlanmışsa, isset() işlevi true değerini döndürür.

Şimdi forma dönebiliriz:

Ve düğmeye basıldığında, POST yöntemiyle girilen veriler komut dosyasına gönderilecektir. login.php:

Form verilerini başka bir komut dosyasına göndermek gerekli değildir, form verilerini aynı form dosyasında işlemek mümkündür. Bunu yapmak için dosyayı değiştirin form.php Aşağıdaki şekilde:

Şifreniz: $şifre"; ) ?>

siteye girin

Giriş yapmak:

Şifre:

Veri güvenliği

PHP'de veri güvenliğinin organizasyonu büyük önem taşımaktadır. Web sitemizin güvenliğini artırabilecek birkaç basit mekanizmaya bir göz atalım.

Ama önce son konudan formu alıp içine biraz veri girmeye çalışalım. Örneğin, giriş alanına girin "" ve şifre alanına metin "

parola

":

Verileri html işaretlemesine gönderdikten sonra, bir mesaj kutusu görüntüleyen bir javascript kodu enjekte edilecektir.

Bu güvenlik sorunlarından kaçınmak için htmlentities() işlevini kullanmalısınız:

If(isset($_POST["login"]) && isset($_POST["password"]))( $login=htmlentities($_POST["login"]); $password = htmlentities($_POST["password" ]); echo "Giriş bilgileriniz: $login
Şifreniz: $şifre"; )

Ve html veya javascript kodunu girdikten sonra bile tüm etiketlerden kaçılacak ve aşağıdaki çıktıyı alacağız:

Başka bir işlev - strip_tags() işlevi, html etiketlerini tamamen hariç tutmanıza izin verir:

if(isset($_POST["giriş"]) && isset($_POST["şifre"]))( $login=strip_tags($_POST["giriş"]); $şifre = strip_tags($_POST["şifre" ]); echo "Giriş bilgileriniz: $login
Şifreniz: $şifre"; )

Aynı girdi ile çalışmasının sonucu aşağıdaki çıktı olacaktır.

Bir hata fark ederseniz, bir metin parçası seçin ve Ctrl + Enter tuşlarına basın
PAYLAŞ:
İnşaat portalı - Kapılar ve kapılar.  İç mekan.  Kanalizasyon.  Malzemeler.  Mobilya.  Haberler