2009-10-08 6 views
1

Je suis actuellement en utilisant SQL Server 2000 Stored Procedures avec PHP. Suivant le document PHP, j'utilise mssql_bind pour affecter la valeur des paramètres, puis exécuter la procédure stockée.mssql_bind chaîne vide convertir en NULL

Le problème est que je suis this bug qui me empêche de lier des chaînes vides aux paramètres (ils sont convertis en NULL lorsque la procédure stockée est appelée)

Je Dont't veux avoir à convertir tous les paramètres à l'intérieur du Procédures stockées pour vérifier si sa valeur NULL est convertie en une chaîne vide. Je veux être capable d'utiliser des chaînes vides ainsi que NULL qui ont toutes deux leur propre signification.

Est-ce que quelqu'un sait une solution de contournement pour cela en PHP? Le site web PHP bugs n'est pas très clair si ce bug est corrigé ou quand il sera corrigé, j'utilise PHP 5.2.11 (la dernière version de la branche 5.2)

Répondre

0

En supposant que vous ne voulez pas faire ce que vous proposez, options que vous êtes de gauche à

  1. Télécharger un instantané cvs de php et l'installer si viable, voir si elle est fixée. Si ce n'est pas viable ou fixé via cvs alors ...
  2. Utilisez les appels system() ou exec() pour utiliser les procédures stockées. Si trop de tracas puis ...
  3. N'utilisez pas de procédures stockées, faites votre fonctionnalité dans php ou autre code de script.
  4. Modifiez la procédure stockée pour accepter une autre valeur pour les chaînes et convertir cette chaîne en chaîne ''.
  5. Faites ce que vous ne vouliez pas faire. Harsh: P Mais je ne vois pas d'autre moyen.
0

Le bug #44325 a proposé un correctif pour résoudre le problème, mais ce n'était pas une solution correcte, car il semble que le problème est dans ntwdblib.dll, et pas dans le code de l'extension php_mssql.

Voir le commentaire de Alexr à Oplot dot com:

Je suis désolé. Ce bug n'est pas corrigé. Ce est un bug du fichier ntwdblib.dll. Et après les dernières mises à jour le bug est retour.

Lorsque je lier une chaîne vide, la procédure stockée a reçu un caractère chr (0) au lieu d'une chaîne vide.

Veuillez annuler les dernières corrections. Ce bug est irrécupérable.

Considérant cela, je ne suis pas sûr qu'il ya beaucoup qui pourrait être fait sur le côté PHP :-(

La dernière fois que je travaillais avec PHP + MSSQL sur Windows, j'ai eu beaucoup de problèmes, comme un tout à fait semblable à celui-ci, en fait ;-(

peut-être une solution possible, pour vous, peut-être passer au nouveau pilote SQL Server Driver for PHP? Notez que est ne fonctionne que sous Windows, mais ...

+0

Oui, c'est le problème, nous utilisons PHP sous Linux, donc nous ne pouvons pas utiliser le nouveau pilote. En outre, ntwdblib.dll n'est pas un composant Windows? Cela ne devrait donc pas affecter la version Linux de PHP, ou est-ce que je me trompe? – MaxiWheat

0

Personnellement, je n'ai pas de serveur MSSQL disponible pour tester, mais avez-vous essayé d'utiliser des PDO? tead de mssql directement?

PDOStatement->bindValue(mixed $parameter , mixed $value [, int $data_type ]) 

bindValue()

Oui, je me rends compte que PDO est un conteneur, mais qui sait, pourrait travailler! :)

+0

Oui, nous savons qu'il y a un PDO, mais il ne supporte pas de résultats multiples et un processus stocké peut retourner. – MaxiWheat

+0

C'était un longhot, dommage! :( –

0

J'ai une solution qui fonctionnera. J'utilise ADODB (mais cela n'a pas d'importance) et j'ai piraté le pilote mssql (adodb-mssql.inc.php dans le dossier des pilotes adodb5).

ici est le code

if($var === ''){ 
     //stupid hack to prevent mssql driver from converting empty strings to null. now they arent empty strings but they will get trimmed down to legth 0 ;-) 
     $var = ' '; 
     $type = SQLVARCHAR; 
     $isNull = false; 
     $maxLen = 0; 
    } 

consultez si vous essayez de lier une chaîne vide et si vous le changer pour être non vide. Peu importe la valeur que vous utilisez, je n'utilise qu'un espace.

rendre le type a sqlvarchar isnull devrait être faux et maintenant l'astuce consiste à faire de maxlen 0 pour que le pilote mssql coupe votre chaîne en une chaîne vide.

ces variables devraient être passées à la fonction mssql_bind si cela n'était pas évident.

Questions connexes