我正在寻找一个最佳答案,最好在intval()和sprintf('%d')之间使用,尤其是在清理不需要的字符时?
$offset = '12';
$max = '100';
function getOffsetLimit($offset, $max = 100)
{
$offset = intval($offset);
$max = intval($max);
$sql = " LIMIT $offset, $max";
return $sql
}
或
function getOffsetLimit($offset, $max = 100)
{
$sql = sprintf(" LIMIT %d, %d", $offset, $max);
return $sql
}
-
谢谢
camsy
答案 0 :(得分:4)
两者都不是更好。正确的解决方案是将prepared statements与bound parameters一起使用。请注意Qtable = [a1,a2,a3,a4,a5]
eTrace = [a1,a2,a3,a4,a5]
的第三个$data_type
参数-允许您过滤整数。
如果您绝对坚持使用串联字符串构建SQL,那么我将filter_var()
与PDOStatement::bindParam()
(如果要在值不是整数时中止)或{{1} }(如果要将值转换为类似整数的合理传真。)
答案 1 :(得分:2)
他们做相反的事情:
intval()
将字符串转换为整数。
sprintf('%d')
有效地将整数转换为字符串。
此外,在处理SQL查询时,您不应使用任何一个函数。正如其他人提到的那样,您应该使用准备好的语句。
答案 2 :(得分:0)
由于LIMIT和OFFSET不适用于预处理语句,因此,下一个最佳方法是将filter_var()与FILTER_VALIDATE_INT一起使用。我认为对于LIMIT和OFFSET,不应使用FILTER_SANITIZE_NUMBER_INT。
请注意,在MySQL中,没有LIMIT就不能有OFFSET,下面的代码是针对MySQL的。
function getLimitOffsetStatement($limit=null, $offset=null) {
$sql = '';
$filterOptions = ['options'=>['min_range' => 0]];
if (filter_var($limit, FILTER_VALIDATE_INT, $filterOptions)) {
$sql .= " LIMIT $limit";
if (filter_var($offset, FILTER_VALIDATE_INT, $filterOptions)) {
$sql .= " OFFSET $offset";
}
}
return $sql;
}
答案 3 :(得分:0)
如果您使用的是旧版代码,那么简单的操作就可以了。...
function build_sql_limit ( $total, $offset, $max = 100 )
{
if ( ctype_digit ( $total ) )
{
$total = $total > $max ? $max : $total;
}
else
{
$total = $max;
}
if ( ! ctype_digit ( $offset ) )
{
$offset = NULL;
}
return ' LIMIT ' . ( is_null ( $offset ) ? $total : $offset . ', ' . $total );
}