În locul nostru ne-am're împărțit între utilizarea mysqli și DOP pentru chestii de genul declarații pregătite și asistență în tranzacții. Unele proiecte folosesc unul, unele de alte. Nu este puțin realiste probabilitatea de a ne trece la un alt RDBMS.
Prefer DOP pentru un singur motiv pentru care vă permite numit parametri pentru declarații pregătite, și cât de departe sunt conștient mysqli nu.
Sunt acolo orice alte argumente pro și contra pentru alegerea unul peste celălalt ca un standard ca ne consolida proiectele noastre pentru a utiliza doar o singură abordare?
Ei bine, ai putea argumenta cu orientata obiect aspect, declarații pregătite, faptul că aceasta devine un standard, etc. Dar știu că cele mai multe din timp, pentru a convinge pe cineva lucrează mai bine cu o caracteristică criminal. Deci, aici este:
Un lucru foarte frumos cu DOP este de a putea prelua datele, injectând-o în mod automat într-un obiect. Dacă tu nu't doriți să utilizați un ORM (pentru că's doar o rapidă script) dar te faci ca obiect de cartografiere, l's FOARTE misto :
class Student {
public $id;
public $first_name;
public $last_name
public function getFullName() {
return $this->first_name.' '.$this->last_name
}
}
try
{
$dbh = new PDO("mysql:host=$hostname;dbname=school", $username, $password)
$stmt = $dbh->query("SELECT * FROM students");
/* MAGIC HAPPENS HERE */
$stmt->setFetchMode(PDO::FETCH_INTO, new Student);
foreach($stmt as $student)
{
echo $student->getFullName().'<br />';
}
$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}
Mutarea unei aplicații la o bază de date în alt e't foarte frecvente, dar mai devreme sau mai târziu te-ai putea găsi de lucru pe un alt proiect, folosind un alt RDBMS. Daca're la domiciliu cu DOP atunci nu va fi de cel puțin un singur lucru mai puțin să învețe de la acest punct.
În afară de faptul că am găsi DOP API un pic mai intuitiv, și se simte cu adevărat orientate obiect. mysqli se simte ca este doar o procedură API care a fost obiectivat, dacă știi ce vreau să spun. Pe scurt, am găsi DOP mai ușor de a lucra cu, dar asta este, desigur, subiective.
Am'am inceput sa folosesc DOP pentru că declarația de sprijin este mai bine, în opinia mea. Am'm, folosind un ActiveRecord-esque de date-access layer, și-l's mult mai ușor să pună în aplicare în mod dinamic generat declarații. MySQLi's parametru obligatoriu trebuie să fie făcut într-o singură funcție/apel metoda, deci, dacă nu't știu până la execuție cât mai mulți parametri ai'd cum de a lega, te're obligați să utilizeze call_user_func_array()
(I cred că's dreptul de nume de funcție) pentru a selecta. Și uita de simplu dinamic rezultat obligatorii.
Cele mai multe dintre toate, îmi place DOP pentru că's un foarte rezonabil nivel de abstractizare. L's ușor să-l folosească în complet captate sisteme în cazul în care nu't doriți să scrie SQL, dar, de asemenea, îl face ușor de utilizat o mai optimizat, pur interogare tip de sistem, sau să se amestecă-și-meci de două.
DOP este standard, l's de ce majoritatea dezvoltatorilor vor aștepta să o utilizați. mysqli a fost, în esență, o soluție personalizată pentru o anumită problemă, dar are toate problemele din alte baze de date specifice bibliotecilor. DOP este în cazul în care toate greu de lucru și de gândire inteligent va merge.
Aici's ceva de a păstra în minte: De acum (PHP 5.2) DOP biblioteca este buggy. L's plin de bug-uri ciudate. De exemplu: înainte de a depozita o PDOStatement
într-o variabilă, variabila ar trebui să fie unset()
pentru a evita o tona de bug-uri. Cele mai multe dintre acestea au fost fixate în PHP 5.3 și le va fi lansat la începutul anului 2009 în PHP 5.3, care va avea, probabil, multe alte bug-uri. Ar trebui să se concentreze pe utilizarea DOP pentru PHP 6.1 dacă doriți o versiune stabilă și folosind DOP pentru PHP 5.3, dacă doriți pentru a ajuta comunitatea.
Un alt notabil (de bine) despre diferența DOP este ca's PDO::quote()
metoda adaugă automat la inchiderea citate, întrucât mysqli::real_escape_string()
(și similitudinii) don't:
DOP::quote() locurile citate în jurul șir de intrare (dacă este necesar) și scapă caractere speciale în șirul de intrare, folosind o referire stil adecvat de fond al sistemului driver.
DOP va face mult mai ușor de scară dacă site-ul/web app devine într-adevăr a fi ca tine poate de zi cu zi a înființat Master și slave conexiuni pentru a distribui sarcina pe baza de date, plus PHP se îndreaptă spre trecerea la DOP ca un standard.
În sens de viteza de executie MySQLi victorii, dar daca nu ai un înveliș folosind MySQLi, funcțiile sale de-a face cu declarații pregătite sunt groaznice.
Există încă bug-uri într-a mea, dar daca cineva vrea, aici este.
Deci, pe scurt, dacă sunteți în căutarea pentru un pic de câștig, atunci MySQLi; dacă vrei ușurința de utilizare, atunci DOP.
Editat de răspuns.
După ce au ceva experienta cu ambele aceste Api-uri, aș spune că există 2 nivel de blocare caracteristici care face mysqli inutilizabil cu nativ declarații pregătite. Au fost deja menționate în 2 excelent (încă subestimate) răspunsuri:
(ambele, de asemenea, menționat în acest răspuns)
Pentru unii motiv mysqli nu a reușit cu ambele. În zilele noastre, acesta are unele îmbunătățiri pentru cea de-a doua (get_result), dar funcționează numai pe mysqlnd instalații, înseamnă că poate't se bazează pe această funcție în scripturi.
Încă nu't au bind-de-valoare, chiar la această zi.
Deci, există doar o singură alegere: DOP
Toate celelalte motive, cum ar fi
nume de înlocuitori (această sintaxă de zahăr este supraestimată)
nu't de orice importanță semnificativă.
În același timp, ambele aceste Api-uri nu are unele foarte important caracteristici**, ca
Deci, pentru a acoperi real nevoile vieții, o au de a crea propria lor de abstractizare bibliotecă, bazate pe unul din aceste Api-uri, manual de punere în aplicare analizat substituenți. În acest caz, am'd prefera mysqli, pentru că are nivel redus de abstractizare.
Eu personal folosesc DOP, dar cred că este în principal o chestiune de preferinta.
DOP are unele caracteristici care ajuta impotriva SQL injection (declarație), dar dacă ești atent cu SQL se poate atinge cu mysqli, de asemenea.
Trecerea la altă bază de date nu este atât de mult un motiv pentru a utiliza DOP. Atâta timp cât nu't de a folosi "speciale SQL caracteristici", puteți trece de la un DB la altul. Cu toate acestea, cât mai curând ca ai folosi, de exemplu, "SELECTAȚI ... LIMITA de 1" nu poate't du-te la MS-SQL unde este "SELECT TOP 1 ...". Deci, acest lucru este problematic, oricum.
În referință script, fiecare metodă este testat de 10000 de ori și diferența dintre timpul total pentru fiecare metodă este imprimat. Ar trebui acest lucru pe propria configurație, am'sunt sigur că rezultatele vor varia!
Acestea sunt rezultatele mele:
ARATĂ TABELUL de STARE" -> mysqli()
mai repede de ~ 2.3 secundeSELECT * FROM utilizatori" -> mysqli()
mai repede de ~ 33 de secundeNotă: prin utilizarea ->fetch_row() pentru mysqli, coloana nume nu sunt adăugate la matrice, am't găsi o modalitate de a face asta în PG. Dar chiar dacă am folosi ->fetch_array() , mysqli este puțin mai lent, dar încă mai repede decât PG (cu excepția SELECTAȚI NULL).
Un lucru DOP are MySQLi nu't că îmi place foarte mult este DOP's capacitatea de a returna un rezultat ca un obiect de un anumit tip clasă (de exemplu, $dop->fetchObject('MyClass')
). MySQLi's fetch_object () va returna doar o
stdClass` obiect.
Nu's un lucru de a păstra în minte.
Mysqli nu are suport fetch_assoc() funcție care va returna coloane cu cheile reprezentând coloana nume. Desigur, l's posibil pentru a scrie propriile funcții pentru a face asta, l's nu chiar foarte mult, dar am avut *într-adevăr *** timp de greu de scris (pentru non-credincioși: dacă pare ușor pentru tine, încercați să-l pe cont propriu de ceva timp și don't ieftin :) )