PHP'de mysql_ * fonksiyonlar─▒n─▒ neden kullanmamal─▒y─▒m?


Al─▒nan cevaba git


mysql_* Fonksiyonlar─▒ neden kullanmamam─▒z gerekti─činin teknik sebepleri nelerdir ? (├Ârne─čin mysql_query() , mysql_connect() veya mysql_real_escape_string() )?

Sitemde ├žal─▒┼č─▒yor olsalar bile neden ba┼čka bir ┼čey kullanmal─▒y─▒m?

Sitemde ├žal─▒┼čm─▒yorlarsa neden b├Âyle hatalar al─▒yorum?

Uyar─▒: mysql_connect (): B├Âyle bir dosya veya dizin yok


2417









Cevap say─▒s─▒n─▒ say: 16






MySQL uzant─▒s─▒:

  • Aktif geli┼čme alt─▒nda de─čil
  • Is resmen kald─▒r─▒lm─▒┼č PHP 5.5 itibariyle (Haziran 2013 yay─▒nland─▒).
  • Tamamen PHP 7.0'dan itibaren kald─▒r─▒lm─▒┼čt─▒r (Aral─▒k 2015'de yay─▒mland─▒)
    • Bu, 31 Aral─▒k 2018'den itibaren PHP'nin desteklenen bir s├╝r├╝m├╝nde bulunmad─▒─č─▒ anlam─▒na gelir . Onu destekleyen bir PHP s├╝r├╝m├╝ kullan─▒yorsan─▒z, g├╝venlik sorunlar─▒n─▒ ├ž├Âzmeyen bir s├╝r├╝m kullan─▒yorsunuzdur.
  • OO aray├╝z├╝ yoksundur
  • Desteklemiyor:
    • Engellenmeyen, zaman uyumsuz sorgular
    • Haz─▒rlanan ifadeler veya parametreli hale getirilmi┼č sorgular
    • Sakl─▒ yordamlar
    • Birden ├žok ifade
    • i┼člemler
    • "Yeni" ┼čifre do─črulama y├Ântemi (varsay─▒lan olarak MySQL 5.6'da a├ž─▒k; 5.7'da zorunludur)
    • MySQL 5.1 veya sonraki s├╝r├╝mlerindeki yeni i┼člevlerden herhangi biri

Kullan─▒mdan kald─▒r─▒ld─▒─č─▒ i├žin, kullan─▒lmas─▒ kodunuzu daha az gelece─če haz─▒r hale getirir.

Haz─▒rlanan ifadeler i├žin destek eksikli─či, harici veriden ka├žmak ve ayr─▒ bir i┼člev ├ža─čr─▒s─▒ ile elle ka├žmaktan daha a├ž─▒k ve daha az hataya a├ž─▒k bir y├Ântem sunmak i├žin ├Âzellikle ├Ânemlidir.

SQL uzant─▒lar─▒n─▒n kar┼č─▒la┼čt─▒rmas─▒na bak─▒n .


2020







PHP, MySQL'e ba─članmak i├žin ├╝├ž farkl─▒ API sunuyor. Bunlar mysql (PHP 7'den itibaren kald─▒r─▒ld─▒) mysqli ve PDO uzant─▒lar.

mysql_* Fonksiyonlar─▒ ├žok pop├╝ler olarak kullan─▒lan, ancak bunlar─▒n kullan─▒m─▒ art─▒k te┼čvik edilmez. Belgelendirme ekibi veritaban─▒ g├╝venlik durumunu tart─▒┼č─▒yor ve kullan─▒c─▒lar─▒ yayg─▒n olarak kullan─▒lan ext / mysql uzant─▒s─▒ndan uzakla┼čmalar─▒ konusunda e─čitmek bunun bir par├žas─▒ ( php.internals: deprecating ext / mysql ).

Ve daha sonra PHP geli┼čtiricisi tak─▒m olu┼čturmak i├žin karar ald─▒ E_DEPRECATED , i├žinden Kullan─▒c─▒lar─▒n, MySQL ba─čland─▒klar─▒nda hatalar─▒ mysql_connect() , mysql_pconnect() ya yerle┼čik ├Ârt├╝l├╝ ba─člant─▒ i┼člevselli─či ext/mysql .

ext/mysql resmen PHP 5.5'ten itibaren kullan─▒m d─▒┼č─▒ b─▒rak─▒ld─▒ ve PHP 7'den itibaren kald─▒r─▒ld─▒ .

K─▒rm─▒z─▒ KutuÔÇÖyu g├Ârd├╝n m├╝?

Herhangi bir mysql_* kullan─▒m k─▒lavuzu sayfas─▒na girdi─činizde , art─▒k kullan─▒lmamas─▒ gerekti─čini a├ž─▒klayan k─▒rm─▒z─▒ bir kutu g├Âr├╝rs├╝n├╝z.

Niye ya


Uzakla┼čmak ext/mysql sadece g├╝venlikle ilgili de─čil, ayn─▒ zamanda MySQL veritaban─▒n─▒n t├╝m ├Âzelliklerine eri┼čebilmekle de ilgilidir.

ext/mysql MySQL 3.23 i├žin ├╝retildi ve o zamandan beri sadece ├žok az ekleme yap─▒ld─▒, ancak kodun korunmas─▒n─▒ biraz zorla┼čt─▒ran bu eski s├╝r├╝mle uyumluluk devam ediyordu . Desteklenmeyen eksik ├Âzellikler ext/mysql ┼čunlar─▒ i├žerir: ( PHP k─▒lavuzundan ).

mysql_* ─░┼člev kullanmama nedeni :

Quentin'nin cevab─▒ndan al─▒nt─▒ yap─▒lan nokta

Haz─▒rlanan ifadeler i├žin destek eksikli─či, harici bir veriden ayr─▒ bir i┼člev ├ža─čr─▒s─▒ ile manuel olarak ka├žmaktan daha a├ž─▒k, daha az hataya a├ž─▒k bir y├Ântemden al─▒nt─▒ yapma ve sunma y├Ântemini sa─člad─▒klar─▒ndan ├Âzellikle ├Ânemlidir.

SQL uzant─▒lar─▒n─▒n kar┼č─▒la┼čt─▒rmas─▒na bak─▒n .


Kullan─▒mdan kald─▒r─▒lma uyar─▒lar─▒n─▒ bast─▒rma

Kod d├Ân├╝┼čt├╝r├╝len edilirken MySQLi / PDO , E_DEPRECATED ayarlayarak hatalar bast─▒r─▒labilir error_reporting i├žinde php.ini d─▒┼člamak i├žin E_DEPRECATED:

 error_reporting = E_ALL ^ E_DEPRECATED
 

Bunun, MySQL d─▒┼č─▒ndaki ┼čeyler i├žin olabilecek di─čer kullan─▒mdan ├ž─▒karma uyar─▒lar─▒ da gizleyece─čini unutmay─▒n . ( PHP k─▒lavuzundan )

PDO vs. MySQLi makalesi : Hangisini Kullanmal─▒s─▒n─▒z? taraf─▒ndan Dejan Marjanovic se├žti─činiz i├žin yard─▒mc─▒ olacakt─▒r.

Ve daha iyi bir yol PDO , ve ben ┼čimdi basit bir PDO ├Â─čretici yaz─▒yorum .


Basit ve k─▒sa bir PDO ├Â─čreticisi


S. Akl─▒mdaki ilk soru ┼čuydu: ÔÇťPDOÔÇŁ nedir?

A. ÔÇť PDO - PHP Veri Nesneleri - birden fazla veritaban─▒na tek tip eri┼čim y├Ântemi sa─člayan bir veritaban─▒ eri┼čim katman─▒d─▒r.ÔÇŁ


alt metin


MySQL'e Ba─članma

