PHP Unconference Europe 2015

Considérations sur les bases de données

Cette section traite de questions relatives aux relations entre PHP et les bases de données. Oui, PHP peut accéder virtuellement à n'importe quelle base de données disponible aujourd'hui.

J'ai entendu dire qu'il était possible d'accéder à Microsoft SQL Server à partir de PHP. Comment est-ce possible ?

Sur une machine Windows, vous pouvez tout simplement utiliser le support ODBC inclus avec le pilote ODBC adéquat.

Sur des machines Unix, vous pouvez utiliser le pilote Sybase-CT pour accéder à Microsoft SQL Server car il est (en grande partie) compatible. Sybase a fourni une » version libre des bibliothèques nécessaires pour Linux. Pour les autres systèmes Unix, vous devez contacter Sybase pour obtenir les bibliothèques adéquates. Jetez aussi un oeil à la réponse à la question suivante.

Puis-je accéder à des bases Microsoft Access ?

Oui. Vous avez déjà tous les outils nécessaires si vous utilisez uniquement Windows 9x/Me, ou NT/2000, et que vous utilisez ODBC avec les pilotes ODBC pour Microsoft Access.

Si vous utilisez PHP sur une machine Unix et que vous voulez vous connecter à une base Access sur une machine Windows, vous aurez besoin des pilotes ODBC Unix. » OpenLink Software fournit des pilotes ODBC pour Unix qui peuvent le faire.

Une autre solution consiste à utiliser un serveur SQL qui a des pilotes ODBC Windows et l'utiliser pour stocker les données, que vous pouvez utiliser à partir de Microsoft Access (en utilisant ODBC) et PHP (en utilisant les pilotes inclus), ou bien utiliser un format de fichier intermédiaire que Access et PHP peuvent traiter tous les deux, comme des fichier bruts ou des bases de données dBase. À ce sujet, Tim Hayes de Openlink software écrit :

Utiliser une autre base de données comme intermédiaire n'est pas une bonne idée lorsque vous pouvez utiliser ODBC de PHP directement vers vos bases de données - par exemple avec les pilotes Openlink. Si vous avez besoin d'un format de fichier intermédiaire, Openlink a publié Virtuoso (un moteur de base de données virtuel) pour NT, Linux et d'autres plates-formes Unix. Visitez notre » site pour un téléchargement gratuit.

Une solution qui a fait ses preuves est d'utiliser MySQL et ses pilotes ODBC sous Windows et de synchroniser les bases de données. Steve Lawrence écrit :

  • Installez MySQL sur votre plate-forme conformément aux instructions de MySQL. Vous pouvez l'obtenir sur » http://www.mysql.com/. Aucune configuration particulière n'est nécessaire, mis à part que lorsque vous configurez une base de données et un compte utilisateur, il faille spécifier % dans le champ host, ou bien le nom de la machine Windows avec laquelle vous voulez accéder à MySQL. Notez bien votre nom de serveur, d'utilisateur et votre mot de passe.
  • Téléchargez les pilotes MyODBC pour Windows à partir du site de MySQL. Installez les sur votre machine Windows. Vous pouvez tester votre installation avec les utilitaires fournis avec les pilotes.
  • Créez un utilisateur ou une source de données système dans votre administration ODBC, dans le panneau de configuration. Donnez un nom de source de données dsn, entrez votre nom d'hôte, identifiant, mot de passe, port, etc. pour la base de données configurée à l'étape 1.
  • Installez Access avec une installation complète pour être sûr d'avoir tous les composants nécessaires... Vous aurez besoin d'au moins le support ODBC et le gestionnaire de tables liées.
  • Maintenant, la partie amusante ! Créez un accès à une base de données. Dans la fenêtre de la table, cliquez droit et sélectionner Lier les Tables, ou, dans le menu Fichier, sélectionnez Obtenir des données externes et alors Lier les Tables. Quand la fenêtre de gestion de fichiers apparaît, sélectionnez les fichiers de type : ODBC. Sélectionnez dsn Système et le nom de votre dsn créée à l'étape 3. Sélectionnez la table à lier, cliquez sur OK, et voilà ! Vous pouvez maintenant ouvrir la table et ajouter/supprimer/éditer des données sur votre serveur MySQL ! Vous pouvez ainsi exécuter des requêtes, importer/exporter des tables vers MySQL, construire des formulaires et des rapports, etc.

