2010-03-10 146 views
1

我有一个正在从MySql移动到Sql Server的CakePHP应用程序。有一个查询似乎并不正确传输:CakePHP - 生成的查询与SQL Server无法正常工作

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

当我使用这个语法与MySQL,它似乎“解包”的阵列 正确,并且生成的查询是一样的东西

“ ... WHERE 'Model.column' IN(1,2,3)... “

当我使用SQL Server,生成的查询是

” ... WHERE 'Model.column' IN '阵列'“...

这显然会产生一个错误。我昨天在CakePHP Google Group上发布了这个问题,但还没有收到回复,所以我想我会试试。如果任何人有任何想法/建议,我将不胜感激。

回答

1

生成此代码在dbo_source.php(function conditionKeysToString)中,而特定的数据库驱动程序可以覆盖它,我从来没有见过这样做。

我在我的系统上有1.2.5,1.2.6和1.3.0-RC1,它们都追加'IN(',没有任何函数替代,没有添加'IN'的实例,然后决定是否它是一个数组或标量值,当数组变量在字符串上下文中被计算时,会发生这样的字数组:EG:php -r'$ a = array(1,2,3); echo $ a;'将输出阵列。

检查蛋糕/两version.txt文件。如果它们是不同的,备份上的SQL Server实例的蛋糕目录,并从MySQL的一个替换它。

如果它们是相同的尝试去cake/libs/model/datasources目录。希望你有Unix或Linux,因为“grep -r'IN'*”将极大地帮助你。否则,在两次安装Cake之间比较dbo_soures.php和dbo/dbo_mssql.php,并查看conditionKeysToString是否有任何区别。

最终我会升级到1.2.6,以便您获得任何和所有修复程序。

+0

只是增加:这是正确的,因为''Array''似乎是一个自动数组字符串由PHP完成。它*应该*抛出一个通知,如果这样做。 *应该*帮助找到*演员正在完成的地方。 – deceze 2010-03-10 23:22:59

+0

对不起,我不清楚,但没有两个安装的蛋糕。我的应用程序是使用MySQL作为数据库开发的,但现在管理员希望它使用SQL Server,所以我试图调试生成的查询中的任何不一致。我在Linux机器上使用1.2.6。我没有在cake/libs/model/datasources/dbo/dbo_mssql.php中看到任何会覆盖默认行为的东西,所以我将尝试查找更多关于正在执行的演员的信息。 – 2010-03-12 15:50:34

+0

只需检查一下,看看你是否取得了进展。我猜这是甚至相同的机器,所以PHP版本将是相同的。 PHP和调试器可能会很痛苦。跟踪代码的简单方法是编辑dbo_mssql。PHP和发现: function _execute($ sql){ return mssql_query($ sql,$ this-> connection); } 并将其更改为: 函数_execute($ sql){ $ this-> log(debug_backtrace()); return mssql_query($ sql,$ this-> connection); } 它会在您的日志中转储大量数据,但您会得到很多状态信息。 – 2010-03-24 16:19:04

0

尝试通过该条件为一个字符串:

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

这很好,如果你是硬编码1,2,3 。如果这些来自用户,则可能会挫败使用Cake这样的目的。关于RoR,Cake等的一点是开发人员不需要担心注入攻击。 – 2010-03-24 16:04:53

0

试试这样说:

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