Domanda

Devo usare php PDO o mysql_connect normale per eseguire query sul database in PHP?

Quale è più veloce?

Uno dei grandi vantaggi del PDO è che l'interfaccia è coerente su più database. Ci sono anche alcune funzioni interessanti per le istruzioni preparate, che eliminano la seccatura di sfuggire a tutte le stringhe di query. La portabilità di DOP è maggiore di mysql_connect.

Quindi, dovrei usare DOP per quei motivi o attenermi al tradizionale mysql_connect?

È stato utile?

Soluzione

PDO è un po 'più lento di mysql_ * Ma ha una grande portabilità. PDO fornisce un'unica interfaccia su più database. Ciò significa che è possibile utilizzare più DB senza usare mysql_query per mysql, mssql_query per MS sql ecc. Basta usare qualcosa come $ db - & Gt; query (& Quot; INSERT INTO ... & Quot;) sempre . Indipendentemente dal driver DB che stai utilizzando.

Quindi, per progetti più grandi o portatili è preferibile il DOP. Anche il framework zend usa il DOP.

Altri suggerimenti

Alcuni tempi rapidi indicano che PDO è leggermente più veloce nella connessione.

$start = microtime(true);
for($i=0; $i<10000; ++$i) {

    try {
        $db = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage()."\n";
    }
    $db = null;
}

$pdotime = microtime(true) - $start;
echo "PDO time: ".$pdotime."\n";

$start = microtime(true);
for($i=0; $i<10000; ++$i) {
    $db = mysql_connect($host, $user, $password);
    if(!$db) {
        echo "Connection failed\n";
    }
    if(!mysql_select_db($schema, $db)) {
        echo "Error: ".mysql_error()."\n";
    }
    mysql_close($db);
}

$rawtime = microtime(true) - $start;
echo "Raw time: ".$rawtime."\n";

Fornisce risultati come

PDO time: 0.77983117103577
Raw time: 0.8918719291687

PDO time: 0.7866849899292
Raw time: 0.8954758644104

PDO time: 0.77420806884766
Raw time: 0.90708494186401

PDO time: 0.77484893798828
Raw time: 0.90069103240967

La differenza di velocità sarà comunque trascurabile; stabilire una connessione di rete richiederà probabilmente MOLTO più tempo di qualsiasi overhead sostenuto dal PDO, specialmente se il server mysql si trova su un altro host.

Hai menzionato tutti i motivi per utilizzare la DOP da solo. Davvero, non usare mai direttamente le funzioni mysql_ *, né usare PDO o alcuni altro libreria .

Non credo che la velocità sia ciò che le persone cercano quando usano la DOP - Non so se c'è una differenza, e sinceramente non mi interessa: fintanto che sto facendo un paio di query a un database durante la generazione di una pagina, un paio di millisecondi sul lato PHP non cambieranno nulla.