Trucs et astuces :

  • Vous pouvez construire vos tables dans Access et les exporter dans MySQL, puis les lier de nouveau. Cela rend la création de table très rapide.
  • Lorsque vous créez des tables dans Access, vous devez avoir une clé primaire définie pour avoir accès en écriture à la table. Assurez-vous que vous avez bien créé une clé primaire dans MySQL avant de lier le tout à Access.
  • Si vous changez une table dans MySQL, vous devez la lier de nouveau à Access. Allez dans Outils>suppléments>gestionnaire de tables liées, cherchez votre DSN ODBC, et sélectionnez la table à lier de nouveau. Vous pouvez aussi changer votre source dsn à partir de là, en cliquant sur l'option toujours demander pour un nouvel emplacement avant de presser OK.

Pourquoi m'encourage-t-on à ne plus utiliser l'extension MySQL (ext/mysql) que j'utilise depuis 10 ans ? Est-elle obsolète ? Que dois-je utiliser à la place ? Comment dois-je migrer ?

Il y a 3 extensions MySQL, tel que décrit dans la section Choisir une API MySQL. L'ancienne API ne doit plus être utilisée, et un jour, elle devriendra obsolète et, éventuellement, sera supprimée de PHP. C'est une extension populaire, aussi, ce sera un long processus, mais vous être vivement encouragé à écrire vos nouvelles lignes de code en utilisant l'extension mysqli ou PDO_MySQL.

Les scripts de migration ne sont pas disponibles actuellement, bien que l'API mysqli contient à la fois une API procédurale et orientée objet, dont la version procédurale est très similaire à ext/mysql.

Il n'est pas possible de mixer les extensions. Aussi, par exemple, le fait de passer une connexion mysqli à PDO_MySQL ou ext/mysql ne fonctionnera pas.

PHP 5 n'inclut plus les bibliothèques clientes MySQL, qu'est ce que ça implique pour moi ? Puis-je toujours utiliser MySQL avec PHP ? J'essaie d'utiliser MySQL, mais j'obtiens des erreurs "undefined function".

Oui. PHP supportera toujours MySQL, d'une façon ou d'une autre. Le seul changement avec PHP 5 est que nous ne compilons plus la bibliothèque cliente en elle-même. En voici en vrac quelques justifications :

  • La plupart des systèmes incluent maintenant les bibliothèques clientes.

  • Ainsi, avoir plusieurs versions des bibliothèques peut être gênant. Par exemple, si vous liez mod_auth_mysql à une version et PHP à une autre, et que vous les activez tous les deux dans Apache, vous obtenez un joli plantage. Ainsi, la bibliothèque cliente incluse avec PHP ne fonctionnait pas toujours bien. Le symptôme le plus gênant était que le chemin vers le socket Unix mysql.sock n'était pas le bon.

  • La maintenance en était lourde et le devenait de plus en plus au fur et à mesure des versions.

  • Les versions futures de la bibliothèque seront publiées sous licence GPL et nous ne pouvons pas inclure une telle bibliothèque car sa licence n'est pas compatible avec un projet sous licence de type BSD/Apache. Un tel changement dans PHP 5 semble être la meilleure solution.

Ceci n'affectera pas tant que ça les utilisateurs. Les utilisateurs d'Unix, au moins ceux qui savent ce qu'ils font, ont tendance à compiler PHP avec les bibliothèques déjà installées sur leur système, simplement en spécifiant --with-mysql=/usr lors de la configuration de PHP. Les utilisateurs de Windows peuvent activer l'extension php_mysql.dll dans leur php.ini. Pour plus de détails, lisez la référence MySQL sur les instructions d'installation. Assurez-vous également que libmysql.dll est disponible dans le PATH du système. Pour plus de détails sur cela, lisez la FAQ sur la configuration du PATH sur les systèmes Windows. Comme libmysql.dll (et plusieurs fichiers relatifs à PHP) existe dans le dossier de PHP, il est recommandé d'ajouter le dossier de PHP à votre PATH système.

