J'ai Apache 2.2.16 et PHP 5.4.3 sur Linux Debian 6 x64.
Pour installer le pilote ODBC natif du serveur MSSQL pour Linux, j'utilise les instructions suivantes: http://www.codesynthesis.com/~boris/blog/2011/12/02/Microsoft-sql-server-odbc-driver-linux/
J'ai configuré mon fichier odbc.ini de cette façon:
[mydsn]
Driver = SQL Server Native Client 11.0
Database = datbase
Server = xxx.xxx.xxx.xxx,port
et mon odbcinst.ini de cette façon:
[SQL Server Native Client 11.0]
Description=Microsoft SQL Server ODBC Driver V1.0 for Linux
Driver=/opt/Microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0
Threading=1
UsageCount=1
Pour tester, j'exécute la commande suivante:
$ isql -v mydsn dbusername dbpassword
Et j'ai eu du succès:
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
Ensuite, une utilisation de phpize pour installer unixODBC sur PHP 5.4, en utilisant ceci: (La première commande, ln -s ..., est utilisée car ./configure ne trouve pas les en-têtes. de php sur l'emplacement par défaut)
$ Sudo ln -s /usr/include/php5 /usr/include/php
$ phpize
$ ./configure --with-pdo-odbc=unixODBC && make && make test
$ Sudo make install
Sur mon phpinfo () je reçois:
PDO support - enabled
PDO drivers - odbc
PDO Driver for ODBC (unixODBC) - enabled
ODBC Connection Pooling - Enabled, strict matching
Il est maintenant temps de tout tester sur un script PHP 5.4:
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
$conn = new PDO('odbc:DSN=mydsn;UID='.$usr.';PWD='.$psw);
$query = 'select * from my_table';
$stmt = $conn->prepare($query);
$stmt->execute();
while ($row = $stmt->fetch()) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
?>
Mais ça ne marche pas ... J'ai eu ce message d'erreur:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[01000] SQLDriverConnect: 0
[unixODBC][Driver Manager]Can't open lib '/opt/Microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0' : file not found'
in /var/www/testemssql.php:17
Stack trace:
#0 /var/www/testemssql.php(17): PDO->__construct('odbc:DSN=mydsn...')
#1 {main} thrown in /var/www/testemssql.php on line 17
Donc ma question est: qu'est-ce qui se passe? Quelle configuration me manque? Comment configurer correctement le pilote natif ODBC du serveur MSSQL sur Linux et PHP 5.4?
Ps.: Lorsque j'essaie d'utiliser odbc_connect () PHP indique que la fonction n'existe pas.
Le pilote ODBC natif de MSSQL Server pour Linux a un bogue
Pour connecter correctement MS SQL Server, utilisez FreeTDS Voir plus de détails dans: PHP 5.4 sous Linux: Comment se connecter à MS SQL Server 2008?
Je sais que c'est un peu tard, mais depuis que j'ai touché ce fil tout en me frappant la tête contre le même problème, voici quelques suggestions pour ceux qui le rencontrent à l'avenir :-)
1) Vérifiez les autorisations sur libsqlncli-11.0.so.1790.0 pour vous assurer que l'utilisateur, quel qu'il soit, Apache, s'exécute en tant que tel (peut l'avoir lu et exécuté)
2) Utilisez ldd pour vérifier qu’aucune des dépendances n’est manquante - sur la base du fait que isql fonctionne au-dessus, je dirais qu’elles sont OK (indice: vous recherchez "non trouvé"):
ldd /opt/Microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0
3) Essayez d'exécuter votre script php à partir de la ligne de commande plutôt que via Apache. Si cela fonctionne comme ça, arrêtez à l'étape 4. Si ce n'est pas le cas, je vous conseillerais de vérifier l'état de votre machine pour voir ce qu'elle fait réellement.
4) C'est celui qui l'a fait pour moi! Essayez de désactiver SELinux (c’est-à-dire qu’il est réglé sur le mode non-contraignant/permissif) et de cliquer à nouveau sur la page dans Apache. Je ne sais pas exactement ce que cela bloquait (je n'ai pas encore eu le temps ni l'envie d'entrer dans les détails), mais dès qu'il a été désactivé, tout a fonctionné à merveille. Pour ceux qui ont l’inclination que je suis, vous pouvez creuser et trouver une solution sans désactiver complètement :-)
Les commandes exactes pour désactiver SELinux peuvent varier en fonction de votre système d'exploitation, mais pour moi (sous CentOS), cela a fonctionné:
http://rbgeek.wordpress.com/2012/08/06/how-to-disable-selinux-on-centos-without-rebooting/
Bonne chance!
La même configuration, sauf pour odbcinst.ini:
[SQL Server Native Client 11.0]
Description=Microsoft SQL Server ODBC Driver V1.0 for Linux
Driver=/opt/Microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0
UsageCount=1
Réessayez après avoir supprimé cette ligne:
Threading=1
Et votre script PHP fonctionne bien pour moi.
J'espère que cela peut vous aider.
Si vous corrigez et recompilez php avec le correctif attaché à https://bugs.php.net/bug.php?id=61777 cela résoudra le problème.
Consultez également cet article de blog pour des exemples d'utilisation du DSN et de son utilisation:
Je n'ai jamais eu l'occasion de l'essayer moi-même, mais j'ai entendu dire que php5-sybase fonctionnait bien, et que je sais qu'il est disponible pour Debian et Ubuntu dans les dépôts.