Özverili üye sipariş konuk php. PHP MySqli ile çalışmanın temelleri. Veritabanı bağlantısı

  • 03.11.2019

PHP MySQL desteğinin 2011 yılında veritabanları, PDO veya MySqli. Daha iyi işlevselliğe sahiptirler (MySQL'den) ve bir OOP (Nesne Yönelimli Arayüz) API sunarlar. Hangisi daha iyi başka bir yazının konusu, bu yazımızda MySqli ile çalışmanın temellerini anlamaya çalışacağız. Bu nedenle, daha fazla giriş yapmadan, PHP MySqli kullanarak bağlantıya (bağlan), seç (seç), ekle (ekle), güncelle (güncelle) ve kayıtları (veri/belgeler/bilgi) sil (sil) ile devam edelim. Bu makalenin PHP MySqli ile çalışırken ortaya çıkabilecek sorunları çözmede faydalı olacağını umuyorum.

MySQL kurulumu

PHP 5.3.0+ sürümünü kullanırken, MySqli varsayılan olarak kullanılabilir; eski sürümler için, kullanılabilir hale getirmek için dosyanın içine php_mysqli.dll DLL dosyasını eklemeniz gerekir. php.ini ve extension=php_mysqli.dll satırını yorumlayarak php.ini dosyasını düzenleyin. Linux'ta, PHP5 mysql paketini kurduğunuzda MySQLIi otomatik olarak kurulacaktır. Windows ve linux sistemlerine yükleme hakkında daha fazla bilgi bulunabilir.

Veritabanı bağlantısı

MySqli, bir veritabanına bağlanmak için iki yol sunar: prosedürel ve nesne yönelimli. Nesne yönelimli kullanılması tavsiye edilir. Prosedürel (eski) MySql'e benzer, bu nedenle yeni başlayanlar için kullanılması tercih edilebilir, kullanılmasının tavsiye edilmediğini hatırlamakta fayda var.

PHP

//prosedür stili $mysqli = mysqli_connect("host","kullanıcıadı","şifre","database_name"); //nesne yönelimli stil (önerilir) $mysqli = new mysqli("host","username","password","database_name");

Aşağıdaki, bir veritabanı bağlantısının nesne yönelimli bir şekilde açılmasını gösterir. Bu yöntem aşağıdaki tüm örneklerde kullanılacaktır.

PHP

connect_error) ( die("Hata: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) ?>

Ortaya çıkan seriyi ilişkisel dizi olarak seçme (SEÇ)

mysqli_fetch_assoc() : Aşağıdaki kod, sonuç satırını bir ilişkisel dizi olarak getirir. Döndürülen dizi, veritabanından alınan satırları içerir; burada sütun adları, dahili verilere erişmek için kullanılan anahtar olacaktır. Aşağıda gösterildiği gibi, veriler bir HTML tablosu olarak görüntülenir.

PHP

connect_error) ( die("Hata: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //MySqli Sorgu Seçimi $results = $mysqli-> "; while($row = $results->fetch_assoc()) ( print " "; Yazdır " "; Yazdır " "; Yazdır " "; Yazdır " "; Yazdır " "; Yazdır ""; ) Yazdır "
".$satır["kimlik"]."".$satır["ürün_kodu"]."".$satır["ürün_adı"]."".$satır["product_desc"]."".$satır["fiyat"]."
"; // Bir sonuçla ilişkili belleği boşaltır $results->free(); // bağlantıyı kapat $mysqli->close(); ?>

Ortaya çıkan satırı bir dizi olarak seçme (SEÇ) (ilişkisel, normal veya her ikisi)

fetch_array() işlevi: mysqli_fetch_row ve mysqli_fetch assoc işlevlerinin birleştirilmiş işlevselliğine sahip bir dizi döndürür. Bu işlev, mysqli_fetch_row() işlevinin genişletilmiş bir sürümüdür; verilere erişmek için hem dize hem de sayılar kullanılabilir.

PHP

connect_error) ( die("Hata: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //MySqli Sorgu Seçimi $results = $mysqli->query("SELECT id, product_code, product_desc , ÜRÜNLERDEN FİYAT"); Yazdır" fetch_array()) ( yazdır " "; Yazdır " "; Yazdır " "; Yazdır " "; Yazdır " "; Yazdır " "; Yazdır ""; ) Yazdır "
".$satır["kimlik"]."".$satır["ürün_kodu"]."".$satır["ürün_adı"]."".$satır["product_desc"]."".$satır["fiyat"]."
"; // Bir sonuçla ilişkili belleği boşaltır $results->free(); // bağlantıyı kapat $mysqli->close(); ?>

Elde edilen seriyi nesne olarak seçme (SEÇ)

fetch_object() : Sonuç kümesini bir nesne olarak almak için MySqli fetch_object() kullanmanız gerekir. Nesnenin öznitelikleri, sonuç kümesinde bulunan alanların adlarını görüntüler.

PHP

connect_error) ( die("Hata: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //MySqli Sorgu Seçimi $results = $mysqli->query("SELECT id, product_code, product_desc , ÜRÜNLERDEN FİYAT"); Yazdır" "; while($satır = $sonuçlar->fetch_object()) ( yazdır " "; Yazdır " "; Yazdır " "; Yazdır " "; Yazdır " "; Yazdır " "; Yazdır ""; ) Yazdır "
".$satır->id."".$row->product_code."".$row->product_name."".$row->product_desc."".$satır->fiyat."
"; // bağlantıyı kapat $mysqli->close(); ?>

Tek bir değer seçme (SEÇ)

fetch_object (Cameron Spear yöntemi) kullanılarak veritabanından tek bir değer alınabilir.

PHP

connect_error) ( die("Hata: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //zincirlenmiş PHP fonksiyonları $product_name = $mysqli->query("ürünleri NEREDE SEÇİN id = 1")->fetch_object()->product_name; $product_name yazdır; //çıktı değeri $mysqli->kapat(); ?>

Tablodaki satır sayısını al (SEÇ SAYI)

Bazen, özellikle sayfalama yaparken bir tablodaki satır sayısını bilmeniz gerekir.

PHP

connect_error) ( die("Hata: (". $mysqli->connect_errno .") ". $mysqli->connect_error); ) //toplam kayıt sayısını al $results = $mysqli->query("SELECT COUNT(* ) kullanıcılardan"); $get_total_rows = $results->fetch_row(); // toplam kayıtları $mysqli->close() değişkeninde tut; ?>

Şablonları kullanarak seçim (SEÇ) (hazır ifadeler)

hazırlanan ifadeler- aynı şablona göre oluşturulmuş tekrarlayan sorguların sıralı yürütülmesini hızlandırmanıza izin veren özel bir VTYS aracı.

MySqli'nin özelliklerinden biri, önceden yazılmış şablonları kullanma yeteneğidir: yani, bir sorguyu bir kez yazmak yeterlidir, ardından farklı parametrelerle tekrar tekrar çalıştırılabilir. Önceden yazılmış şablonların kullanılması, büyük tablolar ve karmaşık sorgular için performansı artırır. Kötü amaçlı kodun girmesini önlemek için her istek sunucu tarafından ayrı ayrı analiz edilir.

Aşağıdaki kod, veritabanından veri almak için bir şablon (Hazırlanmış ifade) kullanır. Toplama ? bir sorguda, SQL bir işaretçi rolünü oynar ve bunun yerine bir dize, tamsayı, çift veya blob olabilen bir parametre ile değiştirilir. Bizim durumumuzda bu, $search_product dizesidir.

PHP

$search_product = "PD1001"; //ürün kimliği //hazırlanmış bir ifade oluşturun $query = "ID, ürün_kodu, ürün_açıklaması SEÇİN, ÜRÜNLERDEN FİYAT WHERE ürün_kodu=?"; $ifade = $mysqli->prepare($sorgu); //işaretçiler için bağlama parametreleri, burada (s = string, i = tamsayı, d = double, b = blob) $ifade->bind_param("s", $search_product); //sorguyu yürütün $ifade->execute(); // sonuç değişkenlerini bağla $deyim-> "; //kayıtları getir while($statement->fetch()) ( print " "; Yazdır " "; Yazdır " "; Yazdır " "; Yazdır " "; Yazdır ""; ) Yazdır "
".$kimlik."".$ürün_kodu."".$product_desc."".$fiyat."
"; //bağlantıyı kapat $ifade->kapat();

Birden çok parametreli aynı sorgu:

PHP

$arama_Kimliği = 1; $search_product = "PD1001"; $query = "ID, product_code, product_desc SEÇİN, ÜRÜNLERDEN FİYAT NEREDE ID=? VE product_code=?"; $ifade = $mysqli->prepare($sorgu); $statement->bind_param("is", $search_ID, $search_product); $ifade->execute(); $ifade->bind_result($id, $product_code, $product_desc, $fiyat); Yazdır" "; while($statement->fetch()) ( print " "; Yazdır " "; Yazdır " "; Yazdır " "; Yazdır " "; Yazdır ""; ) Yazdır "
".$kimlik."".$ürün_kodu."".$product_desc."".$fiyat."
"; //bağlantıyı kapat $ifade->kapat();

(INSERT) kaydı ekle

Aşağıdaki giriş tabloya yeni bir satır ekler.

PHP

real_escape_string("P1234").""; $product_name = "".$mysqli->real_escape_string("42 inç TV")."""; $product_price = """.$mysqli->real_escape_string("600 ")."""; //MySqli Ekleme Sorgusu $insert_row = $mysqli->query("INSERT INTO ürünleri (ürün_kodu, ürün_adı, fiyat) DEĞERLER($ürün_kodu, $ürün_adı, $ürün_fiyatı)"); if($insert_row )( print "Success! Son eklenen kaydın kimliği: " .$mysqli->insert_id ."
"; )else( die("Hata: (". $mysqli->errno .") ". $mysqli->hata); ) ?>

Aşağıdaki pasaj, şablonlar aracılığıyla aynı değerleri ekler (Hazırlanmış Beyan). Söylediğimiz gibi, şablonlar SQL enjeksiyonuna karşı son derece etkilidir. Verilen örnek için, kullanımları en iyi seçenektir.

PHP

//veritabanı tablosuna eklenecek değerler $product_code = "P1234"; $product_name = "42 inç televizyon"; $product_price = "600"; $query = "GÜN ÜRÜNLERE GİRİN (ürün_kodu, ürün_adı, fiyat) DEĞERLER(?, ?, ?)"; $ifade = $mysqli->prepare($sorgu); //işaretçiler için bağlama parametreleri, burada (s = dize, i = tamsayı, d = çift, b = blob) $ifade->bind_param("sss", $ürün_kodu, $ürün_adı, $ürün_fiyatı); if($statement->execute())( print "Success! Son eklenen kaydın kimliği: " .$statement->insert_id ."
"; )else( die("Hata: (". $mysqli->errno .") ". $mysqli->hata); ) $statement->close();

Birden çok kayıt ekle (INSERT)

Aynı anda birden çok satır eklemek, her bir değer satırının parantez içine alınması ve diğerlerinden virgülle ayrılması gereken bir sütun değeri satırı dahil edilerek yapılır. Bazen kaç kaydın eklendiğini, güncellendiğini veya silindiğini bilmeniz gerekir, bunun için mysqli_affected_rows kullanabilirsiniz.

PHP

//ürün 1 $product_code1 = """.$mysqli->real_escape_string("P1")."""; $product_name1 = """.$mysqli->real_escape_string("Google Nexus")."""; $product_price1 = """.$mysqli->real_escape_string("149")."""; //ürün 2 $product_code2 = """.$mysqli->real_escape_string("P2")."""; $product_name2 = """.$mysqli->real_escape_string("Apple iPad 2")."""; $product_price2 = """.$mysqli->real_escape_string("217")."""; //ürün 3 $product_code3 = """.$mysqli->real_escape_string("P3")."""; $product_name3 = """.$mysqli->real_escape_string("Samsung Galaxy Note")."""; $product_price3 = """.$mysqli->real_escape_string("259")."""; //Birden çok satır ekleyin $insert = $mysqli->query("INSERT INTO products(product_code, product_name, price) DEĞERLER ($product_code1, $product_name1, $product_price1), ($product_code2, $product_name2, $product_price2), ($ ürün_kodu3, $ürün_adı3, $ürün_fiyatı3)"); if($insert)( //mysqli_affected_rows kullanılarak eklenen toplam kayıtları döndürür "Success! Total " .$mysqli->affected_rows ." satırları eklendi.
"; )else( die("Hata: (". $mysqli->errno .") ". $mysqli->hata); )

Kayıtları güncelleme (Güncelleme) / silme (Silme)

Kayıtları güncelleme ve silme prensibi aynıdır. Sorgu dizesini MySql güncelleme veya silme ile değiştirmek yeterlidir (Anlamadım, kendiniz görün).

PHP

//MySqli Güncelleme Sorgusu $results = $mysqli->query("GÜNCELLEME ürünleri SET ürün_adı="52 inç TV", product_code="323343" NEREDE ID=24"); //MySqli Sorgu Sil //$results = $mysqli->query("ÜRÜNLERDEN SİL WHERE ID=24"); if($results)( print "Başarılı! kayıt güncellendi / silindi"; )else( print "Hata: (". $mysqli->errno .") ". $mysqli->error; )

Hazırlanan ifadelerle güncelleme

Hazırlanan ifadeleri kullanarak bir kaydı güncelleme örneği aşağıda gösterilmiştir.

PHP

$product_name = "52 inç televizyon"; $ürün_kodu = "9879798"; $find_id = 24; $query = "Ürünleri AYARLA ürün_adı=?, ürün_kodu=? NEREDE ID=?"; $ifade = $mysqli->prepare($sorgu); //işaretçiler için bağlama parametreleri, burada (s = dize, i = tamsayı, d = çift, b = blob) $sonuçlar = $ifade->bind_param("ssi", $ürün_adı, $ürün_kodu, $find_id); if($results)( print "Success! kaydı güncellendi"; )else( print "Hata: (". $mysqli->errno .") ". $mysqli->error; )

Eski girişleri silme

1 günden fazla sunucuda kalan tüm kayıtlar silinmeye tabidir; Gün sayısını kendiniz belirleyebilirsiniz.

PHP

//MySqli Sorguyu Sil $results = $mysqli- (ŞİMDİ() - 1 GÜN ARALIK)"); if($results)( print "Başarılı! bir günlük kayıtlar silindi"; )else( print "Hata: (". $mysqli- Çözüm

Çalışma prensipleri oldukça benzer olsa da, şüphesiz MySqli, standart PHP MySql uzantısından önemli ölçüde daha iyidir. Umarım yukarıdaki bilgiler gelecekte projeler oluştururken ve taşırken faydalı olur. Kolaylık sağlamak için, aşağıda örnek dosyaları indirme özelliği uygulanmıştır. Bu, indirme düğmesine tıklayarak yapılabilir.

Daha olgun veritabanlarının çoğu, hazırlanmış ifadeler kavramını desteklemektedir. Onlar neler? Bir uygulamanın çalıştırmak istediği, değişken parametreler kullanılarak özelleştirilebilen SQL için bir tür derlenmiş şablon olarak düşünülebilirler. Hazırlanan ifadeler iki büyük fayda sağlar:

  • Sorgunun yalnızca bir kez ayrıştırılması (veya hazırlanması) gerekir, ancak aynı veya farklı parametrelerle birden çok kez çalıştırılabilir. Sorgu hazırlandığında, veritabanı sorguyu yürütmek için planını analiz edecek, derleyecek ve optimize edecektir. Karmaşık sorgular için bu işlem, aynı sorguyu farklı parametrelerle birçok kez tekrarlama ihtiyacı varsa, uygulamayı belirgin şekilde yavaşlatacak kadar zaman alabilir. Uygulama, hazırlanmış bir ifade kullanarak, analiz/derleme/optimize etme döngüsünün tekrarlanmasını önler. Bu, hazırlanan ifadelerin daha az kaynak kullandığı ve dolayısıyla daha hızlı çalıştığı anlamına gelir.
  • Hazırlanan ifadelerin parametrelerinin alıntılanması gerekmez; sürücü bunu otomatik olarak halleder.Bir uygulama yalnızca hazırlanmış ifadeleri kullanırsa, geliştirici hiçbir SQL enjeksiyonunun olmayacağından emin olabilir (ancak, sorgunun diğer bölümleri oluşturuluyorsa) çıkışsız girdi ile SQL enjeksiyonu hala mümkündür).

Hazırlanan ifadeler o kadar kullanışlıdır ki, PDO'nun onları desteklemeyen sürücüler için taklit edeceği tek özelliktir.Bu, bir uygulamanın veritabanının yeteneklerinden bağımsız olarak aynı veri erişim paradigmasını kullanabilmesini sağlar.

Örnek 1 Hazırlanan ifadeler kullanılarak tekrarlanan ekler

isim ve bir değer adlandırılmış yer tutucular için.

$stmt = $dbh -> hazırla( "KAYITLARA EKLE (ad, değer) DEĞERLER (:ad, :değer)");
$stmt -> bindParam(":isim", $isim);
$stmt -> bindParam(":değer", ​​$değer);

// bir satır ekle
$isim = "bir" ;
$değer = 1 ;
$stmt -> yürüt();

$isim = "iki" ;
$değer = 2 ;
$stmt -> yürüt();
?>

Örnek #2 Hazırlanan ifadeler kullanılarak tekrarlanan ekler

Bu örnek, bir INSERT sorgusu yerine bir INSERT sorgusu gerçekleştirir. isim ve bir değer konumsal için ? yer tutucular.

$stmt = $dbh -> hazırla( "KAYIT (isim, değer) DEĞERLERİ (?, ?) GİRİN");
$stmt -> bindParam(1, $ad );
$stmt -> bindParam(2 , $değer );

// bir satır ekle
$isim = "bir" ;
$değer = 1 ;
$stmt -> yürüt();

// farklı değerlere sahip başka bir satır ekle
$isim = "iki" ;
$değer = 2 ;
$stmt -> yürüt();
?>

Örnek #3 Hazırlanan ifadeleri kullanarak veri getirme

Örnek #4 Bir çıkış parametresi ile saklı yordam çağırma

Veritabanı sürücüsü destekliyorsa, bir uygulama girdinin yanı sıra çıktı için parametreleri de bağlayabilir. Çıkış parametreleri genellikle saklı yordamlardan değerleri almak için kullanılır. Çıktı parametrelerinin kullanımı, girdi parametrelerine göre biraz daha karmaşıktır, çünkü geliştirici, belirli bir parametrenin onu bağladığında ne kadar büyük olabileceğini bilmelidir. Değer, önerdikleri boyuttan daha büyük çıkarsa, bir hata oluşur.

$stmt = $dbh -> hazırla("ÇAĞRI sp_returns_string(?)" );
$stmt -> bindParam(1, $return_value , PDO :: PARAM_STR , 4000 );

// saklı yordamı çağır
$stmt -> yürüt();

print "prosedür döndürüldü $return_value\n" ;
?>

Örnek #5 Bir giriş/çıkış parametresi ile bir saklı yordamı çağırma

Geliştiriciler ayrıca hem girdi hem de çıktı değerleri tutan parametreler belirleyebilir; sözdizimi çıktı parametrelerine benzer. Bu sonraki örnekte, "merhaba" dizesi saklı yordama geçirilir ve döndüğünde merhaba, yordamın dönüş değeriyle değiştirilir.

$stmt = $dbh -> hazırla( "ÇAĞRI sp_takes_string_returns_string(?)");
$değer = "(!LANG:merhaba" ;!}
$stmt -> bindParam(1 , $değer , PDO :: PARAM_STR | PDO :: PARAM_INPUT_OUTPUT , 4000 );

// saklı yordamı çağır
$stmt -> yürüt();

print "prosedür $değer döndürdü\n" ;
?>