web-dev-qa-db-fra.com

Natif du serveur MSSQL ODBC Pilote pour Linux et PHP 5.4

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.

15
vinigarcia87

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?

2
vinigarcia87

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!

5
conclavia

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.

1
Alx Russell

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:

http://strangenut.com/blogs/dacrowlah/archive/2012/04/13/installing-and-using-the-Microsoft-sql-server-odbc-driver-for-linux.aspx

1
KRavEN

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.

0
Ddorda