─░le mysql_* biz eski ┼čekilde s├Âyleyebiliriz fonksiyonu ya da (yukar─▒da PHP'de 5.5 ve kullan─▒mdan kald─▒r─▒ld─▒)

 $link = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('testdb', $link);
mysql_set_charset('UTF-8', $link);
 

Birlikte PDO : Yapman─▒z gereken tek ┼čey yeni bir PDO nesne olu┼čturmak . Yap─▒c─▒ veritaban─▒ kayna─č─▒ belirlemek i├žin parametreleri kabul PDO sitesindeki yap─▒c─▒ ├žo─čunlukla d├Ârt parametre yer al─▒r DSN , iste─če ba─čl─▒ olarak (veri kayna─č─▒ ad─▒) ve username , password .

Burada bence hari├ž herkes hakk─▒nda bilginiz var DSN ; bu yeni PDO . A DSN , temel olarak PDO hangi s├╝r├╝c├╝n├╝n kullan─▒laca─č─▒n─▒ ve ba─člant─▒ detaylar─▒n─▒ g├Âsteren bir se├ženekler dizisidir . Daha fazla referans i├žin, PDO MySQL DSN'yi kontrol edin .

 $db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');
 

Not: Ayr─▒ca kullanabilirsiniz charset=UTF-8 , ancak bazen bir hataya neden olur, bu nedenle kullan─▒m─▒ daha iyidir utf8 .

Herhangi bir ba─člant─▒ hatas─▒ varsa, daha fazla PDOException i┼členebilecek bir nesne f─▒rlat─▒r Exception .

─░yi okuma : Ba─člant─▒lar ve Ba─člant─▒ y├Ânetimi ┬Â

D├Ârd├╝nc├╝ parametreye bir dizi olarak ├že┼čitli s├╝r├╝c├╝ se├ženeklerinden de ge├žebilirsiniz. PDO ─░stisna moduna ge├žiren parametreyi ge├žirmenizi ├Âneririm . Baz─▒ PDO s├╝r├╝c├╝ler yerel haz─▒rlanm─▒┼č ifadeleri desteklemedi─činden PDO , haz─▒rlaman─▒n em├╝lasyonunu ger├žekle┼čtirir. Ayr─▒ca bu em├╝lasyonu el ile etkinle┼čtirmenize de olanak sa─člar. Yerel sunucu taraf─▒ taraf─▒ndan haz─▒rlanan ifadeleri kullanmak i├žin a├ž─▒k├ža ayarlaman─▒z gerekir false .

Di─čeri, MySQL s├╝r├╝c├╝de varsay─▒lan olarak etkinle┼čtirilmi┼č em├╝lasyon haz─▒rlamay─▒ kapatmakt─▒r , ancak PDO g├╝venli bir ┼čekilde kullanmak i├žin em├╝lasyon haz─▒rl─▒─č─▒ kapat─▒lmal─▒d─▒r .

Daha sonra neden em├╝lasyon haz─▒rlaman─▒n kapat─▒lmas─▒ gerekti─čini a├ž─▒klayaca─č─▒m. Sebep bulmak i├žin l├╝tfen bu yaz─▒y─▒ kontrol edin .

MySQL Tavsiye edilmeyen eski bir s├╝r├╝m├╝n├╝ kullan─▒yorsan─▒z yaln─▒zca kullan─▒labilir .

A┼ča─č─▒da nas─▒l yapabilece─činize bir ├Ârnek verilmi┼čtir:

 $db = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8', 
              'username', 
              'password',
              array(PDO::ATTR_EMULATE_PREPARES => false,
              PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
 

PDO in┼čaat─▒ sonras─▒ ├Âzellikleri ayarlayabilir miyiz?

Evet , PDO yap─▒m─▒ndan sonra baz─▒ ├Âzellikleri de belirleyebiliriz setAttribute :

 $db = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8', 
              'username', 
              'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
 

Hata i┼čleme


Hata i┼čleme de ├žok daha kolayd─▒r PDO daha mysql_* .

Kullan─▒rken yayg─▒n bir uygulama mysql_* :

 //Connected to MySQL
$result = mysql_query("SELECT * FROM table", $link) or die(mysql_error($link));
 

OR die() hatay─▒ d├╝zeltmek i├žin iyi bir yol de─čil, ├ž├╝nk├╝ hadi d├╝zeltemeyiz die . Sadece beti─či aniden sonland─▒r─▒r ve hatay─▒ genellikle son kullan─▒c─▒lar─▒n─▒za g├Âstermek istemedi─činiz ekrana eko yapar ve kanl─▒ bilgisayar korsanlar─▒n─▒n ┼čeman─▒z─▒ ke┼čfetmesine izin verir. Alternatif olarak, mysql_* i┼člevlerin d├Ân├╝┼č de─čerleri genellikle hatalar─▒ i┼člemek i├žin mysql_error () ile birlikte kullan─▒labilir .

PDO daha iyi bir ├ž├Âz├╝m sunar: istisnalar. Birlikte yapt─▒─č─▒m─▒z her ┼čey PDO bir try - catch blokta sar─▒lmal─▒d─▒r . PDO Hata modu ├Âzelli─čini ayarlayarak ├╝├ž hata modundan birine zorlayabiliriz . ├ť├ž hata i┼čleme modu a┼ča─č─▒dad─▒r.

  • PDO::ERRMODE_SILENT . Sadece hata kodlar─▒n─▒ ayarlamak ve hemen hemen mysql_* her sonucu kontrol etmeniz ve ard─▒ndan $db->errorInfo(); hata ayr─▒nt─▒lar─▒n─▒ g├Ârmek i├žin bakman─▒z gerekenle ayn─▒ ┼čekilde hareket ediyor .
  • PDO::ERRMODE_WARNING Raise E_WARNING . (├çal─▒┼čma zaman─▒ uyar─▒lar─▒ (├Ânemli olmayan hatalar). Komut dosyas─▒n─▒n y├╝r├╝t├╝lmesi durdurulmad─▒.)
  • PDO::ERRMODE_EXCEPTION : ─░stisnalar─▒ at. PDO taraf─▒ndan olu┼čturulan bir hatay─▒ temsil eder. PDOException Kendi kodundan bir tane atmamal─▒s─▒n . PHP'deki istisnalar hakk─▒nda daha fazla bilgi i├žin bkz. ─░stisnalar . or die(mysql_error()); Yakalanmad─▒─č─▒ zamanki gibi davran─▒r . Ama aksine or die() , PDOException e─čer se├žerseniz, yakalama ve incelikle ele al─▒nabilir.

─░yi okuma :

Sevmek:

 $stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
$stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
$stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
 

Ve a┼ča─č─▒daki gibi sarabilirsiniz try -. catch

 try {
    //Connect as appropriate as above
    $db->query('hi'); //Invalid query!
} 
catch (PDOException $ex) {
    echo "An Error occured!"; //User friendly message/message you want to show to user
    some_logging_function($ex->getMessage());
}
 

Sen ile ele almak gerekmez try - catch hemen ┼čimdi. ─░stedi─činiz zaman yakalayabilirsiniz, ancak kullanman─▒z─▒ ┼čiddetle tavsiye ediyorum try - catch . Ayr─▒ca, onu ├ža─č─▒ran i┼člevin d─▒┼č─▒ndan yakalamak daha mant─▒kl─▒ olabilir PDO :

 function data_fun($db) {
    $stmt = $db->query("SELECT * FROM table");
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

//Then later
try {
    data_fun($db);
}
catch(PDOException $ex) {
    //Here you can handle error and show message/perform action you want.
}
 

Ayr─▒ca, or die() bununla ba┼ča ├ž─▒kabilirsiniz ya da ┼č├Âyle diyebiliriz mysql_* , ancak ger├žekten de de─či┼čecektir. Tehlikeli hata mesajlar─▒n─▒ ├╝retimde a├ž─▒p display_errors off sadece hata g├╝nl├╝─č├╝n├╝z├╝ okuyarak gizleyebilirsiniz .

┼×imdi, yukar─▒daki her ┼čeyi okuduktan sonra, muhtemelen d├╝┼č├╝n├╝yorsun: halt ne oldu─čunu ben sadece basit e─čilerek ba┼člamak istedi─činizde SELECT , INSERT , UPDATE veya DELETE ifadeleri? Endi┼čelenme, i┼čte ba┼čl─▒yoruz:


Veri Se├žme


PDO resmi se├ž

├ľyleyse ne yap─▒yorsun mysql_* :

 <?php
$result = mysql_query('SELECT * from table') or die(mysql_error());

$num_rows = mysql_num_rows($result);

while($row = mysql_fetch_assoc($result)) {
    echo $row['field1'];
}
 

┼×imdi PDO , ┼čunu yapabilirsiniz:

 <?php
$stmt = $db->query('SELECT * FROM table');

while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $row['field1'];
}
 

Veya

 <?php
$stmt = $db->query('SELECT * FROM table');
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

//Use $results
 

Not : A┼ča─č─▒daki ( query() ) gibi bir y├Ântem kullan─▒yorsan─▒z , bu y├Ântem bir PDOStatement nesneyi d├Ând├╝r├╝r . Yani sonucu almak istiyorsan─▒z, yukar─▒daki gibi kullan─▒n.

 <?php
foreach($db->query('SELECT * FROM table') as $row) {
    echo $row['field1'];
}
 

PDO Verilerinde, ->fetch() ifade i┼člemcinizin bir y├Ântemi ile elde edilir . Getirmeyi aramadan ├Ânce, en iyi yakla┼č─▒m PDO'ya verilerin nas─▒l al─▒nmas─▒n─▒ istedi─činizi s├Âylemektir. A┼ča─č─▒daki b├Âl├╝mde bunu a├ž─▒kl─▒yorum.

Mod Al

Kullan─▒m─▒na dikkat PDO::FETCH_ASSOC i├žinde fetch() ve fetchAll() yukar─▒daki kodda. Bu PDO , sat─▒rlar─▒ alan adlar─▒yla bir anahtar dizisi olarak d├Ând├╝rmeyi s├Âyler . Tek tek anlataca─č─▒m bir├žok alma modu da var.

Her ┼čeyden ├Ânce, getirme modunun nas─▒l se├žilece─čini a├ž─▒klar─▒m:

  $stmt->fetch(PDO::FETCH_ASSOC)
 

Yukar─▒dakilerde kullan─▒yorum fetch() . Ayr─▒ca kullanabilirsiniz:

┼×imdi getirme moduna geldim:

  • PDO::FETCH_ASSOC : sonu├ž k├╝menizde d├Ând├╝r├╝len s├╝tun ad─▒na g├Âre dizine al─▒nm─▒┼č bir dizi d├Ând├╝r├╝r
  • PDO::FETCH_BOTH (varsay─▒lan): Sonu├ž k├╝menizde d├Ând├╝r├╝len s├╝tun ad─▒ ve 0 dizinli s├╝tun numaras─▒ ile dizine al─▒nm─▒┼č bir dizi d├Ând├╝r├╝r

Daha da fazla se├ženek var! Hepsini PDOStatement getir belgelerinde t├╝m├╝yle okuyun . .

Sat─▒r say─▒s─▒n─▒ almak :

Bunun yerine kullanman─▒n mysql_num_rows d├Ând├╝r├╝len sat─▒rlar─▒n say─▒s─▒n─▒ almak i├žin, bir elde edebilirsiniz PDOStatement ve yap─▒lacak rowCount() gibi:

 <?php
$stmt = $db->query('SELECT * FROM table');
$row_count = $stmt->rowCount();
echo $row_count.' rows selected';
 

Son Eklenen Kimli─či Alma

 <?php
$result = $db->exec("INSERT INTO table(firstname, lastname) VAULES('John', 'Doe')");
$insertId = $db->lastInsertId();
 

─░fadeleri Ekleme ve G├╝ncelleme veya Silme


PDO resmini ekleyin ve g├╝ncelleyin

─░┼člevde yapt─▒─č─▒m─▒z mysql_* ┼čey:

 <?php
$results = mysql_query("UPDATE table SET field='value'") or die(mysql_error());
echo mysql_affected_rows($result);
 

Ve pdo'da, bu ayn─▒ ┼čey taraf─▒ndan da yap─▒labilir:

 <?php
$affected_rows = $db->exec("UPDATE table SET field='value'");
echo $affected_rows;
 

Yukar─▒daki sorguda PDO::exec bir SQL ifadesi y├╝r├╝t├╝n ve etkilenen sat─▒r say─▒s─▒n─▒ d├Ând├╝r├╝r.

Ekle ve sil daha sonra ele al─▒nacakt─▒r.

Yukar─▒daki y├Ântem yaln─▒zca sorguda de─či┼čken kullanmad─▒─č─▒n─▒zda yararl─▒d─▒r. Ancak bir sorguda bir de─či┼čken kullanman─▒z gerekti─činde, asla yukar─▒daki gibi denemeyin ve orada haz─▒r ifade veya parametreli hale getirilmi┼č ifade vard─▒r.


Haz─▒rlanan Bildirimler

S. Haz─▒rlanan bir ifade nedir ve neden onlara ihtiyac─▒m var?
A. Haz─▒rlanm─▒┼č bir ifade, sadece verileri sunucuya g├Ândererek birden ├žok kez ├žal─▒┼čt─▒r─▒labilen ├Ânceden derlenmi┼č bir SQL ifadesidir.

Haz─▒rlanm─▒┼č bir c├╝mle kullanman─▒n tipik i┼č ak─▒┼č─▒ ┼ču ┼čekildedir ( Wikipedia 3 3 noktas─▒ndan al─▒nt─▒lanm─▒┼čt─▒r ):

  1. Haz─▒rla : ─░fade ┼čablonu uygulama taraf─▒ndan olu┼čturulur ve veritaban─▒ y├Ânetim sistemine (DBMS) g├Ânderilir. Belirli de─čerler parametreler, yer tutucular veya ba─člama de─či┼čkenleri ad─▒ verilen belirtilmemi┼č olarak b─▒rak─▒lm─▒┼čt─▒r ? :

    INSERT INTO PRODUCT (name, price) VALUES (?, ?)

  2. DBMS, ifade ┼čablonunda sorgu optimizasyonunu ayr─▒┼čt─▒r─▒r, derler ve ger├žekle┼čtirir ve sonucu ├žal─▒┼čt─▒rmadan saklar.

  3. Y├╝r├╝tme : Daha sonra, uygulama parametreler i├žin de─čerler sa─člar (veya ba─člar) ve DBMS ifadeyi ├žal─▒┼čt─▒r─▒r (muhtemelen bir sonu├ž d├Ând├╝r├╝r). Uygulama, ifadeyi farkl─▒ de─čerlerle istedi─či kadar ├žal─▒┼čt─▒rabilir. Bu ├Ârnekte, ilk parametre ve 1.00 ikinci parametre i├žin 'Ekmek' sa─člayabilir .

SQL'inize yer tutucular─▒ dahil ederek haz─▒rlanm─▒┼č bir ifadeyi kullanabilirsiniz. Temel olarak ├╝├ž tane yer tutucusu var (bunu bir ├╝st├╝ndeki de─či┼čkenle denemeyin), biri ads─▒z yer tutucularla, di─čeri ad verilmi┼č yer tutucularla.

S. ┼×imdi, yer tutuculara ne ad verilir ve bunlar─▒ nas─▒l kullan─▒r─▒m?
A. ─░simli yer tutucular. Soru i┼čaretleri yerine, ├Ânce iki nokta ├╝st ├╝ste gelen a├ž─▒klay─▒c─▒ isimler kullan─▒n. ─░sim sahibinde pozisyon / de─čer s─▒ras─▒n─▒ umursam─▒yoruz:

  $stmt->bindParam(':bla', $bla);
 

bindParam(parameter,variable,data_type,length,driver_options)

Ayr─▒ca bir execute array kullanarak da ba─članabilirsiniz:

 <?php
$stmt = $db->prepare("SELECT * FROM table WHERE id=:id AND name=:name");
$stmt->execute(array(':name' => $name, ':id' => $id));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
 

OOP Arkada┼člar─▒n bir di─čer g├╝zel ├Âzelli─či de, adland─▒r─▒lm─▒┼č yer tutucular─▒n, ├Âzelliklerin adland─▒r─▒lm─▒┼č alanlarla e┼čle┼čti─čini varsayarak do─črudan veritaban─▒n─▒za nesneler ekleme yetene─čine sahip olmas─▒d─▒r. ├ľrne─čin:

 class person {
    public $name;
    public $add;
    function __construct($a,$b) {
        $this->name = $a;
        $this->add = $b;
    }

}
$demo = new person('john','29 bla district');
$stmt = $db->prepare("INSERT INTO table (name, add) value (:name, :add)");
$stmt->execute((array)$demo);
 

S. Peki, ads─▒z yer tutucular nedir ve bunlar─▒ nas─▒l kullan─▒r─▒m?
A. Bir ├Ârnek verelim:

 <?php
$stmt = $db->prepare("INSERT INTO folks (name, add) values (?, ?)");
$stmt->bindValue(1, $name, PDO::PARAM_STR);
$stmt->bindValue(2, $add, PDO::PARAM_STR);
$stmt->execute();
 

ve

 $stmt = $db->prepare("INSERT INTO folks (name, add) values (?, ?)");
$stmt->execute(array('john', '29 bla district'));
 

Yukar─▒da, ? bir isim yer tutucusu gibi bir isim yerine bunlar─▒ g├Ârebilirsiniz . ┼×imdi ilk ├Ârnekte, de─či┼čkenleri ├že┼čitli yer tutuculara ( $stmt->bindValue(1, $name, PDO::PARAM_STR); ) atar─▒z . Ard─▒ndan, bu yer tutuculara de─čer atar ve ifadeyi ├žal─▒┼čt─▒r─▒r─▒z. ─░kinci ├Ârnekte, ilk dizi eleman─▒, birinci gider ? ve ikinci ikinci ? .

NOT : Ads─▒z yer tutucularda , dizideki ├Â─čelerin PDOStatement::execute() metoda iletti─čimiz d├╝zenin s─▒ras─▒na dikkat etmeliyiz .


SELECT , INSERT , UPDATE , DELETE Sorgular haz─▒rlanan

  1. SELECT :

     $stmt = $db->prepare("SELECT * FROM table WHERE id=:id AND name=:name");
    $stmt->execute(array(':name' => $name, ':id' => $id));
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
     
  2. INSERT :

     $stmt = $db->prepare("INSERT INTO table(field1,field2) VALUES(:field1,:field2)");
    $stmt->execute(array(':field1' => $field1, ':field2' => $field2));
    $affected_rows = $stmt->rowCount();
     
  3. DELETE :

     $stmt = $db->prepare("DELETE FROM table WHERE id=:id");
    $stmt->bindValue(':id', $id, PDO::PARAM_STR);
    $stmt->execute();
    $affected_rows = $stmt->rowCount();
     
  4. UPDATE :

     $stmt = $db->prepare("UPDATE table SET name=? WHERE id=?");
    $stmt->execute(array($name, $id));
    $affected_rows = $stmt->rowCount();
     

NOT:

Ancak PDO ve / veya MySQLi tamamen g├╝venli de─čildir. Cevab─▒ kontrol et PDO haz─▒rlanm─▒┼č ifadeler, SQL enjeksiyonunu ├Ânlemek i├žin yeterli mi? ircmaxell taraf─▒ndan . Ayr─▒ca, cevab─▒ndan bir k─▒sm─▒n─▒ al─▒nt─▒ yap─▒yorum:

 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->query('SET NAMES GBK');
$stmt = $pdo->prepare("SELECT * FROM test WHERE name = ? LIMIT 1");
$stmt->execute(array(chr(0xbf) . chr(0x27) . " OR 1=1 /*"));
 

1251







─░lk ├Ânce, herkese verdi─čimiz standart yorum ile ba┼člayal─▒m:

L├╝tfen, mysql_* i┼člevleri yeni kodda kullanmay─▒n . Art─▒k bak─▒mlar─▒ yap─▒lmamaktad─▒r ve resmi olarak kullan─▒mdan kald─▒r─▒lm─▒┼čt─▒r . Bkz k─▒rm─▒z─▒ kutuyu ? Bunun yerine haz─▒rlanan ifadeler hakk─▒nda bilgi edininve PDO veya MySQLi kullan─▒n - bu makale hangisine karar vermenize yard─▒mc─▒ olacakt─▒r. PDO se├žerseniz, burada iyi bir ├Â─čretici .

Bunu, c├╝mleyi c├╝mle ile g├Âzden ge├žirip a├ž─▒klayal─▒m:

  • Art─▒k bak─▒mlar─▒ yap─▒lmamaktad─▒r ve resmen onaylanmam─▒┼čt─▒r.

    Bu, PHP toplulu─čunun yava┼č yava┼č bu ├žok eski i┼člevler i├žin deste─či b─▒rakt─▒─č─▒ anlam─▒na gelir. PHP'nin gelecekteki (yeni) bir s├╝r├╝m├╝nde bulunmamalar─▒ muhtemeldir! Bu i┼člevlerin s├╝rekli kullan─▒m─▒, (├žok) ileriki bir zamanda kodunuzu bozabilir.

    YEN─░! - ext / mysql art─▒k PHP 5.5'ten itibaren resmi olarak kullan─▒mdan kald─▒r─▒lm─▒┼čt─▒r!

    Daha yeni! PHP / 7'de ext / mysql kald─▒r─▒ld─▒ .

  • Bunun yerine, haz─▒rlanan ifadeleri ├Â─črenmelisiniz

    mysql_* uzant─▒s─▒ , (di─čer ┼čeylerin yan─▒ s─▒ra) SQL Injection'a kar┼č─▒ ├žok etkili bir kar┼č─▒ ├Ânlem olan haz─▒rlanm─▒┼č ifadeleri desteklememektedir . MySQL'e ba─čl─▒ uygulamalarda, sald─▒rganlar─▒n beti─činize eri┼čmesini ve veritaban─▒nda olas─▒ t├╝m sorgulamalar─▒ ger├žekle┼čtirmesini sa─člayan ├žok ciddi bir g├╝venlik a├ž─▒─č─▒ d├╝zeltildi .

    Daha fazla bilgi i├žin, bkz . PHP'de SQL enjeksiyonunu nas─▒l ├Ânleyebilirim?

  • K─▒rm─▒z─▒ KutuÔÇÖyu g├Ârd├╝n m├╝?

    Herhangi bir mysql fonksiyon el kitab─▒ sayfas─▒na gitti─činizde, art─▒k kullan─▒lmamas─▒ gerekti─čini a├ž─▒klayan k─▒rm─▒z─▒ bir kutu g├Âr├╝rs├╝n├╝z.

  • PDO veya MySQLi'yi kullan─▒n

    Daha iyi, daha sa─člam ve sa─člam alternatifler var, veritaban─▒ etkile┼čimine tam bir OOP yakla┼č─▒m─▒ sunan PDO - PHP Veritaban─▒ Nesnesi ve MySQL'e ├Âzg├╝ bir geli┼čme olan MySQLi .


293







Kullan─▒m kolayl─▒─č─▒

Analitik ve sentetik sebepler ├žoktan bahsedilmi┼čti. Yeni gelenler i├žin, tarihli mysql_ i┼člevlerini kullanmay─▒ b─▒rakma konusunda daha ├Ânemli bir te┼čvik var.

├ça─čda┼č veritaban─▒ API'lerinin kullan─▒m─▒ sadece daha kolayd─▒r .

├ço─čunlukla kodu basitle┼čtirebilen ba─čl─▒ parametrelerdir . Ve m├╝kemmel ├Â─čreticilerle (yukar─▒da g├Âr├╝ld├╝─č├╝ gibi) PDO'ya ge├ži┼č ├žok zor de─čil.

Bir seferde daha b├╝y├╝k bir kod taban─▒n─▒n yeniden yaz─▒lmas─▒ zaman al─▒r. Bu ara alternatif i├žin Raison d'├¬tre:

E┼čde─čer pdo_ * yerine i┼člevleri mysql_ *

< Pdo_mysql.php > komutunu kullanarak , eski mysql_ i┼člevlerinden minimum ├žabayla ge├ži┼č yapabilirsiniz . pdo_ Muadillerinin yerini alan fonksiyon sarmalay─▒c─▒lar─▒ ekler mysql_ .

  1. Basit├že , veritaban─▒ ile etkile┼čime girmek zorunda olan her bir betik beti─činde. include_once( "pdo_mysql.php" );

  2. Her yerde mysql_ i┼člev ├Ânekini kald─▒r─▒n ve ile de─či┼čtirin . pdo_

    • mysql_ connect() olur pdo_ connect()
    • mysql_ query() olur pdo_ query()
    • mysql_ num_rows() olur pdo_ num_rows()
    • mysql_ insert_id() olur pdo_ insert_id()
    • mysql_ fetch_array() olur pdo_ fetch_array()
    • mysql_ fetch_assoc() olur pdo_ fetch_assoc()
    • mysql_ real_escape_string() olur pdo_ real_escape_string()
    • ve bunun gibi...

  3. Kodunuz ayn─▒ ┼čekilde ├žal─▒┼čacak ve hala ayn─▒ g├Âr├╝n├╝yor:

     include_once("pdo_mysql.php"); 
    
    pdo_connect("localhost", "usrABC", "pw1234567");
    pdo_select_db("test");
    
    $result = pdo_query("SELECT title, html FROM pages");  
    
    while ($row = pdo_fetch_assoc($result)) {
        print "$row[title] - $row[html]";
    }
     

Et voilà.
Kodunuz PDO kullan─▒yor .
┼×imdi bunu ger├žekten kullanma zaman─▒ .

Ba─čl─▒ parametrelerin kullan─▒m─▒ kolay olabilir




Sadece daha az hantal bir API'ye ihtiyac─▒n─▒z var.

pdo_query() S─▒n─▒r parametreleri i├žin ├žok kolay destek ekler. Eski kodu d├Ân├╝┼čt├╝rme basittir:




De─či┼čkenlerinizi SQL dizesinin d─▒┼č─▒na ta┼č─▒y─▒n.

  • Bunlar─▒ virg├╝lle ayr─▒lm─▒┼č i┼člev parametreleri olarak ekleyin pdo_query() .
  • Soru i┼čaretlerini ? de─či┼čkenlerin daha ├Ânce oldu─ču yer tutucular─▒ olarak yerle┼čtirin.
  • Daha ' ├Ânce dize de─čerleri / de─či┼čkenleri i├žeren tek t─▒rnak i┼čaretlerinden kurtulun .

Avantaj, uzun kod i├žin daha belirgin hale gelir.

Genellikle dize de─či┼čkenleri sadece SQL'e dahil de─čildir, ayn─▒ zamanda aradaki ka├žan ├ža─čr─▒larla birle┼čtirilir.

 pdo_query("SELECT id, links, html, title, user, date FROM articles
   WHERE title='" . pdo_real_escape_string($title) . "' OR id='".
   pdo_real_escape_string($title) . "' AND user <> '" .
   pdo_real_escape_string($root) . "' ORDER BY date")
 

─░le ? tutucular─▒ bununla rahats─▒z gerekmez uygulanan:

 pdo_query("SELECT id, links, html, title, user, date FROM articles
   WHERE title=? OR id=? AND user<>? ORDER BY date", $title, $id, $root)
 

Unutmay─▒n ki pdo_ * ya hala ya da .
Sadece bir de─či┼čken ka├ž─▒┼č yok ve ayn─▒ sorguda ba─člamak.

  • Yer tutucu ├Âzelli─či, arkas─▒ndaki ger├žek PDO taraf─▒ndan sa─član─▒r.
  • B├Âylece :named daha sonra yer tutucu listelerine izin verildi .

Daha da ├Ânemlisi, herhangi bir sorgunun arkas─▒na $ _REQUEST [] de─či┼čkenlerini g├╝venle iletebilirsiniz. G├Ânderilen <form> alanlar veritaban─▒ yap─▒s─▒na tam olarak uydu─čunda tam olarak daha k─▒sad─▒r:

 pdo_query("INSERT INTO pages VALUES (?,?,?,?,?)", $_POST);
 

├çok fazla basitlik. Fakat neden yeniden kurtulmak mysql_ ve ka├žmak isteyebilece─činizle ilgili baz─▒ yeniden yazma ├Ânerileri ve teknik nedenlere geri d├Ânelim .

Oldschool sanitize() i┼člevini d├╝zeltme veya kald─▒rma

T├╝m mysql_ ├ža─čr─▒lar─▒ pdo_query , ili┼čkili paragraflarla d├Ân├╝┼čt├╝rd├╝─č├╝n├╝zde , t├╝m gereksiz pdo_real_escape_string ├ža─čr─▒lar─▒ kald─▒r─▒n .

├ľzellikle herhangi d├╝zeltmek gerekir sanitize ya clean ya filterThis ya clean_data tek form veya di─čer tarihli ├Â─čreticiler taraf─▒ndan ilan gibi i┼člevleri:

 function sanitize($str) {
   return trim(strip_tags(htmlentities(pdo_real_escape_string($str))));
}
 

Buradaki g├Âze batan hata ise dok├╝mantasyon eksikli─či. Daha da ├Ânemlisi, filtreleme s─▒ras─▒ tamamen yanl─▒┼č s─▒radayd─▒.

  • Do─čru d├╝zen olurdu: deprecatedly stripslashes i├žteki aramas─▒ olarak, daha sonra trim , sonradan strip_tags , htmlentities sadece son ├ž─▒k─▒┼č ba─člam─▒ ve i├žin _escape_string onun uygulama olarak do─črudan intersparsing SQL preceed olmal─▒d─▒r.

  • Ancak ilk ad─▒m olarak sadece ├ža─čr─▒dan kurtulun _real_escape_string .

  • sanitize() Veritaban─▒n─▒z ve uygulama ak─▒┼č─▒n─▒z HTML ba─člam─▒nda g├╝venli dizeler bekliyorsa , i┼člevinizin geri kalan k─▒sm─▒n─▒ ┼čimdilik saklaman─▒z gerekebilir . Yaln─▒zca bundan sonra ka├žan HTML'yi uygulad─▒─č─▒na dair bir yorum ekleyin.

  • Dize / de─čer i┼čleme, PDO'ya ve onun parametrele┼čtirilmi┼č ifadelerine verilmi┼čtir.

  • stripslashes() Sterilize etme fonksiyonunuzda herhangi bir s├Âz varsa , daha y├╝ksek d├╝zeyde bir g├Âzetimi i┼čaret edebilir.

    • Bu genellikle, kullan─▒mdan kald─▒r─▒lm─▒┼č hasardan (├žifte ka├žan) kurtulmak i├žin vard─▒ magic_quotes . Ancak, en iyi merkezi olarak sabittir , dize de─čil dize.

    • Kullan─▒c─▒n─▒n ters ├ževirme yakla┼č─▒mlar─▒ndan birini kullan─▒n . Ard─▒ndan stripslashes() , sanitize fonksiyondaki giri┼či kald─▒r─▒n .

    Magic_quotes ├╝zerindeki tarihi not. Bu ├Âzellik do─čru olarak kullan─▒mdan kald─▒r─▒lm─▒┼čt─▒r. Ancak, genellikle hatal─▒ g├╝venlik ├Âzelli─či olarak yanl─▒┼č tasvir edilmektedir . Ancak magic_quotes, tenis toplar─▒ beslenme kayna─č─▒ olarak ba┼čar─▒s─▒z oldu─ču kadar ba┼čar─▒s─▒z bir g├╝venlik ├Âzelli─čidir. Bu sadece onlar─▒n amac─▒ de─čildi.

    PHP2 / FI'daki orijinal uygulama a├ž─▒k├ža "sadece t─▒rnaklar─▒n otomatik olarak kald─▒r─▒lmas─▒yla form verilerinin do─črudan msql sorgular─▒na aktar─▒lmas─▒n─▒ " sa─člar. ├ľzellikle , sadece ASCII'yi destekledi─či i├žin mSQL ile kullanmak yanl─▒┼čl─▒kla g├╝venliydi .
    Sonra PHP3 / Zend, MySQL i├žin magic_quotes ├Â─česini yeniden sunmu┼č ve yanl─▒┼č belgelendirmi┼čtir. Fakat ba┼člang─▒├žta g├╝venlik ama├žl─▒ de─čil , sadece kolayl─▒k sa─člayan bir ├Âzellikti .

Haz─▒rlanan ifadeler nas─▒l farkl─▒l─▒k g├Âsterir?

Dize de─či┼čkenlerini SQL sorgular─▒na kar─▒┼čt─▒rd─▒─č─▒n─▒zda, takip etmeniz daha karma┼č─▒k olmaz. Ayn─▒ zamanda MySQL'in kodu ve verileri tekrar ay─▒rmas─▒ i├žin de b├╝y├╝k bir ├žaba.




SQL enjeksiyonlar─▒ basit├že verilerin kod i├žeri─čine s─▒zmas─▒d─▒r . Bir veritaban─▒ sunucusu, daha sonra, PHP'nin ba┼člang─▒├žta de─či┼čkenleri sorgu c├╝mleleri aras─▒na yap─▒┼čt─▒rd─▒─č─▒ yeri tespit edemez.

─░li┼čkili parametrelerle, PHP kodunuzdaki SQL kodu ve SQL ba─člam─▒ de─čerlerini ay─▒r─▒rs─▒n─▒z. Ancak sahnelerin arkas─▒na tekrar kar─▒┼čt─▒r─▒lm─▒yor (PDO :: EMULATE_PREPARES hari├ž). Veritaban─▒n─▒z de─či┼čmemi┼č SQL komutlar─▒n─▒ ve 1: 1 de─či┼čken de─čerlerini al─▒r.




Bu cevap, d├╝┼čmenin okunabilirlik avantajlar─▒na dikkat etmeniz gerekti─čini vurgulamaktad─▒r mysql_ . Bu g├Âr├╝n├╝r ve teknik veri / kod ayr─▒m─▒ nedeniyle zaman zaman bir performans avantaj─▒ da vard─▒r (sadece farkl─▒ de─čerlere sahip tekrarlanan INSERT'ler).

Parametre ba─člaman─▒n hala t├╝m SQL enjeksiyonlar─▒na kar┼č─▒ sihirli bir durak ├ž├Âz├╝m olmad─▒─č─▒na dikkat edin . Veri / de─čerler i├žin en yayg─▒n kullan─▒m─▒ ger├žekle┼čtirir. Ancak s├╝tun ad─▒n─▒ / tablo tan─▒mlay─▒c─▒lar─▒n─▒ beyaz listeye alamaz, dinamik yan t├╝mce yap─▒m─▒nda yard─▒mc─▒ olabilir veya yaln─▒zca d├╝z dizi de─čer listelerini kullanamazs─▒n─▒z.

Hibrit PDO kullan─▒m─▒

Bu pdo_* sarmalay─▒c─▒ i┼člevleri, kodlama dostu bir duraklama API'si olu┼čturur. (Kendine MYSQLI ├Âzg├╝ i┼člev imzas─▒ de─či┼čimi i├žin olmasayd─▒ ne olmu┼č olabilirdi ki). Ayr─▒ca ├žo─ču zaman ger├žek PDO'lar─▒ ortaya ├ž─▒kar─▒rlar.
Yeniden yazma i┼čleminin yeni pdo_ i┼člev adlar─▒n─▒ kullanmay─▒ b─▒rakmas─▒ gerekmez. Her pdo_query () 'yi d├╝z bir $ pdo-> prepare () -> execute () ├ža─čr─▒s─▒na tek tek ge├ži┼č yapabilirsiniz.

Yine de basitle┼čtirmeye ba┼člamak en iyisidir. ├ľrne─čin, ortak sonu├ž alma:

 $result = pdo_query("SELECT * FROM tbl");
while ($row = pdo_fetch_assoc($result)) {
 

Sadece bir foreach yineleme ile de─či┼čtirilebilir:

 foreach ($result as $row) {
 

Veya daha iyisi, do─črudan ve eksiksiz bir dizi al─▒m─▒:

 $result->fetchAll();
 

├ço─ču durumda, PDO veya mysql_'nin genellikle ba┼čar─▒s─▒z sorgulardan sonra sa─člamas─▒ndan daha fazla yard─▒mc─▒ uyar─▒lar elde edersiniz.

Di─čer se├ženekler

Yani bu umar─▒m baz─▒ pratik nedenleri ve b─▒rak─▒lmas─▒ gereken de─čerli bir yolu g├Ârselle┼čtirmi┼čtir mysql_ .

Sadece pdo'ya ge├žmek onu tamamen kesmiyor. pdo_query() ayn─▒ zamanda ├╝zerine bir ├Ân u├ž.

Ayr─▒ca parametre ba─člama ├Âzelli─čini tan─▒tmazsan─▒z veya daha ho┼č API'den ba┼čka bir ┼čey kullanabilirseniz, bu anlams─▒z bir anahtard─▒r. ─░n┼čallah yeni gelenlere kar┼č─▒ cesaret k─▒r─▒c─▒l─▒─č─▒n─▒ ilerletmeyecek kadar basit. (E─čitim genellikle yasaklardan daha iyi ├žal─▒┼č─▒r.)

─░┼če yarayabilecek en basit ┼čey i├žin uygun olmas─▒na ra─čmen, yine de ├žok deneysel bir koddur. Sadece haftasonu yazd─▒m. Ancak bir s├╝r├╝ alternatif var. Sadece PHP veritaban─▒ soyutlama i├žin google ve biraz g├Âz at─▒n. Bu t├╝r g├Ârevler i├žin her zaman bir├žok m├╝kemmel kitapl─▒k olmu┼čtur ve olacakt─▒r.

E─čer veritaban─▒ etkile┼čiminizi daha da basitle┼čtirmek istiyorsan─▒z, Paris / Idiorm gibi haritac─▒lar denemeye de─čer. T─▒pk─▒ hi├ž kimse JavaScriptÔÇÖde m├╝layim DOM kullanm─▒yor gibi, bug├╝nlerde bir ham veritaban─▒ aray├╝z├╝ne bakman─▒za gerek yok.


213







mysql_ fonksiyonlar:

  1. g├╝ncel de─čiller - daha fazla korunmuyorlar
  2. kolayca ba┼čka bir veritaban─▒ arka ucuna gitmenize izin verme
  3. Haz─▒rlanan ifadeleri desteklemedi─činden,
  4. programc─▒lar─▒, sorgu olu┼čturmak i├žin birle┼čtirme kullanmaya te┼čvik ederek SQL ekleme g├╝venlik a├ž─▒klar─▒na neden olabilir

140







Teknik sebeplerden bahsetmi┼čken, sadece birka├ž tane, son derece spesifik ve nadiren kullan─▒l─▒yor. B├╝y├╝k olas─▒l─▒kla onlar─▒ hayat─▒nda asla kullanmayacaks─▒n.
Belki de ├žok cahilimdir, ama onlar─▒ gibi ┼čeyleri kullanma f─▒rsat─▒m olmad─▒

  • engellenmeyen, zaman uyumsuz sorgular
  • ├žoklu sonu├ž k├╝melerini d├Ând├╝ren sakl─▒ yordamlar
  • ┼×ifreleme (SSL)
  • S─▒k─▒┼čt─▒rma

─░htiyac─▒n─▒z olursa - bunlar ┼č├╝phesiz ki, mysql uzant─▒s─▒ndan daha ┼č─▒k ve modern g├Âr├╝n├╝ml├╝ bir ┼čeye do─čru ilerlemenin teknik nedenleridir.

Bununla birlikte, deneyiminizi biraz daha zorla┼čt─▒racak teknik olmayan baz─▒ konular da vard─▒r.

  • Bu i┼člevlerin modern PHP s├╝r├╝mleriyle daha fazla kullan─▒lmas─▒, kullan─▒mdan kald─▒r─▒lm─▒┼č bildirimleri art─▒racakt─▒r. Onlar sadece kapat─▒labilir.
  • uzak bir gelecekte, varsay─▒lan PHP derlemesinden ├ž─▒kar─▒labilirler. Mydsql ext, PECL'e ta┼č─▒naca─č─▒ndan ve her bar─▒nd─▒rma yapan siteler on y─▒llarca ├žal─▒┼čan m├╝┼čterilerini kaybetmek istemedikleri i├žin PHP'yi derlemekten mutlu olacaklard─▒r.
  • Stackoverflow toplulu─čundan g├╝├žl├╝ diren├ž. Her zaman bu d├╝r├╝st i┼člevlerden bahsettiniz, size s─▒k─▒ bir tabu alt─▒nda olduklar─▒ s├Âylendi.
  • Ortalama bir PHP kullan─▒c─▒s─▒ olan bu i┼člevleri kullanma fikriniz b├╝y├╝k olas─▒l─▒kla hataya a├ž─▒k ve yanl─▒┼čt─▒r. Sadece sana yanl─▒┼č yolu ├Â─čreten t├╝m bu say─▒s─▒z ├Â─čretici ve el kitab─▒ndan dolay─▒. Fonksiyonlar─▒n kendileri de─čil - vurgulamak zorunday─▒m - ama kullanma bi├žimleri.

Bu ikinci sorun bir sorundur.
Ancak bence ├Ânerilen ├ž├Âz├╝m de daha iyi de─čil.
Bana ├Âyle geliyor ├žok idealist t├╝m bu PHP kullan─▒c─▒lar─▒n SQL kerede d├╝zg├╝n sorgular─▒ i┼člemek ├Â─čreneceksiniz bir r├╝ya. B├╝y├╝k olas─▒l─▒kla , yakla┼č─▒m─▒ ayn─▒ b─▒rakarak mysql_ * 'u mysqli_ *' a de─či┼čtireceklerdir . ├ľzellikle mysqli haz─▒rlanan ifadeler kullanmas─▒ inan─▒lmaz ac─▒l─▒ ve zahmetli bir kullan─▒m sa─člar. Yerel olarak haz─▒rlanan ifadelerin SQL enjeksiyonlar─▒ndan korunmak i├žin yeterli olmad─▒─č─▒n─▒ ve ne mysqli ne de PDO'nun bir ├ž├Âz├╝m sunmad─▒─č─▒ndan
bahsetmiyorum .

Bu nedenle, bu d├╝r├╝st uzant─▒yla m├╝cadele etmek yerine, yanl─▒┼č uygulamalarla sava┼čmay─▒ ve insanlar─▒ do─čru ┼čekilde e─čitmeyi tercih ederim.

Ayr─▒ca, baz─▒ yanl─▒┼č veya ├Ânemli olmayan nedenleri vard─▒r, ├Ârne─čin

  • Sakl─▒ ─░┼člemleri desteklemiyor ( mysql_query("CALL my_proc"); ya┼člar─▒ boyunca kullan─▒yorduk )
  • ─░┼člemleri desteklemiyor (yukar─▒dakiyle ayn─▒)
  • ├çoklu ─░fadeleri desteklemiyor (kime ihtiya├ž duyar?)
  • Aktif geli┼čme alt─▒nda de─čil (peki? Sizi herhangi bir ┼čekilde etkiler mi ?)
  • Bir OO aray├╝z├╝ yoksundur (bir tane olu┼čturmak birka├ž saat meselesidir)
  • Haz─▒rlanan ─░fadeleri veya Parametrelenmi┼č Sorgular─▒ desteklemiyor

Sonuncusu ilgin├ž bir nokta. Mysql ext yerel olarak haz─▒rlanm─▒┼č ifadeleri desteklemese de, g├╝venlik i├žin gerekli de─čildir. Elle yap─▒lan yer tutucular─▒ kullanarak haz─▒rlanm─▒┼č ifadeleri kolayca sahte yapabiliriz (PDO'nun yapt─▒─č─▒ gibi):

 function paraQuery()
{
    $args  = func_get_args();
    $query = array_shift($args);
    $query = str_replace("%s","'%s'",$query); 

    foreach ($args as $key => $val)
    {
        $args[$key] = mysql_real_escape_string($val);
    }

    $query  = vsprintf($query, $args);
    $result = mysql_query($query);
    if (!$result)
    {
        throw new Exception(mysql_error()." [$query]");
    }
    return $result;
}

$query  = "SELECT * FROM table where a=%s AND b LIKE %s LIMIT %d";
$result = paraQuery($query, $a, "%$b%", $limit);
 

i┼čte , her ┼čey parametreli ve g├╝venli.

Ama tamam, k─▒lavuzdaki k─▒rm─▒z─▒ kutuyu be─čenmiyorsan─▒z, bir se├žim sorunu ortaya ├ž─▒kar: mysqli veya PDO?

Eh, cevap a┼ča─č─▒daki gibi olurdu:

  • Bir veritaban─▒ soyutlama katman─▒ kullanman─▒n ve bir tane olu┼čturmak i├žin bir API araman─▒n gereklili─čini anl─▒yorsan─▒z , mysqli ├žok iyi bir se├žimdir, ├ž├╝nk├╝ asl─▒nda bir├žok mysql'e ├Âzg├╝ ├Âzellikleri desteklemektedir.
  • PHP milletvekillerinin b├╝y├╝k ├žo─čunlu─ču gibi, uygulama kodunda ham API ├ža─čr─▒lar─▒ kullan─▒yorsan─▒z (bu asl─▒nda yanl─▒┼č bir uygulamad─▒r) - Bu uzant─▒ sadece API de─čil, yar─▒-DAL gibi g├Âr├╝nd├╝─č├╝ i├žin PDO tek se├ženek. hala eksik fakat bir├žok ├Ânemli ├Âzellik sunuyor, ikisi ile birlikte PDO'yu mysqli'den ele┼čtirel bir ┼čekilde ay─▒rt ediyor:

    • mysqli'den farkl─▒ olarak PDO, yer tutucular─▒ de─čerine g├Âre ba─člayabilir ve bu da dinamik olarak olu┼čturulan sorgular─▒, olduk├ža kar─▒┼č─▒k kodlu birka├ž ekran olmadan ger├žekle┼čtirilebilir hale getirir.
    • mysqli'den farkl─▒ olarak, PDO her zamanki basit bir dizide sorgu sonucunu her zaman d├Ând├╝r├╝rken, mysqli bunu sadece mysqlnd kurulumlar─▒nda yapabilir.

Yani, ortalama bir PHP kullan─▒c─▒s─▒ysan─▒z ve yerel olarak haz─▒rlanm─▒┼č ifadeleri kullan─▒rken kendinize bir ton s─▒k─▒nt─▒dan kurtulmak istiyorsan─▒z, PDO - tekrar - tek se├ženek.
Ancak, PDO da bir g├╝m├╝┼č mermi de─čildir ve zorluklar─▒ vard─▒r.
Bu y├╝zden, PDO etiketi wiki'deki t├╝m genel tuzaklar ve karma┼č─▒k durumlar i├žin ├ž├Âz├╝mler yazd─▒m.

Bununla birlikte, uzant─▒lardan bahseden herkes, Mysqli ve PDO ile ilgili 2 ├Ânemli ger├že─či her zaman ├Âzl├╝yor :

  1. Haz─▒rlanan a├ž─▒klama g├╝m├╝┼č bir kur┼čun de─čildir . Haz─▒rlanan ifadeler kullan─▒larak ba─članamayan dinamik tan─▒mlay─▒c─▒lar vard─▒r. Sorgu olu┼čturmay─▒ zor bir g├Ârev yapan, bilinmeyen say─▒da parametreye sahip dinamik sorgular vard─▒r.

  2. Ne mysqli_ * ne de PDO i┼člevleri uygulama kodunda g├Âr├╝nmemeliydi. Uygulama kodu KURU ve temiz hale getirerek, uygulamada t├╝m kirli ciltleme, ilmek, hata i┼čleme vb. ─░┼člerini yapacak olan uygulama kodu ile aralar─▒nda
    bir soyutlama katman─▒ olmas─▒ gerekir . ├ľzellikle dinamik sorgu olu┼čturma gibi karma┼č─▒k durumlar i├žin.

Yani, sadece PDO veya mysqli'ye ge├žmek yeterli de─čildir. Birinin bir ORM veya bir sorgu olu┼čturucu veya kodlar─▒nda ham API i┼člevlerini ├ža─č─▒rmak yerine herhangi bir veritaban─▒ soyutlama s─▒n─▒f─▒ kullanmas─▒ gerekir.
Ve aksine - uygulama kodunuz ile mysql API'niz aras─▒nda bir soyutlama katman─▒n─▒z varsa, asl─▒nda hangi motorun kullan─▒ld─▒─č─▒ ├Ânemli de─čildir. Kullan─▒mdan kald─▒r─▒l─▒ncaya kadar mysql ext komutunu kullanabilir ve ard─▒ndan soyutlama s─▒n─▒f─▒n─▒z─▒ ba┼čka bir motora kolayca yeniden yazabilirsiniz ;

─░┼čte b├Âyle bir soyutlama s─▒n─▒f─▒n─▒n nas─▒l olmas─▒ gerekti─čini g├Âstermek i├žin safemysql s─▒n─▒f─▒m─▒ temel alan baz─▒ ├Ârnekler :

 $city_ids = array(1,2,3);
$cities   = $db->getCol("SELECT name FROM cities WHERE is IN(?a)", $city_ids);
 

Bu tek bir sat─▒r─▒ PDO ile ihtiyac─▒n─▒z olacak kod miktar─▒ ile kar┼č─▒la┼čt─▒r─▒n .
Daha sonra ihtiyac─▒n─▒z olan ├ž─▒lg─▒n kod miktar─▒yla kar┼č─▒la┼čt─▒rarak Ham Mysqli'nin haz─▒rlad─▒─č─▒ ifadelerle ihtiyac─▒n─▒z olacak. Hata i┼čleme, profil olu┼čturma, sorgu g├╝nl├╝─č├╝n├╝n zaten yerle┼čik ve ├žal─▒┼č─▒yor oldu─čunu unutmay─▒n.

 $insert = array('name' => 'John', 'surname' => "O'Hara");
$db->query("INSERT INTO users SET ?u", $insert);
 

Her bir alan ad─▒ alt─▒ ila on kez tekrarland─▒─č─▒nda - bu ├žok say─▒da adland─▒r─▒lm─▒┼č yer tutucu, ciltleme ve sorgu tan─▒mlar─▒nda, normal PDO u├žlar─▒yla kar┼č─▒la┼čt─▒r─▒n.

Ba┼čka bir ├Ârnek:

 $data = $db->getAll("SELECT * FROM goods ORDER BY ?n", $_GET['order']);
 

B├Âyle pratik bir durumla ba┼ča ├ž─▒kmak i├žin PDO'ya bir ├Ârnek bulmak zor.
Ve ├žok endi┼čeli ve b├╝y├╝k olas─▒l─▒kla g├╝vensiz olacak.

Bu y├╝zden, bir kez daha - sadece ham s├╝r├╝c├╝ de─čil, yaln─▒zca ba┼člang─▒├ž ÔÇőÔÇőel kitab─▒ndaki sa├žma ├Ârnekler i├žin de─čil, ger├žek hayattaki problemleri ├ž├Âzmede faydal─▒ olan sizin endi┼čeniz de─čil, soyutlama s─▒n─▒f─▒n─▒z olmal─▒d─▒r.


104







Pek ├žok neden var, ama belki de en ├Ânemlisi, bu fonksiyonlar─▒n g├╝venli olmayan programlama uygulamalar─▒n─▒ te┼čvik etmeleridir, ├ž├╝nk├╝ haz─▒rlanan ifadeleri desteklememektedir. Haz─▒rlanan ifadeler, SQL enjeksiyon sald─▒r─▒lar─▒n─▒ ├Ânlemeye yard─▒mc─▒ olur.

mysql_* ─░┼člevleri kullan─▒rken , kullan─▒c─▒ taraf─▒ndan sa─članan parametreleri ├žal─▒┼čt─▒rmay─▒ hat─▒rlaman─▒z gerekir mysql_real_escape_string() . Yaln─▒zca bir yerde unutursan─▒z veya giri┼čin yaln─▒zca bir b├Âl├╝m├╝nden ka├žarsan─▒z, veritaban─▒n─▒z sald─▒r─▒ya maruz kalabilir.

Haz─▒rlanan ifadelerin i├žinde PDO veya i├žerisinde kullan─▒lmas─▒ mysqli , bu t├╝r programlama hatalar─▒n─▒n yap─▒lmas─▒ daha zor olacakt─▒r.


91







├ç├╝nk├╝ (di─čer nedenlerin yan─▒ s─▒ra), girdi verilerinin sterilize edilmesini sa─člamak ├žok daha zor. Parametreli sorgular kullan─▒yorsan─▒z, biri PDO veya mysqli'de oldu─ču gibi, riski tamamen ├Ânleyebilirsiniz.

├ľrnek olarak, biri "enhzflep); drop table users" kullan─▒c─▒ ad─▒ olarak kullanabilir . Eski i┼člevler, sorgu ba┼č─▒na birden fazla ifade ├žal─▒┼čt─▒r─▒lmas─▒na izin verecek, b├Âylece k├Ât├╝ bir b├Âcek gibi bir tablonun tamam─▒n─▒ silebilir.

E─čer biri mysqli'nin PDO'sunu kullanacak olsayd─▒, kullan─▒c─▒ ismi sona erecekti "enhzflep); drop table users" .

Bkz. Bobby-tables.com .


73







Bu cevap, zay─▒f yaz─▒lm─▒┼č PHP kullan─▒c─▒ do─črulama kodunu atlaman─▒n ne kadar ├Ânemsiz oldu─čunu, bu sald─▒r─▒lar─▒n nas─▒l (ve neyin kullan─▒ld─▒─č─▒n─▒) ve eski MySQL i┼člevlerinin g├╝venli haz─▒rlanm─▒┼č bir ifadeyle nas─▒l de─či┼čtirilece─čini ve temel olarak neden StackOverflow kullan─▒c─▒lar─▒n─▒n neden oldu─čunu g├Âstermek i├žin yaz─▒lm─▒┼čt─▒r. (Muhtemelen ├žok say─▒da rep ile) kodlar─▒n─▒ geli┼čtirmek i├žin sorular soran yeni kullan─▒c─▒lara havl─▒yor.

├ľncelikle, l├╝tfen bu testi mysql veritaban─▒n─▒ olu┼čturmaktan ├žekinmeyin (benimki haz─▒rl─▒─č─▒ olarak adland─▒rd─▒m):

 mysql> create table users(
    -> id int(2) primary key auto_increment,
    -> userid tinytext,
    -> pass tinytext);
Query OK, 0 rows affected (0.05 sec)

mysql> insert into users values(null, 'Fluffeh', 'mypass');
Query OK, 1 row affected (0.04 sec)

mysql> create user 'prepared'@'localhost' identified by 'example';
Query OK, 0 rows affected (0.01 sec)

mysql> grant all privileges on prep.* to 'prepared'@'localhost' with grant option;
Query OK, 0 rows affected (0.00 sec)
 

Bu i┼člemle PHP kodumuza ge├žebiliriz.

A┼ča─č─▒daki komut dosyas─▒n─▒n bir web sitesindeki y├Ânetici i├žin do─črulama i┼člemi oldu─čunu varsayal─▒m (basitle┼čtirilmi┼č ancak test i├žin kopyalay─▒p kullan─▒yorsan─▒z ├žal─▒┼č─▒r):

 <?php 

    if(!empty($_POST['user']))
    {
        $user=$_POST['user'];
    }   
    else
    {
        $user='bob';
    }
    if(!empty($_POST['pass']))
    {
        $pass=$_POST['pass'];
    }
    else
    {
        $pass='bob';
    }

    $database='prep';
    $link=mysql_connect('localhost', 'prepared', 'example');
    mysql_select_db($database) or die( "Unable to select database");

    $sql="select id, userid, pass from users where userid='$user' and pass='$pass'";
    //echo $sql."<br><br>";
    $result=mysql_query($sql);
    $isAdmin=false;
    while ($row = mysql_fetch_assoc($result)) {
        echo "My id is ".$row['id']." and my username is ".$row['userid']." and lastly, my password is ".$row['pass']."<br>";
        $isAdmin=true;
        // We have correctly matched the Username and Password
        // Lets give this person full access
    }
    if($isAdmin)
    {
        echo "The check passed. We have a verified admin!<br>";
    }
    else
    {
        echo "You could not be verified. Please try again...<br>";
    }
    mysql_close($link);

?>

<form name="exploited" method='post'>
    User: <input type='text' name='user'><br>
    Pass: <input type='text' name='pass'><br>
    <input type='submit'>
</form>
 

─░lk bak─▒┼čta yeterince okunakl─▒ g├Âr├╝n├╝yor.

Kullan─▒c─▒ bir kullan─▒c─▒ ad─▒ ve ┼čifre girmek zorunda de─čil mi?

Parlak, a┼ča─č─▒ya girmeyin:

 user: bob
pass: somePass
 

ve g├Ânderin.

├ç─▒kt─▒ a┼ča─č─▒daki gibidir:

 You could not be verified. Please try again...
 

S├╝per! Beklendi─či gibi ├žal─▒┼č─▒yor, ┼čimdi ger├žek kullan─▒c─▒ ad─▒ ve ┼čifreyi deneyelim:

 user: Fluffeh
pass: mypass
 

┼×a┼č─▒rt─▒c─▒! Hi-fives her yerde, kod do─čru bir y├Ânetici do─črulad─▒. M├╝kemmel!

┼×ey, tam olarak de─čil. Diyelim ki kullan─▒c─▒ zeki k├╝├ž├╝k bir insan. Diyelim ki ki┼či benim.

A┼ča─č─▒dakileri girin:

 user: bob
pass: n' or 1=1 or 'm=m
 

Ve ├ž─▒kt─▒:

 The check passed. We have a verified admin!
 

Tebrikler, s├╝per korumal─▒ y├Âneticilerinize yaln─▒zca yanl─▒┼č bir kullan─▒c─▒ ad─▒ ve yanl─▒┼č bir ┼čifre girmem i├žin girmeme izin verdiniz. Cidden, bana inanm─▒yorsan─▒z, sa─člad─▒─č─▒m kodla veritaban─▒n─▒ olu┼čturun ve bu PHP kodunu ├žal─▒┼čt─▒r─▒n - bu, bir bak─▒┼čta ger├žekten kullan─▒c─▒ ad─▒n─▒z─▒ ve parolan─▒z─▒ do─čru bir ┼čekilde do─črulad─▒ gibi g├Âr├╝n├╝yor.

Yani, cevap olarak, neden ba─č─▒rd─▒─č─▒n bu.

├ľyleyse, neyin yanl─▒┼č gitti─čini ve neden sadece s├╝per-y├Ânetici-yarasa ma─čaras─▒na girdi─čime bir bakal─▒m. Bir tahminde bulundum ve girdilerinize dikkat etmedi─činizi varsayd─▒m ve do─črudan veritaban─▒na aktard─▒m. Girdiyi, ger├žekte ├žal─▒┼čt─▒rmakta oldu─čunuz sorguyu DE─×─░┼×T─░RECEK ┼čekilde yap─▒land─▒rd─▒m. ├ľyleyse, olmas─▒ gereken neydi ve sonunda ne oldu?

 select id, userid, pass from users where userid='$user' and pass='$pass'
 

Sorgu bu, ancak de─či┼čkenleri kulland─▒─č─▒m─▒z as─▒l girdilerle de─či┼čtirdi─čimizde, a┼ča─č─▒dakileri elde ediyoruz:

 select id, userid, pass from users where userid='bob' and pass='n' or 1=1 or 'm=m'
 

"Parolam─▒" nas─▒l olu┼čturdu─čumu g├Âr├╝n, b├Âylece ├Ânce parolan─▒n etraf─▒ndaki tek al─▒nt─▒y─▒ kapat─▒p ard─▒ndan tamamen yeni bir kar┼č─▒la┼čt─▒rma yapabilir mi? Sonra sadece g├╝venlik i├žin, ba┼čka bir "string" ekledim, b├Âylece tek al─▒nt─▒, orjinalinde olan kodda beklendi─či gibi kapanacakt─▒.

Ancak bu, ┼ču anda size ba─č─▒ran insanlarla ilgili de─čil, kodunuzu nas─▒l daha g├╝venli hale getirece─činizi g├Âstermekle ilgili.

Tamam, peki yanl─▒┼č giden neydi ve nas─▒l d├╝zeltebiliriz?

Bu klasik bir SQL enjeksiyon sald─▒r─▒s─▒. Bu konuda en basitlerinden biri. Sald─▒r─▒ vekt├Ârleri ├Âl├že─činde bu, bir tanka sald─▒ran ve kazanan bir bebek.

├ľyleyse, kutsal y├Ânetici b├Âl├╝m├╝n├╝z├╝ nas─▒l korur ve g├╝zel ve g├╝venli hale getiririz? Yap─▒lacak ilk ┼čey, ger├žekten eski ve kullan─▒mdan kald─▒r─▒lm─▒┼č mysql_* i┼člevleri kullanmay─▒ b─▒rakmak olacakt─▒r . Biliyorum, internette buldu─čun bir ├Â─čreticiyi takip ettin ve i┼če yar─▒yor, ama eski, modas─▒ ge├žmi┼č ve birka├ž dakika uza─č─▒nda, daha yeni terlemi┼čtim.

┼×imdi, mysqli_ veya PDO kullanman─▒n daha iyi se├ženeklerine sahipsiniz . ┼×ahsen ben b├╝y├╝k bir PDO hayran─▒y─▒m, bu y├╝zden bu cevab─▒n geri kalan─▒nda PDO kullanaca─č─▒m. Profesyoneller ve aleyhte olanlar var, ama ┼čahsen ben profesyonellerin aleyhte olanlardan daha a─č─▒r oldu─čunu g├Ârd├╝m. Birden fazla veritaban─▒ motorunda ta┼č─▒nabilir - ister MySQL, ister Oracle kullan─▒yorsunuz, isterse kanl─▒ bir ┼čey olsun - yaln─▒zca ba─člant─▒ dizesini de─či┼čtirerek, kullanmak istedi─čimiz t├╝m fantezi ├Âzelliklere sahiptir ve ho┼č ve temizdir. Temizli─či severim.

┼×imdi bu koda tekrar bakal─▒m, bu sefer bir PDO nesnesi kullan─▒larak yaz─▒lm─▒┼č:

 <?php 

    if(!empty($_POST['user']))
    {
        $user=$_POST['user'];
    }   
    else
    {
        $user='bob';
    }
    if(!empty($_POST['pass']))
    {
        $pass=$_POST['pass'];
    }
    else
    {
        $pass='bob';
    }
    $isAdmin=false;

    $database='prep';
    $pdo=new PDO ('mysql:host=localhost;dbname=prep', 'prepared', 'example');
    $sql="select id, userid, pass from users where userid=:user and pass=:password";
    $myPDO = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
    if($myPDO->execute(array(':user' => $user, ':password' => $pass)))
    {
        while($row=$myPDO->fetch(PDO::FETCH_ASSOC))
        {
            echo "My id is ".$row['id']." and my username is ".$row['userid']." and lastly, my password is ".$row['pass']."<br>";
            $isAdmin=true;
            // We have correctly matched the Username and Password
            // Lets give this person full access
        }
    }

    if($isAdmin)
    {
        echo "The check passed. We have a verified admin!<br>";
    }
    else
    {
        echo "You could not be verified. Please try again...<br>";
    }

?>

<form name="exploited" method='post'>
    User: <input type='text' name='user'><br>
    Pass: <input type='text' name='pass'><br>
    <input type='submit'>
</form>
 

En b├╝y├╝k fark, art─▒k mysql_* i┼člev olmamas─▒d─▒r . Hepsi bir PDO nesnesi ├╝zerinden yap─▒l─▒r, ikincisi, haz─▒rlanm─▒┼č bir ifade kullan─▒yor. ┼×imdi, sordu─čun haz─▒r bir ifade nedir? Bir sorguyu ├žal─▒┼čt─▒rmadan ├Ânce veritaban─▒na, sorgunun ne oldu─čunu ├žal─▒┼čt─▒raca─č─▒m─▒z─▒ s├Âylemenin bir yolu. Bu durumda, veritaban─▒na ┼čunu s├Âyleriz: "Merhaba, kimli─či, kullan─▒c─▒ kimli─čini ve kullan─▒c─▒ kimli─činin de─či┼čken oldu─ču ve kullan─▒c─▒ kimli─činin de de─či┼čken oldu─ču tablo kullan─▒c─▒lar─▒ndan ge├žmek i├žin bir select ifadesi kullanaca─č─▒m.".

Daha sonra execute deyiminde, veritaban─▒na ┼čimdi bekledi─či t├╝m de─či┼čkenleri i├žeren bir dizi iletiriz.

Sonu├žlar muhte┼čem. ┼×imdi bu kullan─▒c─▒ ad─▒ ve ┼čifre kombinasyonlar─▒n─▒ tekrar deneyelim:

 user: bob
pass: somePass
 

Kullan─▒c─▒ do─črulanmad─▒. Muhte┼čem.

Peki ya:

 user: Fluffeh
pass: mypass
 

Oh, biraz heyecanland─▒m, i┼če yarad─▒: Kontrol ge├žti. Do─črulanm─▒┼č bir y├Âneticimiz var!

┼×imdi, k├╝├ž├╝k do─črulama sistemimizi ge├žmeye ├žal─▒┼čmak i├žin ak─▒ll─▒ bir b├Âl├╝m├╝n girece─či verileri deneyelim:

 user: bob
pass: n' or 1=1 or 'm=m
 

Bu sefer a┼ča─č─▒dakileri al─▒yoruz:

 You could not be verified. Please try again...
 

Bu y├╝zden soru g├Ânderirken ba─č─▒r─▒yorsunuz - ├ž├╝nk├╝ insanlar kodunuzun atlanmaya ├žal─▒┼č─▒lsa bile atlanabilece─čini g├Ârebiliyorlar. L├╝tfen kodunuzu geli┼čtirmek, daha g├╝venli hale getirmek ve g├╝ncel olan i┼člevleri kullanmak i├žin bu soruyu ve yan─▒t─▒ kullan─▒n.

Son olarak, bu M├ťKEMMEL kod oldu─čunu s├Âylemek de─čildir. ─░yile┼čtirmek i├žin yapabilece─činiz bir├žok ┼čey var, ├Ârne─čin ┼čifreli ┼čifreler kullan─▒n, hassas bilgileri veritaban─▒nda saklad─▒─č─▒n─▒zda, d├╝z metin olarak saklamay─▒n, birden fazla do─črulama seviyesine sahip olun. Sadece eski enjeksiyon e─čilimli kodunuzu de─či┼čtirirseniz, iyi kod yazma yolunda WELL olacaks─▒n─▒z - ve bu ana kadar okudu─čunuz ve hala okudu─čunuz ger├že─či bana sadece bu tipte bir uygulama yapmamaya dair bir umut duygusu veriyor. web sitelerinizi ve uygulamalar─▒n─▒z─▒ yazarken kodun d─▒┼č─▒na ├ž─▒kacak, ancak d─▒┼čar─▒ ├ž─▒k─▒p biraz ├Ânce bahsetti─čim di─čer ┼čeyleri ara┼čt─▒rabilirsiniz - ve daha fazlas─▒. Zorlukla ├žal─▒┼čan en temel kodu de─čil, yazabilece─činiz en iyi kodu yaz─▒n.


63







MySQL uzant─▒s─▒ ├╝├ž├╝n├╝n en eskisidir ve geli┼čtiricilerin MySQL ile ileti┼čim kurmak i├žin kulland─▒klar─▒ orijinal yoldur. Hem PHP hem de MySQL'in yeni s├╝r├╝mlerinde yap─▒lan iyile┼čtirmeler nedeniyle, bu uzant─▒ ┼čimdi di─čer iki alternatif lehine kald─▒r─▒l─▒yor .http://php.net/manual/en/book.mysqli.php http://php.net/manual/en/book.pdo.php

  • MySQLi , MySQL veritabanlar─▒yla ├žal─▒┼čmak i├žin 'geli┼čtirilmi┼č' uzant─▒d─▒r. MySQL sunucusunun daha yeni s├╝r├╝mlerinde bulunan ├Âzelliklerden faydalan─▒r, geli┼čtiriciye hem i┼člev odakl─▒ hem de nesne y├Ânelimli bir aray├╝z sunar ve birka├ž ba┼čka g├╝zel ┼čey yapar.

  • PDO , daha ├Ânce ana veritaban─▒ eri┼čim uzant─▒lar─▒na, ├Ârne─čin MySQL, PostgreSQL, SQLite, MSSQL, vb. Yay─▒lm─▒┼č olan i┼člevlerin ├žo─čunu birle┼čtiren bir API sunar. Aray├╝z, programc─▒n─▒n veritaban─▒ ba─člant─▒lar─▒, sorgular─▒ ve sonu├ž k├╝meleri ve d├╝┼č├╝k seviye s├╝r├╝c├╝ler veritaban─▒ sunucusuyla ileti┼čim ve kaynak kullan─▒m─▒ ger├žekle┼čtirir. ├çok say─▒da tart─▒┼čma ve ├žal─▒┼čma PDO'ya giriyor ve modern, profesyonel kodda veritabanlar─▒yla ├žal─▒┼čman─▒n uygun y├Ântemi olarak kabul ediliyor.


32







├ľzetlemek gerekirse yukar─▒daki cevaplar─▒ ├žok uzun buluyorum:

MySQL uzant─▒s─▒n─▒n baz─▒ avantajlar─▒ vard─▒r, MySQL uzant─▒s─▒na g├Âre temel geli┼čtirmeler:

  • Nesneye y├Ânelik aray├╝z
  • Haz─▒rlanan Tablolara Destek
  • Birden Fazla ─░fade Deste─či
  • ─░┼člemler i├žin destek
  • Geli┼čmi┼č hata ay─▒klama yetenekleri
  • G├Âm├╝l├╝ sunucu deste─či

Kaynak: MySQLi genel bak─▒┼č


Yukar─▒daki cevaplarda a├ž─▒kland─▒─č─▒ gibi, mysql alternatifleri mysqli ve PDO'dur (PHP Data Objects).

  • API, sunucu taraf─▒nda Haz─▒rlanan ─░fadeleri destekler: MYSQLi ve PDO taraf─▒ndan desteklenir
  • API, m├╝┼čteri taraf─▒nda Haz─▒rlanan ─░fadeleri destekler: Yaln─▒zca PDO taraf─▒ndan desteklenir
  • API, Sakl─▒ ─░┼člemleri destekler: Hem MySQLi hem de PDO
  • API, ├çoklu Tablolar─▒ ve t├╝m MySQL 4.1+ i┼člevselli─čini destekler - MySQLi ve ├žo─čunlukla PDO taraf─▒ndan desteklenir

Hem MySQLi hem de PDO PHP 5.0'da tan─▒t─▒l─▒rken, MySQL PHP 3.0'dan ├Ânce tan─▒t─▒ld─▒. Unutulmamas─▒ gereken bir nokta, MySQL'in PHP5.x i├žerisine dahil edilmi┼č olmas─▒na ra─čmen sonraki s├╝r├╝mlerde kullan─▒mdan kald─▒r─▒lm─▒┼č olmas─▒d─▒r.


20







Hemen hemen t├╝m mysql_* fonksiyonlar─▒ mysqli veya PDO kullanarak tan─▒mlamak m├╝mk├╝nd├╝r . Onlar─▒ eski PHP uygulaman─▒z─▒n ├╝st├╝ne eklemeniz yeterlidir ve PHP7'de ├žal─▒┼čacakt─▒r. Benim ├ž├Âz├╝m├╝m burada .

 <?php

define('MYSQL_LINK', 'dbl');
$GLOBALS[MYSQL_LINK] = null;

function mysql_link($link=null) {
    return ($link === null) ? $GLOBALS[MYSQL_LINK] : $link;
}

function mysql_connect($host, $user, $pass) {
    $GLOBALS[MYSQL_LINK] = mysqli_connect($host, $user, $pass);
    return $GLOBALS[MYSQL_LINK];
}

function mysql_pconnect($host, $user, $pass) {
    return mysql_connect($host, $user, $pass);
}

function mysql_select_db($db, $link=null) {
    $link = mysql_link($link);
    return mysqli_select_db($link, $db);
}

function mysql_close($link=null) {
    $link = mysql_link($link);
    return mysqli_close($link);
}

function mysql_error($link=null) {
    $link = mysql_link($link);
    return mysqli_error($link);
}

function mysql_errno($link=null) {
    $link = mysql_link($link);
    return mysqli_errno($link);
}

function mysql_ping($link=null) {
    $link = mysql_link($link);
    return mysqli_ping($link);
}

function mysql_stat($link=null) {
    $link = mysql_link($link);
    return mysqli_stat($link);
}

function mysql_affected_rows($link=null) {
    $link = mysql_link($link);
    return mysqli_affected_rows($link);
}

function mysql_client_encoding($link=null) {
    $link = mysql_link($link);
    return mysqli_character_set_name($link);
}

function mysql_thread_id($link=null) {
    $link = mysql_link($link);
    return mysqli_thread_id($link);
}

function mysql_escape_string($string) {
    return mysql_real_escape_string($string);
}

function mysql_real_escape_string($string, $link=null) {
    $link = mysql_link($link);
    return mysqli_real_escape_string($link, $string);
}

function mysql_query($sql, $link=null) {
    $link = mysql_link($link);
    return mysqli_query($link, $sql);
}

function mysql_unbuffered_query($sql, $link=null) {
    $link = mysql_link($link);
    return mysqli_query($link, $sql, MYSQLI_USE_RESULT);
}

function mysql_set_charset($charset, $link=null){
    $link = mysql_link($link);
    return mysqli_set_charset($link, $charset);
}

function mysql_get_host_info($link=null) {
    $link = mysql_link($link);
    return mysqli_get_host_info($link);
}

function mysql_get_proto_info($link=null) {
    $link = mysql_link($link);
    return mysqli_get_proto_info($link);
}
function mysql_get_server_info($link=null) {
    $link = mysql_link($link);
    return mysqli_get_server_info($link);
}

function mysql_info($link=null) {
    $link = mysql_link($link);
    return mysqli_info($link);
}

function mysql_get_client_info() {
    $link = mysql_link();
    return mysqli_get_client_info($link);
}

function mysql_create_db($db, $link=null) {
    $link = mysql_link($link);
    $db = str_replace('`', '', mysqli_real_escape_string($link, $db));
    return mysqli_query($link, "CREATE DATABASE `$db`");
}

function mysql_drop_db($db, $link=null) {
    $link = mysql_link($link);
    $db = str_replace('`', '', mysqli_real_escape_string($link, $db));
    return mysqli_query($link, "DROP DATABASE `$db`");
}

function mysql_list_dbs($link=null) {
    $link = mysql_link($link);
    return mysqli_query($link, "SHOW DATABASES");
}

function mysql_list_fields($db, $table, $link=null) {
    $link = mysql_link($link);
    $db = str_replace('`', '', mysqli_real_escape_string($link, $db));
    $table = str_replace('`', '', mysqli_real_escape_string($link, $table));
    return mysqli_query($link, "SHOW COLUMNS FROM `$db`.`$table`");
}

function mysql_list_tables($db, $link=null) {
    $link = mysql_link($link);
    $db = str_replace('`', '', mysqli_real_escape_string($link, $db));
    return mysqli_query($link, "SHOW TABLES FROM `$db`");
}

function mysql_db_query($db, $sql, $link=null) {
    $link = mysql_link($link);
    mysqli_select_db($link, $db);
    return mysqli_query($link, $sql);
}

function mysql_fetch_row($qlink) {
    return mysqli_fetch_row($qlink);
}

function mysql_fetch_assoc($qlink) {
    return mysqli_fetch_assoc($qlink);
}

function mysql_fetch_array($qlink, $result=MYSQLI_BOTH) {
    return mysqli_fetch_array($qlink, $result);
}

function mysql_fetch_lengths($qlink) {
    return mysqli_fetch_lengths($qlink);
}

function mysql_insert_id($qlink) {
    return mysqli_insert_id($qlink);
}

function mysql_num_rows($qlink) {
    return mysqli_num_rows($qlink);
}

function mysql_num_fields($qlink) {
    return mysqli_num_fields($qlink);
}

function mysql_data_seek($qlink, $row) {
    return mysqli_data_seek($qlink, $row);
}

function mysql_field_seek($qlink, $offset) {
    return mysqli_field_seek($qlink, $offset);
}

function mysql_fetch_object($qlink, $class="stdClass", array $params=null) {
    return ($params === null)
        ? mysqli_fetch_object($qlink, $class)
        : mysqli_fetch_object($qlink, $class, $params);
}

function mysql_db_name($qlink, $row, $field='Database') {
    mysqli_data_seek($qlink, $row);
    $db = mysqli_fetch_assoc($qlink);
    return $db[$field];
}

function mysql_fetch_field($qlink, $offset=null) {
    if ($offset !== null)
        mysqli_field_seek($qlink, $offset);
    return mysqli_fetch_field($qlink);
}

function mysql_result($qlink, $offset, $field=0) {
    if ($offset !== null)
        mysqli_field_seek($qlink, $offset);
    $row = mysqli_fetch_array($qlink);
    return (!is_array($row) || !isset($row[$field]))
        ? false
        : $row[$field];
}

function mysql_field_len($qlink, $offset) {
    $field = mysqli_fetch_field_direct($qlink, $offset);
    return is_object($field) ? $field->length : false;
}

function mysql_field_name($qlink, $offset) {
    $field = mysqli_fetch_field_direct($qlink, $offset);
    if (!is_object($field))
        return false;
    return empty($field->orgname) ? $field->name : $field->orgname;
}

function mysql_field_table($qlink, $offset) {
    $field = mysqli_fetch_field_direct($qlink, $offset);
    if (!is_object($field))
        return false;
    return empty($field->orgtable) ? $field->table : $field->orgtable;
}

function mysql_field_type($qlink, $offset) {
    $field = mysqli_fetch_field_direct($qlink, $offset);
    return is_object($field) ? $field->type : false;
}

function mysql_free_result($qlink) {
    try {
        mysqli_free_result($qlink);
    } catch (Exception $e) {
        return false;
    }
    return true;
}
 

5







MySQL, PHP 5.5.0'da kullan─▒mdan kald─▒r─▒ld─▒ ve PHP 7.0.0'da kald─▒r─▒ld─▒. B├╝y├╝k ve eski bir uygulama i├žin, her bir i┼člevi aramak ve de─či┼čtirmek zordur.

Kod ├žal─▒┼čt─▒ran her biri i├žin bir sarmalay─▒c─▒ i┼člevi olu┼čturarak MySQL i┼člevlerini kullanabiliriz. Buraya TIKLAYIN


0







Buna benzer gibidir i┼člevler mysql_connect() , mysql_query() t├╝r├╝ art─▒k kullan─▒mda de─čil PHP yani (PHP 4) fonksiyonlar─▒ ve ├Ânceki s├╝r├╝m bulunmaktad─▒r.

Bunlar de─či┼čtirilir mysqli_connect() , mysqli_query() benzer son PHP5.

Hatan─▒n arkas─▒ndaki sebep budur.


-1







Bu, bug├╝n (Ocak 2019) eski bir sorudur, ancak bu hala faydal─▒ olabilir. Yakla┼č─▒k 7 y─▒l ├Ânce MySQL / MySQLi / PDO i┼člevselli─činin tablosal bir haritas─▒n─▒ ├ž─▒kard─▒m. Yararl─▒ bir referans olabilir. Burada ├ževrimi├ži ve a┼ča─č─▒da ├žo─čalt─▒lm─▒┼čt─▒r. HTML'yi kopyalay─▒p yap─▒┼čt─▒rmaktan ├žekinmeyin.

Pratik bir mesele olarak, prosed├╝rel MySQL i┼člevlerinin OOP'a d├Ân├╝┼čt├╝r├╝lmesinin en az diren├žli yol oldu─čunu buldum. ─░ki DB ba─člant─▒s─▒n─▒n ayn─▒ anda a├ž─▒k olmas─▒ son derece iyidir ve bu bize d├Ân├╝┼č├╝mlerde ├žal─▒┼čt─▒k├ža esneklik sa─člad─▒ - komut dosyalar─▒n─▒ her seferinde bir sorgu olarak bir par├ža par├ža baz─▒nda d├Ân├╝┼čt├╝rebilirdik. Bug├╝n bunu tavsiye etmeme ra─čmen, o zamanlar uygun de─čildi.

 <div class="container">

<h2>Mapping Obsolete MySQL Functions to Current PHP Extensions</h2>
<table>
<tr><th>MySQL Extension</th><th>MySQL<b><i>i</i></b></th><th>PDO</th></tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-affected-rows.php">mysql_affected_rows</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.affected-rows.php">mysqli::$affected_rows</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.rowcount.php">PDOStatement::rowCount</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-client-encoding.php">mysql_client_encoding</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.character-set-name.php">mysqli::character_set_name</a></td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-close.php">mysql_close</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.close.php">mysqli::close</a></td>
    <td>Assign NULL to PDO Object</td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-connect.php">mysql_connect</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.construct.php">mysqli::__construct</a></td>
    <td><a href="http://www.php.net/manual/en/pdo.construct.php">PDO::__construct</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-create-db.php">mysql_create_db</a></td>
    <td>Query: CREATE DATABASE</a></td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-data-seek.php">mysql_data_seek</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-stmt.data-seek.php">mysqli_stmt::data_seek</a></td>
    <td>PDO::FETCH_ORI_ABS (?)</td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-db-name.php">mysql_db_name</a></td>
    <td>Query: SELECT DATABASE()</td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-db-query.php">mysql_db_query</a></td>
    <td> </td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-drop-db.php">mysql_drop_db</a></td>
    <td>Query: DROP DATABASE</td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-errno.php">mysql_errno</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.errno.php">mysqli::$errno</a></td>
    <td><a href="http://www.php.net/manual/en/pdo.errorcode.php">PDO::errorCode</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-error.php">mysql_error</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.error-list.php">mysqli::$error_list</a></td>
    <td><a href="http://www.php.net/manual/en/pdo.errorinfo.php">PDO::errorInfo</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-escape-string.php">mysql_escape_string</a></td>
    <td> </td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-fetch-array.php">mysql_fetch_array</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-result.fetch-array.php">mysqli_result::fetch_array</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.fetch.php">PDOStatement::fetch</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-fetch-assoc.php">mysql_fetch_assoc</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-result.fetch-assoc.php">mysqli_result::fetch_assoc</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.fetch.php">PDOStatement::fetch</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-fetch-field.php">mysql_fetch_field</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-result.fetch-field.php">mysqli_result::fetch_field</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.getcolumnmeta.php">PDOStatement::getColumnMeta</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-fetch-lengths.php">mysql_fetch_lengths</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-result.lengths.php">mysqli_result::$lengths</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.getcolumnmeta.php">PDOStatement::getColumnMeta</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-fetch-object.php">mysql_fetch_object</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-result.fetch-object.php">mysqli_result::fetch_object</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.fetch.php">PDOStatement::fetch</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-fetch-row.php">mysql_fetch_row</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-result.fetch-row.php">mysqli_result::fetch_row</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.fetch.php">PDOStatement::fetch</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-field-flags.php">mysql_field_flags</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-result.fetch-fields.php">mysqli_result::fetch_fields</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.getcolumnmeta.php">PDOStatement::getColumnMeta</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-field-len.php">mysql_field_len</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php">mysqli_result::fetch_field_direct</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.getcolumnmeta.php">PDOStatement::getColumnMeta</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-field-name.php">mysql_field_name</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php">mysqli_result::fetch_field_direct</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.getcolumnmeta.php">PDOStatement::getColumnMeta</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-field-seek.php">mysql_field_seek</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-result.field-seek.php">mysqli_result::field_seek</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.fetch.php">PDOStatement::fetch</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-field-table.php">mysql_field_table</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php">mysqli_result::fetch_field_direct</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.getcolumnmeta.php">PDOStatement::getColumnMeta</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-field-type.php">mysql_field_type</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php">mysqli_result::fetch_field_direct</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.getcolumnmeta.php">PDOStatement::getColumnMeta</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-free-result.php">mysql_free_result</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-result.free.php">mysqli_result::free</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.closecursor.php">PDOStatement::closeCursor</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-get-client-info.php">mysql_get_client_info</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.get-client-info.php">mysqli::get_client_info</a></td>
    <td><a href="http://www.php.net/manual/en/pdo.getattribute.php">PDO::getAttribute</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-get-host-info.php">mysql_get_host_info</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.get-host-info.php">mysqli::$host_info</a></td>
    <td><a href="http://www.php.net/manual/en/pdo.getattribute.php">PDO::getAttribute</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-get-proto-info.php">mysql_get_proto_info</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.get-proto-info.php">mysqli::$protocol_version</a></td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-get-server-info.php">mysql_get_server_info</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.get-server-info.php">mysqli::$server_info</a></td>
    <td><a href="http://www.php.net/manual/en/pdo.getattribute.php">PDO::getAttribute</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-info.php">mysql_info</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.info.php">mysqli::$info</a></td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-insert-id.php">mysql_insert_id</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.insert-id.php">mysqli::$insert_id</a></td>
    <td><a href="http://www.php.net/manual/en/pdo.lastinsertid.php">PDO::lastInsertId</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-list-dbs.php">mysql_list_dbs</a></td>
    <td>Query: SHOW DATABASES</td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-list-fields.php">mysql_list_fields</a></td>
    <td>Query: SHOW COLUMNS</td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-list-processes.php">mysql_list_processes</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.thread-id.php">mysqli::$thread_id</a></td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-list-tables.php">mysql_list_tables</a></td>
    <td>Query: SHOW TABLES</td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-num-fields.php">mysql_num_fields</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.field-count.php">mysqli::$field_count</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.columncount.php">PDOStatement::columnCount</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-num-rows.php">mysql_num_rows</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli-stmt.num-rows.php">mysqli_stmt::$num_rows</a></td>
    <td><a href="http://www.php.net/manual/en/pdostatement.rowcount.php">PDOStatement::rowCount</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-pconnect.php">mysql_pconnect</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.construct.php">mysqli::__construct</a></td>
    <td><a href="http://www.php.net/manual/en/pdo.construct.php">PDO::__construct</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-ping.php">mysql_ping</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.ping.php">mysqli::ping</a></td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-query.php">mysql_query</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.query.php">mysqli::query</a></td>
    <td><a href="http://www.php.net/manual/en/pdo.query.php">PDO::query</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-real-escape-string.php">mysql_real_escape_string</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.real-escape-string.php">mysqli::real_escape_string</a></td>
    <td><a href="http://www.php.net/manual/en/pdo.quote.php">PDO::quote</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-result.php">mysql_result</a></td>
    <td>Combination</td>
    <td><a href="http://www.php.net/manual/en/pdostatement.fetchcolumn.php">PDOStatement::fetchColumn</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-select-db.php">mysql_select_db</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.send-query.php">mysqli::send_query</a></td>
    <td><a href="http://www.php.net/manual/en/pdo.construct.php">PDO::__construct</a></td></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-set-charset.php">mysql_set_charset</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.character-set-name.php">mysqli::character_set_name</a></td>
    <td><a href="http://www.php.net/manual/en/pdo.construct.php">PDO::__construct</a></td></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-stat.php">mysql_stat</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.stat.php">mysqli::stat</a></td>
    <td><a href="http://www.php.net/manual/en/pdo.getattribute.php">PDO::getAttribute</a></td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-tablename.php">mysql_tablename</a></td>
    <td>Query: SHOW TABLES</td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-thread-id.php">mysql_thread_id</a></td>
    <td><a href="http://www.php.net/manual/en/mysqli.thread-id.php">mysqli::$thread_id</a></td>
    <td> </td>
    </tr>
<tr><td><a href="http://www.php.net/manual/en/function.mysql-unbuffered-query.php">mysql_unbuffered_query</a></td>
    <td>See <a href="http://www.php.net/manual/en/mysqlinfo.concepts.buffering.php">Buffering Concepts</a></td>
    <td> </td>
    </tr>
</table>

</div><!-- container -->
 

-3







mysql_ * i┼člevleri daha iyi i┼člevler ve kod yap─▒lar─▒ geli┼čtirildi─či ger├že─činden dolay─▒ ( PHP 5.5'ten itibaren ) kullan─▒mdan kald─▒r─▒lm─▒┼čt─▒r . ─░┼člevin kullan─▒mdan kald─▒r─▒lm─▒┼č olmas─▒, performans ve g├╝venlik a├ž─▒s─▒ndan daha fazla ├žaba g├Âsterilmeyece─či anlam─▒na gelir , bu da gelecekteki kan─▒t─▒n daha az oldu─ču anlam─▒na gelir .

Daha fazla nedene ihtiyac─▒n─▒z varsa:

  • mysql_ * i┼člevleri haz─▒rlanm─▒┼č ifadeleri desteklemez.
  • mysql_ * fonksiyonlar─▒ parametrelerin ba─članmas─▒n─▒ desteklemez.
  • mysql_ * i┼člevleri Nesneye Y├Ânelik Programlama i├žin i┼člevselli─či yoktur.
  • liste devam ediyor ...

-9



─░lgili yay─▒nlar


startsWith () ve endsWith () PHP'de i┼člev g├Âr├╝r

PHP'de ┼×─░MD─░ () i┼člevi

Microsoft SQL Server 2005'te group_concat MySQL i┼člevini sim├╝le etmek?

PHP'de file_get_contents () i┼člevinin uyar─▒s─▒n─▒ nas─▒l kullanabilirim?

PHP'deki bir i┼člev i├žindeki i┼člev ad─▒n─▒ nas─▒l alabilirim?

PHP'de neden sprintf i┼člevi kullan─▒l─▒yor?

MySQL API'lerini PHP'de kar─▒┼čt─▒rabilir miyim?

PHP'de bir dil kurgusu ile ÔÇťyerle┼čikÔÇŁ bir i┼člev aras─▒ndaki fark nedir?

PHP'de MySQL tablonun son eklenen kimli─čini nas─▒l alabilirim?

PHP $ 5.4.0 ├Âncesi isimsiz bir fonksiyonda `$ this` kullan─▒m─▒

Etiketle ilgili di─čer sorular [php]


C# i├žindeki temel kurucuyu ├ža─č─▒rmak

JSONÔÇÖun JavaÔÇÖda ayr─▒┼čt─▒r─▒lmas─▒

Yay─▒nlanmam─▒┼č git taahh├╝tlerini nas─▒l silebilirim?

Terminali burada Mac OS bulucusunda a├ž─▒n [kapal─▒]

AngularJS'de ng-repeat ile tu┼člar ve de─čerler ├╝zerinde yineleme nas─▒l yap─▒l─▒r?

Bir Listeyi Java'daki Bir K├╝meye D├Ân├╝┼čt├╝rmenin En Kolay Yolu

JavaScript kullanarak resim boyutu (y├╝kseklik ve geni┼člik) nas─▒l al─▒n─▒r?

S├Âzl├╝klerin listesini pandalara d├Ân├╝┼čt├╝r├╝n DataFrame

Ng-if'ye kar┼č─▒l─▒k ne zaman ng-show / ng-hide?

Neden ConcurrentHashMapÔÇÖe kar┼č─▒ ConcurrentHashSet yok?