使用intval()或sprintf('%d')哪个更好?

时间:2019-01-24 20:20:00

标签: php printf

我正在寻找一个最佳答案,最好在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

4 个答案:

答案 0 :(得分:4)

两者都不是更好。正确的解决方案是将prepared statementsbound 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 );
}