[PHP][MSSQL-MySQL] Compatibilité des requêtes
Résolu/Fermé
masterdim
Messages postés
51
Date d'inscription
lundi 8 août 2005
Statut
Membre
Dernière intervention
26 juillet 2017
-
22 déc. 2005 à 10:26
Greg - 25 oct. 2007 à 21:06
Greg - 25 oct. 2007 à 21:06
A voir également:
- [PHP][MSSQL-MySQL] Compatibilité des requêtes
- Compatibilite windows 11 - Guide
- Easy php - Télécharger - Divers Web & Internet
- Mysql community server - Télécharger - Bases de données
- Pack compatibilité office 2003 - Télécharger - Bureautique
- Macos 14 compatibilité - Accueil - MacOS
11 réponses
kilian
Messages postés
8732
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
5 février 2025
1 526
4 janv. 2006 à 16:20
4 janv. 2006 à 16:20
Ah ok, merci pour l'info.
Je connaissais 'IF EXISTS' ou 'IF NOT EXISTS' avec mysql mais c'est tout...
Je connaissais 'IF EXISTS' ou 'IF NOT EXISTS' avec mysql mais c'est tout...
masterdim
Messages postés
51
Date d'inscription
lundi 8 août 2005
Statut
Membre
Dernière intervention
26 juillet 2017
31
4 janv. 2006 à 14:58
4 janv. 2006 à 14:58
Yes, c'est ce que j'ai fait et.... j'ai trouvé !
Dans ma requête, j'ai une condition et les 2 bases n'ont pas la même manière de gérer les conditions.
MSSQL veut des CASE WHEN ... THEN ... ELSE ... END, alors que MYSQL veut des IF( ... , ... , ... )
Voici un code pratique pour ceux qui ont le même problème et dont le code doit pouvoir tourner sur MSSQL et MYSQL:
Il suffit d'appeler la fonction dans le select, genre
SELECT sql_if_function(numéro=1, 'ok', 'ko')
FROM table
WHERE condition
Voili voilà. Merci à toi Kilian qui m'a mis sur la voie !
Dans ma requête, j'ai une condition et les 2 bases n'ont pas la même manière de gérer les conditions.
MSSQL veut des CASE WHEN ... THEN ... ELSE ... END, alors que MYSQL veut des IF( ... , ... , ... )
Voici un code pratique pour ceux qui ont le même problème et dont le code doit pouvoir tourner sur MSSQL et MYSQL:
// Fonction qui construit la fonction sql IF function sql_if_function($condition, $value, $value_else) { global $type_base; if ($type_base == "mssql" || $type_base == "odbc_mssql") { return "CASE WHEN $condition THEN $value ELSE $value_else END"; } else { return "IF($condition,$value,$value_else)"; } }
Il suffit d'appeler la fonction dans le select, genre
SELECT sql_if_function(numéro=1, 'ok', 'ko')
FROM table
WHERE condition
Voili voilà. Merci à toi Kilian qui m'a mis sur la voie !
Jean-François Pillou
Messages postés
18879
Date d'inscription
lundi 15 février 1999
Statut
Webmaster
Dernière intervention
16 février 2023
63 274
22 déc. 2005 à 11:17
22 déc. 2005 à 11:17
C'est surtout que ce ne sont pas les mêmes fonctions...
http://fr.php.net/manual/fr/ref.mssql.php
http://fr.php.net/manual/fr/ref.mssql.php
masterdim
Messages postés
51
Date d'inscription
lundi 8 août 2005
Statut
Membre
Dernière intervention
26 juillet 2017
31
22 déc. 2005 à 12:34
22 déc. 2005 à 12:34
Je sais et j'en tiens déjà compte !
Sinon le reste ne s'afficherait pas...
Sinon le reste ne s'afficherait pas...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
kilian
Messages postés
8732
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
5 février 2025
1 526
26 déc. 2005 à 05:00
26 déc. 2005 à 05:00
Salut,
En gros tu es en train d'appeler une methode sur une variable qui n'est pas un objet.
C'est à dire que tu dois avoir à la ligne 135 un truc du style:
Mais le soucis c'est que $bidule n'est pas un objet.
Alors si ça marchait avec mysql et pas mssql, c'est peut être parce que l'objet $bidule était l'instance d'une classe qui faisait appel à un truc qui marchait bien avec mysql et pas bien avec mssql.
Il faudrait voir avec ton script... Vu que cette page à l'air d'être longue essaie de nous mettre le code php dans un fichier texte sur une page web ou autre (avec le code de la classe à laquelle fait référence $bidule)....
Fatal error: Call to a member function on a non-object in c:\inetpub\wwwroot\... on line 135
En gros tu es en train d'appeler une methode sur une variable qui n'est pas un objet.
C'est à dire que tu dois avoir à la ligne 135 un truc du style:
$bidule->methode()
Mais le soucis c'est que $bidule n'est pas un objet.
Alors si ça marchait avec mysql et pas mssql, c'est peut être parce que l'objet $bidule était l'instance d'une classe qui faisait appel à un truc qui marchait bien avec mysql et pas bien avec mssql.
Il faudrait voir avec ton script... Vu que cette page à l'air d'être longue essaie de nous mettre le code php dans un fichier texte sur une page web ou autre (avec le code de la classe à laquelle fait référence $bidule)....
masterdim
Messages postés
51
Date d'inscription
lundi 8 août 2005
Statut
Membre
Dernière intervention
26 juillet 2017
31
4 janv. 2006 à 09:56
4 janv. 2006 à 09:56
Salut Kilian,
Merci pour ton message.
En effet, à cette ligne-là, j'appelle une méthode de la façon suivante :
$resultat_competency_level->MoveNext();
qui me permet donc de passer à l'enregistrement suivant dans un while qui parcourt un tableau résultant d'une requête SELECT.
Le plus étonnant, c'est que non-seulement ça marche avec MySQL, mais surtout je fais l'appel à cette fonction des dizaines et des dizaines de fois dans le logiciel et ça marche partout ailleurs (sauf donc à 3-4 endroits)...
Je peux difficilement vous transmettre le code, car il s'agit d'un gros logiciel intranet de plusieurs dizaines de milliers de lignes de code...
Je suis quasiment certain que c'est au niveau du select que ça déconne, qu'il n'aime pas qqch, mais quoi ???
Ce qui me conforte dans cette idée, c'est que cette erreur à la ligne 135 apparait dans une fonction récursive et que ce n'est pas la même requête à chaque tour (ça bug seulement lorsque l'on est à un endroit précis de la récursivité).
Je vais creuser...
Merci pour ton message.
En effet, à cette ligne-là, j'appelle une méthode de la façon suivante :
$resultat_competency_level->MoveNext();
qui me permet donc de passer à l'enregistrement suivant dans un while qui parcourt un tableau résultant d'une requête SELECT.
Le plus étonnant, c'est que non-seulement ça marche avec MySQL, mais surtout je fais l'appel à cette fonction des dizaines et des dizaines de fois dans le logiciel et ça marche partout ailleurs (sauf donc à 3-4 endroits)...
Je peux difficilement vous transmettre le code, car il s'agit d'un gros logiciel intranet de plusieurs dizaines de milliers de lignes de code...
Je suis quasiment certain que c'est au niveau du select que ça déconne, qu'il n'aime pas qqch, mais quoi ???
Ce qui me conforte dans cette idée, c'est que cette erreur à la ligne 135 apparait dans une fonction récursive et que ce n'est pas la même requête à chaque tour (ça bug seulement lorsque l'on est à un endroit précis de la récursivité).
Je vais creuser...
kilian
Messages postés
8732
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
5 février 2025
1 526
4 janv. 2006 à 12:56
4 janv. 2006 à 12:56
En ce cas, affiche la requête à chaque coup puis repère celle qui est juste avant l'erreur.
On verra ce qui ne va pas dans la requête....
On verra ce qui ne va pas dans la requête....
kilian
Messages postés
8732
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
5 février 2025
1 526
4 janv. 2006 à 15:02
4 janv. 2006 à 15:02
Ben de rien, je connaissais pas cette façon de traiter les conditons en sql....
masterdim
Messages postés
51
Date d'inscription
lundi 8 août 2005
Statut
Membre
Dernière intervention
26 juillet 2017
31
4 janv. 2006 à 15:17
4 janv. 2006 à 15:17
oui c'est pratique. ça permet d'ajouter des colonnes au résultat de la requête avec le contenu que l'on veut.