CakePHP正在将MySQL整数转换为字符串......弄乱了rand()函数

时间:2011-01-29 08:17:10

标签: php mysql cakephp random

我想使用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发送给数据库的查询总是将这个发送到RAND()部分,将MySQL发送给他们:#/ p>

ORDER BY RAND(`1235123412341`)

在手动查询上进行测试,它运行得很好,并在格式化时返回样本:

ORDER BY RAND(1235123412341)

有没有办法让Cake退出autoformatting?我放入RAND()函数的任何东西都被转储成字符串引号。

2 个答案:

答案 0 :(得分:4)

  

我放入RAND()函数的任何东西都被转储到字符串引号中。

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

"RAND('%d')"

这应该导致生成以下SQL:

ORDER BY RAND('1235123412341')

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

答案 1 :(得分:0)

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

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

由于PHP的自动类型转换,您可以执行以下检查: is_int('01234'),这将返回 TRUE - 但是实际上并非如此 - “数字”实际上是一个字符串,从0开始 - 因此应该处理它(除非之前手动转换为integet,如果它应该是它应该是什么)

您将需要调整CakePHP的数据库类,以检查数据类型

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

if (is_string($str))

......我改成了:

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

......现在一切正常:)

P.S。:我尝试过使用(int)$ str === $ str,但总是会产生错误的结果