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.
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:
Ş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.
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:
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.
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"];
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:
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:
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
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)
METİN, "uzun dize" anlamına gelir, uzunluk belirtmek gerekli değildir, uzun metin için kullanın.
Bunun gibi bir şeye benzemeli:
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.
< 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
Ş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.
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:
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
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:
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 "
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.