我想使用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()函数的任何东西都被转储成字符串引号。
答案 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,但总是会产生错误的结果