2010-03-10 4 views
1

J'ai une application CakePHP qui est déplacée de SQLq à Sql Server. Il y a une requête qui ne semble pas transférer correctement:CakePHP - La requête générée ne fonctionne pas correctement avec SQL Server

$this->Model->find('all', array(
     'conditions' => array(
      'Model.column' => array(1, 2, 3) 
     ) 
    ) 
); 

Lorsque j'utilise cette syntaxe avec MySQL, il semble « déballer » le tableau correctement, et la requête générée est quelque chose comme

" ... OU 'Model.column' IN (1, 2, 3) ... "

Lors de l'utilisation de serveur SQL, la requête est générée

" ... OU 'Model.column' IN 'Array' "...

qui génère évidemment une erreur. J'ai posté cette question sur le groupe Google CakePHP hier, mais je n'ai pas reçu de réponse, alors j'ai pensé que j'essaierais SO. Si quelqu'un a des idées/suggestions, je l'apprécierais.

Répondre

1

Le code qui génère ceci est dans dbo_source.php (fonction conditionKeysToString) et bien que des pilotes de base de données spécifiques puissent surcharger cela, je n'ai jamais vu cela. J'ai 12.5.5, 1.2.6 et 1.3.0-RC1 sur mon système et ils ajoutent tous 'IN (') et rien d'autre que cette fonction. c'est un tableau ou une valeur scalaire Le mot Array est ce qui se passe quand une variable de tableau est évaluée dans un contexte de chaîne de caractères: EG: php -r '$ a = array (1,2,3); echo $ a; Array.

Vérifiez le gâteau/fichier version.txt dans les deux. Si elles sont différentes, sauvegardez le répertoire de gâteau sur l'instance SQL Server et le remplacer par celui de MySQL.

Si elles sont les mêmes essayez d'aller dans le répertoire cake/libs/model/datasources. J'espère que vous avez Unix ou Linux parce que "grep -r 'IN' *" vous aidera énormément. Sinon, comparez dbo_soures.php et dbo/dbo_mssql.php entre les deux installations de cake et voyez s'il y a des différences dans conditionKeysToString.

Finalement, je voudrais passer à 1.2.6 juste pour que vous obteniez tous les correctifs.

+0

simple ajout: Il est exact que le ' 'Array'' semble être un tableau automatique à chaîne cast effectué par PHP. Il * devrait * lancer un AVIS s'il le fait. Cela * devrait * aider à trouver * où * le casting est en cours. – deceze

+0

Je suis désolé que je n'étais pas clair, mais il n'y a pas deux installations de gâteau. Mon application a été développée en utilisant MySQL comme DB, mais maintenant la direction veut utiliser SQL Server, donc j'essaye de déboguer toutes les incohérences dans les requêtes générées. J'utilise 1.2.6 sur une machine Linux. Je ne vois rien dans cake/libs/model/datasources/dbo/dbo_mssql.php qui remplacerait le comportement par défaut, donc je vais essayer de trouver plus d'informations sur l'endroit exact où la distribution est faite. –

+0

Je reviens juste pour voir si vous aviez fait des progrès. Je suppose que c'est même la même machine donc la version PHP serait la même. PHP et débogueurs peuvent être une douleur. Un moyen facile de tracer le code serait d'éditer dbo_mssql.php et trouver: fonction _execute ($ sql) { return mssql_query ($ sql, $ this-> connexion); } et remplacez-le par: function _execute ($ sql) { $ this-> log (debug_backtrace()); return mssql_query ($ sql, $ this-> connexion); } Il va vider beaucoup de données dans votre journal, mais vous obtiendrez beaucoup d'informations d'état. –

0

Essayez de passer cette condition comme une chaîne:

$this->Model->find('all', array(
     'conditions' => array(
      'Model.column in (1, 2, 3)' 
     ) 
    ) 
); 
+0

C'est bien si vous êtes en train de coder en dur le 1,2,3 . Si ceux-ci proviennent de l'utilisateur, vous annulez le but d'utiliser quelque chose comme Cake. Le point à RoR, Cake, etc. est que le développeur ne devrait pas avoir à s'inquiéter des attaques par injection. –

0

Essayez comme ceci:

$this->Model->find('all', array(
     'conditions' => array(
      'Model.column' => array(
       'OR' => array(1, 2, 3) 
      ) 
     ) 
    ) 
); 
Questions connexes