2009-09-25 20 views
51

Forse è una domanda ovvia, ma voglio essere sicuro.Come sapere se MySQL è il driver attivo?

Come posso sapere se MySQL è il driver attivo?

Sto eseguendo PHP 5.3 e MySQL 5.1.37. In phpinfo() mysqlnd è elencato, ma solo con questo non posso essere sicuro se sto usando MySQLnd o il vecchio driver ...

Estratto di phpinfo() Uscita

mysql 
MySQL Support enabled 
Active Persistent Links  0 
Active Links 0 
Client API version mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $ 

mysqli 
MysqlI Support enabled 
Client API library version mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $ 
Active Persistent Links  0 
Inactive Persistent Links 0 
Active Links 26 

mysqlnd 
mysqlnd enabled 
Version  mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $ 

PDO 
PDO support enabled 
PDO drivers  mysql 

pdo_mysql 
PDO Driver for MySQL enabled 
Client API version mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $ 

I' m usando PDO, e driver PDO dice mysql ...

+1

Sì riga "DOP piloti", dice "mysql", ma al di sotto che dice "la versione Client API ** ** mysqlnd 5.0.5- dev - 081106 - $ Revision: 1.3.2.27 $ "........ – Pacerier

risposta

54

Questo dovrebbe fare il trucco:

<?php 
$mysqlnd = function_exists('mysqli_fetch_all'); 

if ($mysqlnd) { 
    echo 'mysqlnd enabled!'; 
} 

Per rilevare se il conducente attiva DOP, creare l'oggetto MySQL DOP poi:

if (strpos($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), 'mysqlnd') !== false) { 
    echo 'PDO MySQLnd enabled!'; 
} 
+0

Grazie. Infine alcuni Peace of Mind –

+2

Sembra che sto avendo un problema simile e quando provo a usare la funzione getAttribute ottengo questo errore: Chiama una funzione membro 'getAttribute()' su un non oggetto. Sembra che mysqlnd sia abilitato ma non posso nemmeno usare 'get_result()', qualche idea? –

+0

Questa funzione non è abbastanza robusta dato che darà un falso negativo se 'mysqli' stesso non è nemmeno disponibile. Vedi http://stackoverflow.com/a/22499259/632951 per una versione migliore. – Pacerier

8

Il driver (libmysql o mysqlnd) viene scelto in fase di compilazione, e ognuno di questi due può essere specificato in modo indipendente per mysql, mysqli e pdo_mysql.

Qui ci sono le tre opzioni di configurazione che corrispondono a mysqlnd:

--with-mysql[=DIR]  Include MySQL support. DIR is the MySQL base 
          directory. If mysqlnd is passed as DIR, 
          the MySQL native driver will be used [/usr/local] 
    --with-mysqli[=FILE] Include MySQLi support. FILE is the path 
          to mysql_config. If mysqlnd is passed as FILE, 
          the MySQL native driver will be used [mysql_config] 
    --with-pdo-mysql[=DIR] PDO: MySQL support. DIR is the MySQL base directoy 
           If mysqlnd is passed as DIR, the MySQL native 
           native driver will be used [/usr/local] 


Nel vostro caso, la "versione Client API" è "mysqlnd 5.0.5-dev" sia per mysql, mysqli, e pdo_mysql.

Quindi sembra che tu stia usando mysqlnd in entrambi i casi.

Nel caso di PDO, il driver MySQL è installato e quello compilato in base a mysqlnd.

+1

Scusa, non ho capito la tua ultima frase. "Il driver MySQL installato - e quello è compilato sulla base di mysqlnd." Significa che sta usando mysqlnd o no? BTW Sto ussing debian, non voglio compilare e perdere la possibilità di usare apt-get –

+0

PDO sta usando "drivers": uno per SQLite, uno per Postgre, uno per mssql, uno per MySQL, .. E, per MySQL, quel driver può essere compilato per usare libmysql o mysqlnd ;; nel tuo caso, si dice "mysqlnd" –

+0

@PascalMARTIN, stai dicendo che il valore alla destra della chiave 'driver PDO' (nel suo output phpinfo) non può mai essere ** mysqli ** e può essere solo ** mysql ** (, postgre, sqllite, ecc.)? – Pacerier

2

Forse verificare se these settings esiste? phpinfo() li rende diversi dagli altri ini per qualche motivo. Funziona per 5.4, non sono sicuro di 5.3.

ini_get('mysqlnd.debug') !== false 
26

Controllo per mysqli_fetch_all non davvero descrivere wether si utilizza mysqlnd. Piuttosto, dice che hai il mysqli extension abilitato.

MySQLi è semplicemente una versione aggiornata dell'estensione mysql fornita nelle versioni precedenti di PHP.

The mysql extension, the mysqli extension and the PDO MySQL driver can each be individually configured to use either libmysqlclient or mysqlnd

Questo codice:

<?php 
$mysqlnd = function_exists('mysqli_fetch_all'); 

if ($mysqlnd) { 
    echo 'mysqlnd enabled!'; 
} 

non facendo eco nulla suggerisce che non si dispone di mysqli compilato/abilitati/installati, e potrebbero utilizzare l'estensione più vecchio mysql.

Un modo migliore per verificare la presenza di mysqli con mysqlnd vs mysql con libmysqlclient è quello di fare questo:

<?php 
if (function_exists('mysql_connect')) { 
    echo "- MySQL <b>is installed</b>.<br>"; 
} else { 
    echo "- MySQL <b>is not</b> installed.<br>"; 
} 

if (function_exists('mysqli_connect')) { 
    echo "- MySQLi <b>is installed</b>.<br>"; 
} else { 
    echo "- MySQLi <b>is not installed</b>.<br>"; 
} 

if (function_exists('mysqli_get_client_stats')) { 
    echo "- MySQLnd driver is being used.<br>"; 
} else { 
    echo "- libmysqlclient driver is being used.<br>"; 
} 

Questo funziona perché mysqlnd provides three additional functions that work only when mysqlnd is used as the driver.

Infine, il controllo PDO deve avere la variabile $pdo definita per prima.

$dbHost = "localhost"; 
$dbUser = "root"; 
$dbPass = "password"; 
$dbName = "database"; 

$pdo = new PDO('mysql:host='.$dbHost.';dbname='.$dbName, $dbUser, $dbPass); 
if (strpos($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), 'mysqlnd') !== false) { 
    echo '- PDO MySQLnd <b>is enabled</b>.<br>'; 
} else { 
    echo '- PDO MySQLnd <b>is not enabled</b>.<br>'; 
} 
?> 
+0

Variabile non definita: frase in C: \ Dev \ Billing \ checkmysqlnd.php sulla riga 8 .. o è necessario mettere '$ sentence =" "' in alto o avere il primo 'if/else' modificato da'. = 'A '=' .. funziona ancora getta quell'errore –

+0

Grazie @ J-Dizzle. questo è risolto ora :) – timgws

+0

Questo ha funzionato perfettamente grazie! Miglioramento della formattazione :) – emotality

7

questo è quello che cercavo

<?php 
if (extension_loaded('mysqlnd')) { 
} 
?> 
+0

'mysqlnd' potrebbe essere caricato e non essere usato da mysql (i)/pdo_mysql – Artefacto

Problemi correlati