我有一个从我的代码中反复调用的函数,我可以传递一个变量,如果参数是一个“真实”(int / float)数字,函数的行为会有所不同(换句话说,不执行任何操作)传递给MySQL查询时也不要在它周围添加引号。目前我的代码进行了双重检查,但有更好的方法吗?
$a = 1;
$b = '1';
$is_num = (is_numeric($a) && !is_string($a)); //true
$is_num = (is_numeric($b) && !is_string($b)); //false
有更好的方法吗?
例如(非常简化的版本):
$query = 'SELECT * FROM `table` WHERE ';
$field = 'id';
$operator = '=';
$value = 2;
$query .= '`'.$field.'`'.$operator;
$is_num = (is_numeric($value) && !is_string($value));
if($is_num){
$query .=$value;
}else{
$query .='"'.mysql_real_escape_string((string)$value).'"';
}
$query .=';';
答案 0 :(得分:2)
如果您的号码始终是整数,那么您可以使用is_int
。如果有可能它可能是小数点数,并且您希望返回$is_num == true
然后否,则必须按原样进行检查或选中is_int($a) || is_float($a)
is_numeric
的具体目的是检查它是“数字还是数字字符串”,并且没有“所有数字类型”全部捕获。
但是,鉴于您的评论是针对查询构建器的,为什么不在is_string
添加引号而不是其他名称?
答案 1 :(得分:1)
如果您只处理整数,is_int($a)
有效。如果你也在处理花车,请使用
is_int($a) || is_float($a)
答案 2 :(得分:0)
function is_number($input)
{
if ( ! is_int($input) AND is_numeric($input))
{
return (float) $input === $input;
}
else
{
return (int) $input === $input;
}
}
echo is_number('1.23')? 'true': 'false'; # false
echo is_number(1.23)? 'true': 'false'; # true
echo is_number(1)? 'true': 'false'; # true
echo is_number('1')? 'true': 'false'; # false
最好转换为字符串,因为如果是字段类型,SQL将转换为int / float。