Ci sono due / tre grandi cose con il DOP, rispetto a mysql_* :

  • Interfaccia più o meno costante nei database; meglio che usare pg_*, oci_*, mysqli_*, ...
  • API orientata agli oggetti ( <=> ha un'API OO, ma non <=> )
  • Supporta nuove funzionalità di MySQL > = 4.1 (uguale a <=>, ma non <=>, di nuovo)

A proposito: generalmente sto usando il DOP - o " a mano " ;, oppure come è integrato in / usato da Zend Framework e / o Doctrine .


Come sidenote: anche se non si intende utilizzare DOP, si consiglia di utilizzare mysqli anziché mysql.

Vedi questa pagina del manuale PHP , a riguardo.

  • Con PDO è possibile utilizzare parametri associati e ciò impedirà la maggior parte degli attacchi di iniezione sql.
  • Puoi ottenere più velocità usando le istruzioni preparate DOP.
  • interfaccia standard per tutti i backend db
  • Esistono molti metodi utili (come la famiglia fetch *)

Ho eseguito alcuni test delle prestazioni per confrontare le funzioni Mysqli con le funzioni PDO utilizzando sia le istruzioni preparate che le query dirette regolari (testato utilizzando le istruzioni selezionate sulle tabelle Mysqlnd e MyISAM).

Ho scoperto che le query PDO sono solo leggermente più lente di Mysqli, ma solo leggermente. Ciò ha senso dal momento che il PDO utilizzato a tale scopo è principalmente un wrapper che chiama le funzioni Mysqli. Il vantaggio dell'utilizzo di PDO è che semplifica leggermente la migrazione a un database diverso perché i nomi delle funzioni non sono specifici di MySQL.

La vera differenza di prestazioni sta nel fatto che tu usi query preparate. C'è una grande e significativa prestazione penalità nell'uso di query preparate. Altre persone che li hanno testati hanno trovato gli stessi risultati.

L'unica volta che le query preparate sono più veloci è se si sta preparando una query una volta e quindi la si invia migliaia di volte con valori di dati diversi. Altrimenti, è sempre più veloce usare mysqli :: query () o PDO :: query (). Ma è importante essere consapevoli del fatto che quelle funzioni non sfuggono ai valori dei dati per te, quindi devi ricordare di usare mysqli :: real_ escape_ string () o PDO :: quote () sulle variabili di dati.

In genere consiglierei di usare il DOP a meno che non ci sia un motivo specifico che non puoi. Se non c'è poca differenza tra i due e non hai motivo di non usare PDO, credo che sarebbe meglio entrare nella pratica di usare l'astrazione di DB nelle tue applicazioni che andare con mysql_ * semplicemente perché è lì. Direi che vinca la migliore pratica.

In entrambi i casi, si chiama lo stesso server mySQL dallo stesso server Php ... quindi non si nota molta differenza.

Se vuoi buone prestazioni, pensa alla cache (memcache o semplice file Php ...) e crea una buona struttura di base di dati (INDICE ...)

  • DOP è meglio di SQl
  • DOP e la sua dichiarazione Preparare forniscono il miglior codice sicuro contro l'iniezione SQL
  • DOP è orientato agli oggetti;)
  • PDO è compatibile con alcuni motori di database come spiegato prima
  • MySQLl_ * È obsoleto e verrà rimosso presto
  • PDO offre più funzionalità con meno righe di codice Esempio:

    Dop

    1. Connetti
    2. Cerca " < " E & Quot; & Gt; & Quot; E & Quot; # & Quot; (Questo controllo per usi globali)
    3. Prepara
    4. Esegui
    5. Chiudi

MySQL _ *

  1. Connetti
  2. Aggiungi barra rovesciata
  3. Xsafe
  4. Cerca " < " E & Quot; & Gt; & Quot; E & Quot; # & Quot; (Questo controllo per usi globali)
  5. Query
  6. Chiudi

entrambe le stesse funzionalità ma si confronta per i codici DOP è più umanamente leggibile :) Quindi cosa pensi?

Se le prestazioni non sono un " problema reale " per te, dovresti usare DOP. Le prestazioni differiscono per piccoli margini e PDO ha un'interfaccia cross-database molto bella e portatile che può farti venire il mal di testa nel caso in cui sia necessario utilizzare diversi driver di database.

La funzione mysql_connect è obsoleta a partire da PHP 5.5.0 e, come con la maggior parte delle funzionalità deprecate, verrà rimossa. Pertanto, preferisci utilizzare PDO_MySQL (o un'altra alternativa MySQLi ) oltre <=>.

Fonte: http://php.net/manual/en/function. mysql-connect.php

Alcuni vantaggi del DOP:

  1. Può accedere a più database.
  2. Fornito molti driver di database per la connessione con diversi database diversi.
  3. Quando si passa da un database a un altro database, non è necessario scrivere tutto il codice per connettersi con un nuovo database, è sufficiente modificare la stringa di connessione e alcune query necessarie per il nuovo database.
  4. Fornisce istruzioni di preparazione che è una sorta di modello di query che è stato compilato una sola volta e può essere eseguito tutte le volte che vuoi, semplicemente cambiando gli attributi che si chiamano segnaposto.
  5. Operazioni generali facili ed efficienti come: inserire, aggiornare ... ecc.

Codice di connessione al database PDO:

<?php
$dbhost = 'localhost';
$dbname = 'clsrepair';
$dbuser = 'root';
$dbpass = '';

try {
    $db = new PDO("mysql:host={$dbhost};dbname={$dbname}",$dbuser,$dbpass);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

catch(PDOException $e) {
    echo "Connection error: ".$e->getMessage();
}
?>

Codice di connessione normale al database MySQL:

<?php 
mysql_connect("localhost","root", "");
mysql_select_db ("clsrepair");
?>

o

 <?php
$dbHost = 'localhost'; // usually localhost
$dbUsername = 'root';
$dbPassword = '';
$dbDatabase = 'clsrepair';
$db = mysql_connect($dbHost, $dbUsername, $dbPassword) or die ("Unable to connect to Database Server.");
mysql_select_db ($dbDatabase, $db) or die ("Could not select database.");
?>

Codice di connessione al database MySQL facile ma PDO ha molti vantaggi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top