Après avoir ajouté le support partagé de MySQL, Apache plante dès que libphp4.so est chargé. Comment résoudre ce problème ?

Ceci arrive quand vos bibliothèques MySQL sont liées à pthreads. Vérifiez en utilisant ldd. Sinon, téléchargez les sources de MySQL et compilez-les ou bien refaites un paquet RPM à partir des sources en enlevant l'option qui active le client threadé dans le fichier de spec. L'une ou l'autre de ces solutions corrigera le problème. Recompilez alors PHP avec les nouvelles bibliothèques MySQL.

Pourquoi est ce que j'obtiens une erreur comme celle-ci : "Warning: 0 is not a MySQL result index in <file> on line <x>" ou "Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>" ?

Vous essayez d'utiliser un identifiant de résultat qui vaut 0. Le 0 indique que votre requête a échoué pour une quelconque raison. Vous devez alors chercher les erreurs après avoir exécuté une requête et avant même de vouloir traiter le résultat. Une façon propre de le faire est de coder comme ceci :

<?php

$result 
mysql_query("SELECT * FROM tables_priv");
if (!
$result) {
    echo 
mysql_error();
    exit;
}
?>
ou
<?php

$result 
mysql_query("SELECT * FROM tables_priv")
    or die(
"Bad query: " mysql_error());
?>

add a note add a note

User Contributed Notes 5 notes

up
3
knb at gfz-potsdam dot de
10 years ago
This is a crucial piece of information for SYBASE users:

If you are using the free, but old, 11.x client libs from sybase,
then compile with option  "--with-sybase-ct=$SYBASE"
substitute $SYBASE with the appropriate directory name.

option --with-sybase (without ct) can somehow be used to talk to old MS-SQL servers, but only with the 11.x client libs.

If you are using free, or have legally obtained, 12.x client libs from sybase, then compile with option  "--with-sybase-ct=$SYBASE/$SYBASE_OCS"
substitute $SYBASE/$SYBASE_OCS with the appropriate directory name.
up
0
plandis98 at yahoo dot com
8 years ago
If one is using PHP on Windows to connection to MS SQL Server and does not want to pass credentials via the mssql_connect but instead use MS Connectionless NT Authentication, what is the proper syntax/usage? 

I believe you want to turn on secure_connection in php.ini file:
; Use NT authentication when connecting to the server
mssql.secure_connection = On
up
0
djlopez at gmx dot de
9 years ago
How to compile PHP5 when you have installed mysql, but
- you can't find the "mysql header files" or
- get this error: Cannot find MySQL header files under /usr/

If you want to use mysql 4.0 (*not* 4.1 or even higher!) just download & extract the latest mysql4.0 binary distribution to e.g.
/root/mysql40/

but don't start it (it even should not work, if you have a mysql server already running)

Then use --with-mysql=/root/mysql4 within your php5 configuration.

After compiling/installing (make, make install), you may delete the /root/mysql40/ directory, or keep it for later versions of php5.
up
-1
Anonymous
9 years ago
Just a quick note which may help Windows users setting up PHP/Apache/MySQL.  I was receiving these two error messages on Apache startup: 1) "The procedure entry point mysql_thread_end could not be located in the dynamic link library LIBMYSQL.dll" and 2) "PHP Startup: Unable to load dynamic library '<my php installation dir>/ext/php_mysql.dll' - The specified procedure could not be found".  After checking that libmysql.dll did exist in my root PHP install dir, and that this dir was in my path, I determined that the problem was an older version of libmysql.dll.  My solution was to search all harddrives for this file (I found 6 copies of 5 different versions), and rename all of them except my PHP install dir copy.  PHP, Apache and MySQL all function as expected after making this change.
up
-4
ashay dot chaudhary at microsoft dot com
4 years ago
Q: I heard it's possible to access Microsoft SQL Server from PHP. How?

"On Windows machines, you can simply use the included ODBC support and the correct ODBC driver."
There is a better solution now, download the SQL Server Driver for PHP from Microsoft's Download Center, it is officially supported by Microsoft.

Source code: sqlsrvphp.codeplex.com
To Top