【问题标题】:CakePHP is converting MySQL integers into strings... messing up rand() functionCakePHP 正在将 MySQL 整数转换为字符串...弄乱 rand() 函数
【发布时间】:2011-01-29 08:17:10
【问题描述】:

我想使用 CakePHP 从我的数据库中随机抽取数据样本。这是我的功能:

function categories_list() 
{   
    $this->paginate['limit'] = 6;
    $this->paginate['order'] = '';
    $this->paginate['conditions'] = '';

    // Sort Randomly Start 
    if ($this->Session->check('Category.randomSeed')) 
    { 
        $seed = $this->Session->read('Category.randomSeed'); 
    } else { 
        $seed = mt_rand(); 
        $this->Session->write('Category.randomSeed', $seed); 
    } 
    $this->paginate['order'] = sprintf('RAND(%d)', $seed); 
    // Sort Randomly End 

    $this->set('cat_ajax_items', $this->paginate('Category')); 
}

问题是,Cake 发送给 DB 的查询总是 this 到 RAND() 部分,从而使 My​​SQL 陷入困境:

ORDER BY RAND(`1235123412341`)

在手动查询上进行测试,它工作得很好,并且当它的格式如下时返回一个样本:

ORDER BY RAND(1235123412341)

有什么方法可以让 Cake 退出自动格式化?我放入该 RAND() 函数的任何内容都会转储到字符串引号中。

【问题讨论】:

    标签: php mysql cakephp random


    【解决方案1】:

    我放入该 RAND() 函数的任何内容都会转储到字符串引号中。

    不,这是不正确的。如果它使用字符串引号,那么它会正常工作,但是反引号 不是 字符串引号。问题是CakePHP 将数字引用为列名。尝试使用单引号引用该值:

    "RAND('%d')"
    

    这应该会产生以下 SQL:

    ORDER BY RAND('1235123412341')
    

    这与不包含引号时的结果相同。

    【讨论】:

    • 工作就像一个魅力。诚然,我有点像 MySQL 菜鸟,所以整个反引号/引号的区别完全让我感到震惊。非常感谢,这是您的支票;)
    • 但是,当没有引号的时候呢,比如这里:stackoverflow.com/questions/22622062/…
    【解决方案2】:

    许多应用程序和框架在将变量插入数据库之前尝试使用所谓的智能确定变量类型

    然而,其中许多也因整数和字符串而失败:​​)

    由于 PHP 的 自动类型转换,您可以进行以下检查:is_int('01234') 并且会返回 TRUE - 但是这实际上是不正确的——“数字”实际上是一个字符串,从 0 开始——所以它应该被处理(除非之前手动转换成整数,如果它应该是这样的话)

    您需要调整 CakePHP 的数据库类,它会在其中检查数据类型

    我不熟悉 CakePHP,但 CodeIgniter 确实在其 escape() 函数中使用了以下检查:

    if (is_string($str))
    

    ...我已经改为:

    if (is_string($str) && (mb_strlen((int) $str) != strlen($str)))
    

    ...现在一切正常:)

    P.S.:我尝试过使用 (int) $str === $str,但是结果总是不正确

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2010-12-31
      相关资源
      最近更新 更多