Uygulama örneği. Bitrix'te canlı arama. Uygulama örneği Erkek arama öğesi php i gerektir

Bugünün dersinde, bakacağız php mysql arama. Çok sayıda arama komut dosyası var, bazıları veritabanı kullanıyor, diğerleri onsuz yapıyor, tam sıralamalı gelişmiş aramalar var. Veritabanından iki tablo hakkında bilgi arayan olağan basit aramaya odaklanacağız. MySQL.

İlk adım. MySQL veritabanı.

Veritabanı oluşturma search_lite, iki tablosu var haberler- haberler ve vakum- boş işler.

Ayrıcalıkları ayarlayın:

Giriş yapmak - " kök",

Şifre - "",

Ev sahibi - " yerel ana bilgisayar".

Haber tablosunun dökümü.

`news` tablosu için tablo yapısı -- MEVCUT DEĞİLSE TABLO OLUŞTURUN `news` (`id` int(2) NOT NULL, `title` varchar(255) NOT NULL, `text` text NOT NULL, PRIMARY KEY (`id` int(2) NOT NULL `)) MOTOR=MyISAM VARSAYILAN CHARSET=cp1251;

Döküm masa boşluğu - boş yerler.

'vac' tablosu için tablo yapısı -- MEVCUT DEĞİLSE TABLO OLUŞTUR ('id' int(2) NULL DEĞİL AUTO_INCREMENT, 'title' varchar(255) NULL DEĞİL, 'metin' metni NULL DEĞİL, BİRİNCİL ANAHTAR (` id`)) MOTOR=MyISAM VARSAYILAN CHARSET=cp1251 AUTO_INCREMENT=3 ;

İkinci adım. HTML ve PHP.

Veritabanına bağlanıyoruz. Bir değişken üzerinde bir koşul ayarlayın $arama, arama sorgusunun girilmediği veya 4 karakterden az olduğu ve ayrıca eğik çizgi olup olmadığını kontrol edin ve değişkeni kırpın. Veritabanında iki tablo arayan iki sorgu oluşturuyoruz haberler ve vakum alan arama koşuluna göre Metin. (Kaç tablo aramanız gerektiğini zaten seçebilirsiniz. Örneğin, tablolarınız olacaktır. dersler, malzemeler, nesne vb. Alan yerine arama koşullarını da değiştirebilirsiniz. Metin, alanı seçebilirsiniz Başlık veya başka bir alan.) Ardından değişkende aramayı görüntülerken metinde kaç karakter olduğunu belirtiyoruz. $semboller. tablolarda ise haberler ve vakum Aramada hiçbir şey bulunamadı, bir mesaj gösteriyoruz. Bulunursa, iki tablodan veri çıktısı alın haberler ve vakum verilen arama sorgusu için.

Sorgu için arama sonuçları: $arama


"; Eko "
Arama sorgusu girilmedi veya 4 karakterden az!

"; ) başka ( yankı "
Sorgu için arama sonuçları: $arama

"; $search = htmlspecialchars(stripslashes(trim($search))); $sql_news = mysql_query("SEÇ id, başlık, metin NEREDE metin GİBİ "%$search%"); $news = mysql_num_rows($sql_news ); $sql_vac = mysql_query("ID, başlık, vac WHERE'DEN metin SEÇİN "%$search%"); $vac = mysql_num_rows($sql_vac); $find = $search; $symbolls = "80"; if ($news==0 ve $vac==0) echo "
\"$search\" aramanız hiçbir sonuçla eşleşmedi! Başka bir istek gönderin!

"; else ( /*News/news - tablo*/ for($i=1; $news = mysql_fetch_array($sql_news); $i++) ( $search_text = $news["text"]; $search_text = strip_tags($ arama metni, "
"); $search_txt_length = strlen($search_text); $search_first_enter = strpos(strtolower($search_text), strtolower($find)); $pad_left = $search_first_enter - $semboller; $pad_right = + $search_first_enter + 5;semboller if ($pad_right><0) $pad_left = "0"; $search_text = substr($search_text, $pad_left, $pad_right); $search_text = str_replace (strtolower($find), "".strtolower($bul)."
$i. $haber
...$arama_metni...
haberlerde bulunan

"; ) /*İşler/vac - tablo*/ for($i=1; $vac = mysql_fetch_array($sql_vac); $i++) ( $search_text = $vac["text"]; $search_text = strip_tags($search_text "
"); $search_txt_length = strlen($search_text); $search_first_enter = strpos(strtolower($search_text), strtolower($find)); $pad_left = $search_first_enter - $semboller; $pad_right = + $search_first_enter + 5;semboller if ($pad_right>$search_txt_length) $pad_right = $search_txt_length; if ($pad_left<0) $pad_left = "0"; $search_text = substr($search_text, $pad_left, $pad_right); $search_text = str_replace (strtolower($find), "".strtolower($bul)."", strtolower($search_text)); yankı"
$i. $vac
...$arama_metni...
boş işlerde bulundu

"; } } } } ?>

Üçüncü adım. CSS.

Aramamızı şekillendirecek bazı stiller yazalım.

Arama_adı ( renk: siyah; yazı tipi boyutu: 18 piksel; ) .arama_soruları ( renk: siyah; yazı tipi ağırlığı: kalın; yazı tipi boyutu: 15 piksel; ) .search_query ( renk: mavi; yazı tipi stili: İtalik; ) .search_error ( renk: kırmızı; yazı tipi boyutu: 15 piksel; ) .search_input ( kenarlık: 1 piksel düz siyah; genişlik: 500 piksel; yükseklik: 30 piksel; ) .search_word ( renk: mavi; ) .search_title ( yazı tipi boyutu: 20 piksel; renk: mavi; yazı tipi ağırlığı: kalın; ) .search_text ( yazı tipi boyutu: 15 piksel; renk: siyah; ) .search_cat ( yazı tipi boyutu: 12 piksel; renk: gri; kayan nokta: sağ; kenar boşluğu: 20 piksel; )

Sizinle basit bir şekilde düşündük php mysql arama Bir veritabanından bilgi arayan A. Duruma göre, iki tablo kullanılır, herhangi bir uygun şekilde özelleştirebilirsiniz. Bir sonraki ders, yalnızca gelişmiş özelliklerle basit bir aramanın analojisine ayrılacaktır.

11.1K

Herhangi bir sitedeki en popüler ve gerekli işlevlerden biri, özel bir form kullanılarak uygulanan bir aramadır. Bu işlevsellik, ziyaretçilerin ilgilendikleri içeriği sitede hızlı bir şekilde bulmalarını sağlar.

Bugün size veritabanı tablolarını sorgulayacak ve sitedeki mevcut yöneticilerle ilgili bilgileri görüntüleyecek özel bir form kullanarak sitede nasıl arama yapacağınızı anlatmak istiyoruz. Mevcut personel hakkında bilgi içeren bir veritabanı tablosunun nasıl oluşturulacağını öğreneceksiniz.

PHP ile arama formları geliştirin ve SQL'e aşina olun ( Yapılandırılmış sorgu dili) veritabanlarında bulunan bilgilerin toplanması, kaydedilmesi ve değiştirilmesi için özel bir dildir. Başlamadan önce şunları yapmanızı öneririz: proje dosyalarını indir.

neye ihtiyacın olacak

  • MySQL veritabanı aracı.
  • PHP destekli yerel veya uzak sunucu.
  • Metin düzeltici.

Veritabanı oluşturma

Barındırma sisteminizdeki veritabanıyla başa çıkabileceğinizden tam olarak emin değilseniz, talimatlar veya yardım için ana bilgisayarla iletişime geçin. Veritabanı oluşturulduktan sonra, onu bağlamanız, bir tablo oluşturmanız ve gerekli verileri ona yazmanız gerekecektir.

En popüler MySQL yönetim aracı PHP My Admin'dir.Bu araç bugünkü rehberimiz için yeterli olacaktır.

Tablo oluştur

Tablomuz aşağıdaki formatta oluşturulmalıdır:

sütun adı veri tipi Uzunluk Null veya Null Değil birincil anahtar? Otomatik artış
İD INT 1 Geçersiz değil Evet Evet
İlk adı Varchar 50 Geçersiz değil hayır hayır
Soyadı Varchar 50 Geçersiz değil hayır hayır
E-posta Varchar 50 Geçersiz değil hayır hayır
Telefon numarası Varchar 15 Geçersiz değil hayır hayır

Bir veritabanı tablosu, tıpkı Excel'de olduğu gibi sütunlardan ve satırlardan oluşur. İlk sütun, verileri ada göre tanımlamanıza olanak tanır. Ardından, sütunda bulunan veri türünü bize gösteren Veri türleri (veri türü) sütunu gelir. Uzunluk (Uzunluk) alanında, bir tablo sütunu için maksimum bellek (depolama) miktarını gösterir. Daha fazla esneklik sağlayan değişkenler kullanıyoruz. Başka bir deyişle, tam adın uzunluğu 50 karakterden azsa, ayrılan alanın yalnızca bir kısmı işgal edilecektir.

Ve personel verileri arasında boş değerler olamaz ( boş, boş). Kimlik sütunu ana anahtarımız olduğu için ilk satır sarı renkle vurgulanmıştır. Veritabanındaki birincil anahtar, her girişin benzersiz olacağını garanti eder. Bu sütun aynı zamanda otomatik olarak artırılır, bu, veritabanımızdaki her kayda otomatik olarak benzersiz bir numara atanacağı anlamına gelir.

Tabloya personel temsilcilerini giriyoruz

Tabloyu anladıktan sonra, onu verilerle doldurmaya başlayın. İşlemi zihinde sabitlemek için 6 giriş yeterlidir. İşte kendi örneğim:

Sütun Kimliği İlk adı Soyadı E-posta Telefon numarası
2 Ryan uşak [e-posta korumalı] 417-854-8547
3 Brent Callahan [e-posta korumalı] 417-854-6587

Form geliştirme

Google üzerinden bir site arama formu oluşturmak için uygun herhangi bir metin düzenleyiciyi açın. Ücretsiz PSPad kullanmanızı tavsiye ederim. Sözdizimi vurgulaması olan herhangi bir metin düzenleyiciyi kullanabilirsiniz. Bu, PHP kodunu yazma ve hata ayıklama sürecini büyük ölçüde kolaylaştıracaktır. Bir arama formu için bir sayfa oluştururken, onu .php formatında kaydettiğinizden emin olun, aksi takdirde PHP kodu düzgün şekilde ayrıştırılmayacaktır. Belgeyi kaydettikten sonra, aşağıdaki işaretlemeyi içine kopyalayın:

Kişi arama:

Ayrıntılı kişi arama

Adına veya soyadına göre arama yapabilirsiniz



HTML diline aşina iseniz, en azından açılış formu etiketine kadar her şey sizin için net olmalıdır. Bu etiketin içinde, tüm kodun en önemli öğesi olan action özelliği bulunur. Formumuzun eylemi olarak dosyamızın adını belirledik ve ardından sorgu dizesini uyguladık “ Git”.

Kriter kontrolü

Kullanıcı bir ad veya soyadı girip gönder düğmesine tıkladığında, form verileri kendisine gönderir ve sorgu dizesini ekler. Git". Bu noktada go sorgu dizesinin varlığını kontrol ediyoruz. Sonuç olumluysa, arama sonuçlarını görüntüleriz.

İstenen sonuçları görüntülemeden önce, iki kez kontrol etmemiz gerekir: (1) form gönderildi mi, (2) sorgu dizesi go değerini içeriyor mu, (3) arama terimi küçük harfle mi yoksa büyük harfle mi girildi? Kontrollerin hiçbiri olumlu sonuç vermiyorsa ( doğru), herhangi bir işlem yapmamıza gerek yoktur.

İlk olarak, kapanış etiketinden sonra site araması için küçük bir PHP kodu bloğu ekleyelim.:



İlk olarak ”” etiketi ile bir PHP kod bloğu açıyoruz.

Bu etiket çiftindeki herhangi bir PHP kodu, sunucu tarafından yürütülecektir. Daha sonra formun gönderilip gönderilmediğini kontrol ederiz:

Bir arama terimi girin

"; } ?>

Bir bool değeri döndüren yerleşik isset işlevini kullanacağız ve buna $_POST dizisini koyacağız. Programlamadaki mantıksal bir ifade, true veya false almamızı sağlar.

Bu nedenle, işlev true değerini döndürürse, form gönderildi ve kodu daha fazla yürütmeye devam etmemiz gerekiyor. İşlev false döndürürse, bir hata mesajı görüntüleyeceğiz. Tüm yazılan kodu search_submit.php dosyasına kaydedin.

Bir arama terimi girin

"; } } } ?>

Ana ifadenin içine başka bir koşullu boole ifadesi yerleştiririz, ancak bu sefer $_GET dizisini “ değeriyle birlikte kullanırız. Git". Değişikliklerinizi search_go.php dosyasına kaydedin.

Şimdi, ziyaretçilerin sorgu dizesindeki yalnızca ilk harfi büyük harf veya yalnızca küçük harf olarak girebildiğinden emin olmamız gerekiyor. Ayrıca ziyaretçi tarafından girilen arama kriterlerini hesaba katacak bir yol sağlamamız gerekiyor. Ziyaretçi girişini doğrulamanın en iyi yolu, düzenli bir ifade kullanmaktır:

İkimizin içine başka bir koşullu boole ifadesi yerleştiririz. Bu sefer girişi doğrulamak için normal bir ifade kullanıyoruz. Preg_match yerleşik işlevini iki parametreyle kullanırız: normal bir ifade ve doğrulamanın uygulanması gereken bir form alanı.

Bizim durumumuzda bu alan olacak " Ad"( isim). Ziyaretçi tarafından belirtilen arama parametrelerini almak için bir $name değişkeni oluşturuyoruz ve SQL sorgusunda kullanılacak formdan alan adı ile buna bir POST değeri bağlıyoruz. Şimdi uyguladık: (1) form verilerini gönderme, (2) sorgu dizesi bir go değeri içeriyor ve (3) ziyaretçi ya büyük harf ya da küçük harf girdi. Ve tüm bu kontroller, veritabanında değişiklik yapılmadan önce bile gerçekleşir. Tüm değişiklikleri kaydedin.

Bir veritabanı tablosundan Bağlan, Seç, Sorgula ve Sonuçları Döndür

Bir tablodan veri almak için önce site arama komut dosyasındaki sunucuya bağlanmanız gerekir. Bunun için aşağıdaki kodu kullanıyoruz:

", "") veya öl ("Veritabanına bağlanamıyorum çünkü: " . mysql_error()); else( echo "

Lütfen bir arama terimi girin

"; } } }?>

Bir $db değişkeni oluşturuyoruz ve bunu, üç parametre alan MySQL yerleşik işlevi mysql_connect'e bağlıyoruz: veritabanına sahip sunucu ( yerel ana bilgisayar, yerel olarak çalışıyorsanız), giriş ve şifre.

Bundan sonra, veritabanına bağlantı yoksa daha fazla kod yürütülmesini durduran yerleşik PHP işlevini çalıştırırız die . Ve hatanın nedenini döndürecek olan MySQL yerleşik mysql_error işlevini çalıştırarak hata bilgilerini yazdırın. search_connectdb.php dosyasını kaydedin.

Lütfen bir arama terimi girin

"; } } } ?>

mydb adında bir değişken oluşturun ve onu yerleşiklere bağlayın MySQL işlevleri mysql_select_db ve ardından daha önce oluşturduğumuz veritabanının adını belirtin. Ardından, ziyaretçi tarafından girilen arama parametrelerini içeren ad değişkeni ile bir SQL sorgusu kullanarak veritabanı tablosunu sorgularız:

Lütfen bir arama terimi girin

"; } } } ?>

Bir veritabanı tablosunu sorgularken, bir $sql değişkeni yaratır ve onu bir SQL sorgusu içeren bir dizgeye bağlarız. SELECT deyimini, id sütunlarından değerleri ve kişiler tablosundan ad ve soyadlarını almak için kullanırız. Daha sonra aramayı daraltmak için WHERE yan tümcesini ad ve soyadı değerleriyle birlikte kullanırız.

LIKE operatörüyle birlikte, arama dizesindeki ad değişkeninin yanı sıra 0 veya daha fazla karakter döndüren özel bir karakter olan yüzde işaretini (%) kullanırız. Sonuç olarak, GİBİ ( özel bir karakterle birleştirilmiş) bir veritabanı tablosunda eşleşen herhangi bir adı bulur. Tüm süreç şu şekilde açıklanabilir: Kişiler tablosundan ziyaretçi tarafından girilenlerle eşleşen ad ve soyadlarını seçiyoruz.". search_query.php dosyasını kaydedin.

Lütfen bir arama terimi girin

"; } } } ?>

Bir $result değişkeni yaratırız ve buna mysql_query() fonksiyonunun değerini $query içine koyarak atarız. Şimdi sorgumuz sonuç değişkeninde saklanıyor. Sonucu PHP'de çıkarmak için bir döngü oluşturuyoruz ve ardından verileri sırasız bir liste halinde çıkarıyoruz:

n"; yankı "

  • " . "
  • n"; yankı ""; ) ) başka( yankı "

    Lütfen bir arama terimi girin

    "; } } } ?>

    İlk önce bir while döngüsü oluşturuyoruz, bunun içinde satır adında bir değişken oluşturuyoruz ve onu, SQL sorgumuzu içeren bir sonuç değişkenini alan mysql_fetch_array işlevinin dönüş değeriyle başlatıyoruz. while döngüsünün içinde, her sütun değerine aynı ada sahip bir değişkenin değerini atarız. Daha sonra sırasız bir liste içindeki değerleri çıkarıyoruz.

    Burada dikkat edilmesi gereken iki önemli husus vardır: (1) while döngüsü içinde, değerler doğrudan satır dizisinden alınabileceği için satır dizisi değişkenlerine değer atamanıza gerek yoktur; (2) dosya adımızda id ve ana anahtarla birlikte kullandığımız bağlantı etiketi. Bunun nedeni, birçok arama öğesinin başlangıçta hiçbir şey göstermemesidir.

    Bağlantı etiketimizin sonuna bir kimlik ekleyerek yalnızca adı ve soyadını görüntülediğimiz için, kimliği personel hakkında ek bilgiler gösterecek ek bir sorgu için kullanabiliriz. Dosyayı kaydedin ve site arama PHP formunu test edin ( search_display.php).

    Sekmeleri kaldır

    Sonuçlar sırasız bir liste olarak görüntüleniyor, ancak sonuçta sekmelere ihtiyacımız yok. Ondan kurtulmak için, dosyanızın en üstüne aşağıdaki CSS kuralını ekleyin head :

    Harflere göre ara

    Yazım aramasını uygulamak için yalnızca birkaç ekstra kod satırı gerekir. Ziyaretçiler için bu kullanışlı işlevi ekleyelim. Bu sayede ad veya soyadında yer alan harflerle personel temsilcilerini bulabileceklerdir.

    Kapanış formu etiketinden sonra aşağıdaki kod satırını ekleyin:

    bir | b | K

    Etiketi bağlarız bir bağlantı kullanarak bir sorgu dizesine ve belirli bir harfe ayarlayın. Yazım arama işlevini uygulamak için, aşağıda gösterildiği gibi, orijinal komut dosyasındaki kapanış küme parantezinden hemen sonra aşağıdaki kodu eklememiz gerekir:

    )//Arama formu komut dosyasının sonu if(isset($_GET["by"]))( $letter=$_GET["by"]; //Veritabanına bağlanma $db=mysql_connect ("sunucuadı", " username" , "password") veya die ("Veritabanına bağlanamıyorum çünkü: " . mysql_error()); //-Veritabanını seçin $mydb=mysql_select_db("yourDatabase"); //-Veritabanını sorgulayın tablo $sql="SELECT ID, FirstName, LastName NERDEN Kişilerden Ad GİBİ "%" . $harf . "%" VEYA Soyadı GİBİ "%" . $harf ."%""; //-Bir MySQL Sorgu işlevi sorgusu çalıştırın $ sonuç=mysql_query($sql); //-Sonuçları sayıyor $numrows=mysql_num_rows($sonuç); echo "

    " .$numrows . " için bulunan sonuçlar " . $letter . "

    "; //-Döngüyü başlatın ve sonuçları sıralayın while($row=mysql_fetch_array($result))( $FirstName =$row["FirstName"]; $LastName=$row["LastName"]; $ID=$ satır[ "ID"]; //-Sonucu dizide göster echo "
      n"; yankı "
    • " . "" .$Ad . " " . $Soyadı . "
    • n"; yankı "
    "; } }

    Burada site arama komut dosyasının dört kod parçasını değiştirdik:

    • isset() işlevini kullanırız ve $_GET dizisini onun içine koyarız ve ardından değere göre kontrol ederiz;
    • Bir $letter değişkeni oluşturun ve değerini $_GET dizisiyle başlatın;
    • SQL sorgusuna değişken harf ekleyin;
    • Sayılan satır sayısını aldığımız ifadenin içindeki değişken harfini belirtiriz.

    search_byletter.php dosyasını kaydedin ve sonucu kontrol edin.

    Belirli bir çalışanı arayın

    Bağlantımızdaki benzersiz bir kimlikten geçirilen personelin geri kalanıyla ilgili bilgileri görüntülemek için, aşağıda gösterildiği gibi harf komut dosyasındaki kapanış küme parantezinden hemen sonra aşağıdaki kodu eklememiz gerekir:

    )//Komut dosyasının sonu if(isset($_GET["id"]))( $contactid=$_GET["id"]; //Veritabanına bağlanma $db=mysql_connect ("sunucuadı", "kullanıcıadı" , " password") veya die ("Veritabanına bağlanamıyorum çünkü: " . mysql_error()); //-kullanılacak veritabanını seçin $mydb=mysql_select_db("yourDatabase"); //- Veritabanını sorgulayın tablo $sql="SELECT * FROM Contacts WHERE ID=" .$contactid; //- mysql_query() işlevine sorgu çalıştır $result=mysql_query($sql); //- Döngüyü çalıştır ve sonuçları sırala($row=mysql_fetch_array) ($result))( $FirstName =$satır["FirstName"]; $LastName=$satır["LastName"]; $TelefonNumarası=$satır["TelefonNumarası"]; $Email=$satır["Email"]; //- Sonucu eko " dizisinde göster

    "; } }

    Burada dört parça kod değiştirdik:

    • $_GET dizisindeki ID değerini kontrol etmek için isset() fonksiyonunu kullanırız;
    • Bir $contactid değişkeni oluşturun ve onu $_GET dizisiyle başlatın;
    • Tabloda, yıldız işareti * ile işaretlenmiş her şeyi seçin. Yıldız işareti, SQL'de " bana tablodaki tüm sütunları ve satırları ver". Hangi bilgilerin görüntüleneceğini belirlemek için SQL ifadesinin sonunda contactid değişkeninden bahsederiz;
    • Personelin her temsilcisi hakkında ek bilgiler görüntüleriz.

    search_byid.php dosyasını kaydedin ve sonucu kontrol edin.

    Lütfen işlevselliğimizin beklendiği gibi çalıştığını unutmayın. Alana bir ad veya soyadı girdiğinizde veya köprü olarak bir harf seçtiğinizde, yalnızca personelin adları görüntülenir. Bağlantının üzerine gelirseniz, durum çubuğunda benzersiz kimliği görebilirsiniz. Belirli bir kişiye tıklarsanız, adres çubuğu değişecek ve bu çalışanla ilgili ek bilgiler görüntülenecektir.

    SQL enjeksiyonu

    Arama alanımıza normal bir ifade eklememizin nedeni, kimsenin SQL sorgumuza müdahale edememesidir. Geçmişte bu sorun yaygındı ve bilgisayar korsanları uygulamanızı değiştirirken kendi SQL sorgularını çalıştırmayı başardı. Örneğin, alanımızda kesme işareti kullanma olasılığına izin verirsek, bir bilgisayar korsanı şu sorguyu kullanarak veritabanını basitçe silebilir:

    "İNDİRİM TABLOSU

    Daha önce belirtildiği gibi, normal ifade, ziyaretçinin ilk karakter olarak yalnızca küçük veya büyük harf girebilmesini sağlar.

    Sonuç olarak

    Bugünün makalesinde, site aramasının nasıl yapılacağına baktık ve ayrıca:

    • Veritabanları ve ilgili tablolar oluşturun;
    • Veritabanı yönetim araçlarını kullanın, sütunlar oluşturun ve verileri girin;
    • Giriş verilerini, istekteki değişkenlerin varlığını kontrol edebilen, ayrıca veritabanına bağlanabilen ve tablodan sonuçları görüntüleyebilen PHP'ye dayalı arama formları geliştirin;
    • Uygulamanızı ve veritabanınızı SQL enjeksiyonundan nasıl korursunuz.

    Bu makaleden edinilen bilgileri kullanarak, başka birinin kodunu kolayca değiştirebilir ve gerekirse arama formunun işlevselliğini genişletebilirsiniz.

    Bu yayın makalenin bir çevirisidir " PHP ve MySQL ile Arama Özelliği Nasıl Oluşturulur» samimi bir proje ekibi tarafından hazırlanmıştır

    Bir kullanıcıyı sitede tutmanın en iyi yolu, aradığını bulmasına izin vermektir. Bunun için uygun bir sistem yaparsanız, sitenizin tercih seviyesi artacak ve kullanıcı, ilgisini çeken şeyi bulmak için kesinlikle geri dönecektir.

    Size sitedeki makaleleri aramak için kullanılacak basit ama işlevsel olarak etkili bir arama formunun nasıl oluşturulacağını göstereceğim. Sonuçlar, hiç şüphesiz bilgileri sunmanın en iyi yolu olan herhangi bir yeniden yükleme olmadan sayfada görünecektir.

    2 dosya oluşturacağım: HTML ve JavaScript içeren search.php. İkinci dosya olan do_search.php PHP kodunu içerecektir. İlk dosyayı oluşturmaya başlayalım:

    PHP, jQuery arama demosu

    ajax kelimesini girmeyi deneyin


    için sonuçlar


    Bu dosyada, arka uca bir POST isteği gönderen normal bir HTML formu oluşturduk, do_search.php dosyası.

    select_list($sql); if(count($satır)) ( $end_result = ""; foreach($satır olarak $r) ( $sonuç = $r["başlık"]; $bold = " ".$kelime.""; $end_result .="

  • " .str_ireplace($kelime, $kalın, $sonuç) . "
  • "; ) echo $end_result; ) else ( echo "
  • İsteğiniz için hiçbir şey bulunamadı
  • "; } } ?>

    PHP kodu, betiğin nasıl çalıştığını anlamanızı kolaylaştıran yorumlar içerir. Veritabanında eşleşmeler varsa, kullanıcının aradığı kelimeleri kalınlaştırarak bunları kullanıcınıza gösterirsiniz.

    Hepsine biraz CSS verelim:

    Gövde( font-family:Arial, Helvetica, sans-serif; ) *( margin:0;padding:0; ) #container ( margin: 0 auto; width: 600px; ) a ( color:#DF3D82; text-decoration: yok ) a:hover ( color:#DF3D82; text-decoration:underline; ) ul.update ( list-style:none;font-size:1.1em; margin-top:10px ) ul.update li( height:30px; border-bottom:#dedede solid 1px; text-align:left;) ul.update li:first-child( border-top:#dedede solid 1px; height:30px; text-align:left; ) #flash ( margin- top:20px; text-align:left; ) #searchresults ( text-align:left; margin-top:20px; display:none; font-family:Arial, Helvetica, sans-serif; font-size:16px; renk: #000; ) .word ( font-weight:bold; color:#000000; ) #search_box ( padding:4px; border:solid 1px #666666; width:300px; height:30px; font-size:18px;-moz- border-radius: 6px;-webkit-border-radius: 6px; ) .search_button ( border:#000000 solid 1px; padding: 6px; color:#000; font-weight:bold; font-size:16px;-moz- border-radius: 6px;-webkit-border-radius: 6px; ) .found ( font-ağırlığı: kalın ; yazı tipi stili: italik; renk: #ff0000; ) h2 ( sağ kenar boşluğu: 70px; )

    Böylece, sayfayı yeniden yüklemeden çalışan basit bir arama formunu nasıl oluşturacağınızı öğrendiniz. Umarım dersten hoşlanmışsınızdır.

    İle İbrahim Diallo

    2 Temmuz 2014 tarihinde yayınlandı ~ 16 dakika okuma

    Arama, bir web sitesinde önemli bir özelliktir. Birkaç okuyucum blogumda belirli bir pasaj aramak istediğinde, arama kutusunu kullanırlar. Eskiden Google Arama tarafından destekleniyordu, ancak o zamandan beri daha iyisini yapabileceğim için değil, ilginç bir meydan okuma olduğu için kendi ev yapımı sürümüme değiştirdim.

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

    // search.php dosyasında $term = isset($_GET["query"])?$_GET["query"]: ""; $terim = urlencode($terim); $website = urlencode("www.yourwebsite.com"); $redirect = "https://www.google.com/search?q=site%3A($website)+($term)"; header("Yer: $yönlendirme"); çı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 sözcüğünü kullanarak arama sonucunu mevcut alanımızla sınırlayın. Google tarafından dizine eklenen tüm sayfalarınız artık arama yoluyla erişilebilir olacak. 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 tarif edeceğim işlemin aynısını kullanıyor. İstediğinizin bu olduğunu düşünüyorsanız, lütfen okumaya devam edin.

    Bu çözüm, küçük web sitelerine yöneliktir. LIKE'ı her iki uçta da joker karakterlerle kullanıyorum, yani aramanız dizine eklenemez. Bu, çözümün tonlarca veri içermeyen blogunuz veya kişisel web siteniz için iyi çalışacağı anlamına gelir.Bunu daha büyük bir web sitesine taşıyın ve çok yavaş olabilir.MySQL, burada yaptığımız şey olmayan Tam Metin Arama özelliğini sunar.

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

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

    • Bir başlık p_title
    • bir url p_url
    • Bir özet p_summary
    • Bir gönderi içeriği p_content
    • Ve kategoriler kategori.tagname

    Arama terimimizle eşleşen her alan için ona bir puan vereceğiz. Skor maçın önemine göre belirlenir:

    // tam terim eşleşmeleri başlıkta bulunur $scoreFullTitle = 6; // bölümdeki başlığı eşleştirin $scoreTitleKeyword = 5; // tam terim eşleşmeleri özette bulunur $scoreFullSummary = 5; // bölümdeki özeti eşleştirin $scoreSummaryKeyword = 4; // tam terim eşleşmeleri içerikte bulunur $scoreFullDocument = 4; // belgeyi bölümle eşleştirin $scoreDocumentKeyword = 3; // bir kategoriyle eşleşir $scoreCategoryKeyword = 2; // url ile eşleşir $scoreUrlKeyword = 1;

    Başlamadan önce, kaldırılması gereken bir aramaya pek katkısı olmayan birkaç kelime var. Örnek "içinde", "it", "a", "bundan", "ve" ... . Bunları filtreleyeceğiz ve alakasız olduğunu düşündüğünüz herhangi bir kelimeyi eklemekten çekinmeyin. Başka bir şey, 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 bir dizi işlevi olarak döndürün filterSearchKeys($query)( $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // bu listeyi kelimelerinizle genişletin $list = array("in","it","a","the","of","or","I","siz", $c = 0; foreach(explode(" ", $query) as $key)( if (in_array($key, $list))( devam; ) $words = $key; if ($c >= 15)( break; ) $c++ ; ) return $words; ) // word limit karakter karakter sayısı function limitChars($query, $limit = 200)( return substr($query, 0,$limit); )

    Yardımcı fonksiyonlarımız 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 kelime eşleştirdikçe puan toplayacağız. 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ğlanma konusunda 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.

    function search($query)( $query = trim($query); if (mb_strlen($query)===0)( // boş aramaya gerek yok değil mi? return false; ) $query = limitChars($query) ; // Tartım puanları $scoreFullTitle = 6; $scoreTitleKeyword = 5; $scoreFullSummary = 5; $scoreSummaryKeyword = 4; $scoreFullDocument = 4; $scoreDocumentKeyword = 3; $scoreCategoryKeyword = 2; $scoreCategoryKeywords( $score =UrlKeywords( $scoreSummaryKeywords = 4); $sorgu); $escQuery = DB::escape($query); // db nesnesini almak için yukarıdaki nota bakın $titleSQL = dizi(); $sumSQL = dizi(); $docSQL = dizi(); $categorySQL = dizi (); $urlSQL = array(); /** Tam tekrarları eşleştirme PLACE HOLDER **/ /** Anahtar Kelimeleri Eşleştirme PLACE HOLDER **/ $sql = "SELECT 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 ". patlatmak(" + ", $urlSQL).")) alaka düzeyi olarak p NEREDE p.status = "yayınlandı" alaka düzeyine sahip >

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

    Tam oluşumları eşleştirme

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

    If (count($keywords) > 1)( $titleSQL = "if (p_title LIKE "%".$escQuery."%",($scoreFullTitle),0)"; $sumSQL = "if (p_summary LIKE "%" .$escQuery."%",($scoreFullSummary),0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",($scoreFullDocument),0)"; )

    Puanı yüksek olan maçlar bunlar. Arama terimi bunları içeren bir makaleyle eşleşirse, üstte görünme şansları daha yüksek olacaktır.

    Eşleşen anahtar kelime oluşumları

    Tüm anahtar kelimeler arasında dolaşıyoruz ve alanlardan herhangi biriyle eşleşip eşleşmediklerini kontrol ediyoruz. Bir gönderi birden fazla kategoriye sahip olabileceğinden, kategori eşleşmesi için bir alt sorgu kullandım.

    Foreach($keywords as $key)( $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",($scoreTitleKeyword),0)"; $sumSQL = "if (p_summary) LIKE "%".DB::escape($key)."%",($scoreSummaryKeyword),0)"; $docSQL = "if (p_content LIKE "%".DB::escape($key)."% ",($scoreDocumentKeyword),0)"; $urlSQL = "if (p_url GİBİ "%".DB::escape($key)."%",($scoreUrlKeyword),0)"; $categorySQL = "if ((SELECT count(category.tag_id) KATEGORİDEN post_category ON'a KATIL post_category.tag_id = kategori.tag_id NEREDE post_category.post_id = p.post_id VE Category.name = "".DB::escape($key)."") > 0,($scoreCategoryKeyword),0)"; )

    Ayrıca aşağıda 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.

    // Sadece boş olması durumunda 0 ekleyin if (empty($titleSQL))( $titleSQL = 0; ) if (empty($sumSQL))( $sumSQL = 0; ) if (empty($docSQL))( $docSQL = 0; ) if (empty($urlSQL))( $urlSQL = 0; ) if (empty($tagSQL))( $tagSQL = 0; )

    Sonunda, sorguların tümü birleştirilir ve gönderinin arama terimiyle alaka düzeyini belirlemek için bir araya getirilir.

    // Gereksiz kelimeleri arama teriminden kaldırın ve bir dizi işlevi olarak döndürün filterSearchKeys($query)( $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // bu listeyi kelimelerinizle genişletin $list = array("in","it","a","the","of","or","I","siz", $c = 0; foreach(explode(" ", $query) as $key)( if (in_array($key, $list))( devam; ) $words = $key; if ($c >= 15)( break; ) $c++ ; ) dönüş $kelimeler; ) // kelime sınır karakter karakter sayısı function limitChars($sorgu, $limit = 200)( return substr($sorgu, 0,$limit); ) function search($sorgu)( $sorgu = trim ($query); if (mb_strlen($query)===0)( // boş aramaya gerek yok değil mi? return false; ) $query = limitChars($query); // Tartım puanları $scoreFullTitle = 6; $ scoreTitleKeyword = 5; $scoreFullSummary = 5; $scoreSummaryKeyword = 4; $scoreFullDocument = 4; $scoreDocumentKeyword = 3; $scoreCategoryKeyword = 2; $scoreUrlKe kelime = 1; $keywords = filterSearchKeys($sorgu); $escQuery = DB::escape($sorgu); // db nesnesini almak için yukarıdaki nota bakın $titleSQL = array(); $toplamSQL = dizi(); $docSQL = dizi(); $kategoriSQL = dizi(); $urlSQL = dizi(); /** Eşleşen tam oluşumlar **/ if (count($keywords) > 1)( $titleSQL = "if (p_title LIKE "%".$escQuery."%",($scoreFullTitle),0)"; $sumSQL = "if (p_summary LIKE "%".$escQuery."%",($scoreFullSummary),0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",($scoreFullDocument), 0)"; ) /** Anahtar Kelimeler Eşleşiyor **/ foreach($keywords as $key)( $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",($scoreTitleKeyword ),0)"; $sumSQL = "if (p_summary LIKE "%".DB::escape($key)."%",($scoreSummaryKeyword),0)"; $docSQL = "if (p_content LIKE "%" ".DB::escape($key)."%",($scoreDocumentKeyword),0)"; $urlSQL = "if (p_url GİBİ "%".DB::escape($key)."%",( $scoreUrlKeyword),0)"; $categorySQL = "if ((SELECT count(category.tag_id) KATEGORİSİNDEN post_category ON post_category.tag_id = kategori.tag_id NEREDE post_category.post_id = p.post_id AND kategori.name = "". DB::escape($key)."") > 0,($scoreCategoryKeyword),0)"; ) // Boşsa, 0 ekleyin if (empty($titleSQL))( $titleSQL = 0; ) eğer (boş($toplamSQL))( $toplamSQL = 0; ) if (empty($docSQL))( $docSQL = 0; ) if (empty($urlSQL))( $urlSQL = 0; ) if (boş($tagSQL))( $tagSQL = 0; ) $sql = " SELECT 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 p gönderisinden NEREDE p.status = "yayınlandı" alaka düzeyi > 0 SİPARİŞE GÖRE alaka düzeyi DESC,p.page_views DESC LIMIT 25"; $sonuçlar = DB::query($sql); if (!$results)( return false; ) return $sonuçlar; )

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

    $term = isset($_GET["sorgu"])?$_GET["sorgu"]: ""; $search_results = arama($terim); if (!$search_results) ( echo "Sonuç yok"; çıkış; ) // Sonuçların olduğu sayfayı buraya yazdırın.

    Adil 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 uygun olana göre 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 kalıp varsa, onlara bir gezi 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ürme gibi ekstra özellikler ekledim. Kendinize özellikler eklemekten çekinmeyin.

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

    İlgili bir notta, burada bazı ilginç makaleler var.

    mysql_* işlevleriyle sonsuza kadar ilgilenmenin zamanı geldi. Bu yöntemler kullanımdan kaldırılmıştır ve yavaştır. Yükseltme zamanı çoktan geçti ama hala her yerde görüyoruz. Her yazarı eğitimlerini ve bloglarını güncellemeye zorlayamadığım için, umarım daha iyi bir sıralamaya sahip olmak ve yeni gelenlere yardımcı olmak için gerekli bilgileri sağlamak için bir yazı yazmaya karar verdim.

    Kendi web sitenizi yapmak çok zor olmamalı. Godaddy veya Hostgator gibi barındırma şirketleri, herkesin başlamasını çok kolaylaştırır; kod yazmadan bütün bir web sitesi oluşturmanıza izin verir. WordPress blogu Eğer aradığınız buysa hemen Godaddy.com'a gitmelisiniz.Burada işimiz bitti.Fakat öte yandan, kontrol sahibi olmak ve paylaşılan bir hosting'in eksiklikleri ile sınırlı kalmamak istiyorsanız. cüzdanınızı bozmadan doğru yere geldiniz.

    Vim, terminaldeki en sevdiğim metin editörüdür. nano ve emacs ile bir süre oynadıktan sonra, sonunda sadeliği için vim ile anlaştım (lütfen benimle çıplak olun). Özelleştirilip bütün bir IDE gibi kullanılabilse de, çoğunlukla sunucularımdaki dosyaları düzenlemek ve küçük ama önemli değişiklikler yapmak için kullanıyorum. Editör savaşına girmeyelim ve başlayalım.

    Yorumlar(45)

    Zaryel 12 Ağustos 2015:

    Ian Mustafa 26 Eylül 2015:

    Soymak 29 Eylül 2015:

    adeem 11 Şubat 2016:

    Ivan Venediktov 9 Nisan 2016.

    Ana hedefler:

    • bir satıra bir arama sorgusu girdikten sonra arama sonuçları bu satırın altında görünecek şekilde bir arama yapın
    • sonucu alma isteği, yalnızca arama sorgusu girişinin bitiminden sonra gerçekleşmelidir.

    Tamam hadi gidelim!

    Bir arama dizgisi ve arama sonuçlarını ekleyeceğimiz bir div-takma adı ile bloğun kendisinin yaklaşık bir düzeni:

    Çünkü arama, site başlığında mevcut, sonuçlara uygun arama ve stil komut dosyalarını ekleyelim:

    //aramayı bitir: $APPLICATION->AddHeadScript("/search/ajax_search.js"); $APPLICATION->AddHeadScript("/search/jquery.mCustomScrollbar.js"); $APPLICATION->SetAdditionalCSS(SITE_TEMPLATE_PATH . "/css/ajax_search.css"); $APPLICATION->SetAdditionalCSS(SITE_TEMPLATE_PATH . "/css/jquery.mCustomScrollbar.min.css");

    Şimdi ajax_search.js'mizde neler olduğunu görelim:

    get_result()( //arama sonuçlarını temizle $("#search_result").html(""); //arama sonuçlarını henüz almadık - ön yükleyiciyi görüntüle $("#search_result").append( "

    "); $.ajax(( tip: "POST", url: "/search/ajax_search.php", veri: "q="+q, dataType: "json", başarı: function(json)( //temizle) ön yükleyici $("#search_result").html(""); $("#search_result").append(" "); // json dizisinin her öğesini class="live-search" (kendi düzeninizi kullanabilirsiniz) ile bir div içine ekleyin $.each(json, function(index, element) ( $("#search_result") .find ("".live-search").append(" "+element.TITLE+""+element.BODY_FORMATED+""); //console.log (element.BODY_FORMATED); )); //kaydırmanın stilini $(".live-search").mCustomScrollbar(( scrollInertia: 500 )); ) )); ) var timer = 0 ; var q = ""; $(belge).ready(function() ( $("#q").keyup(function() ( q = this.value; clearTimeout(timer); zamanlayıcı = setTimeout(get_result, 1000) ) ; )); $("#reset_live_search").click(function() ( $("#search_result").html(""); )); ));

    keyup işlevinde, div-nick'i ajax'ta id = "search_result" ile dolduran get_result () işlevini çağırırız.

    mCustomScrollbar yalnızca bir stil çağrısıdır (kapatabilirsiniz).

    /search/ajax_search.php'den JSON formatında veri alıyoruz.

    JS bileşeni ile her şey açık, şimdi ajax_search.php'de ne olduğunu görelim:

    Search(array("QUERY" => $q, "SITE_ID" => LANG, "MODULE_ID" => "iblock", "CHECK_DATES" => "Y", "PARAM2" => "8")); $sonuç = dizi(); while ($res = $obSearch->GetNext())( $id = $res["ITEM_ID"]; //eğer bölüm bulunursa: if (strripos($id, "S")!==false)( $result_item ["TITLE"] = $res["TITLE"]; $result_item["URL"] = $res["URL"]; $result_item["BODY_FORMATED"] = $res["TITLE_FORMATED"]; $sonuç = $ result_item; ) //S yoksa, o zaman başka( $result_item["TITLE"] = $res["TITLE"]; $result_item["URL"] = $res["URL"]; $result_item[" BODY_FORMATED"] = $res["BODY_FORMATED"]; $sonuç = $sonuç_item; ) ) echo json_encode($sonuç); ) ?>

    Bu durumda arama, Bitrix CSearch sınıfının Search yöntemiyle gerçekleştirilir. PARAM2'de hangi bilgi bloğunda aradığımızı yazıyoruz. Arama sonuçlarını $result dizisine göndeririz. $res['ITEM_ID'] öğesinin bir öğe veya bölüm olabileceğini unutmayın. Ne bulduğumuza bağlı olarak, $result_item['BODY_FORMATED'] içinde ya bölümün adını ya da bilgi bloğunun bulunan öğesinden bir metin parçasını kaydırıyoruz.