我有一个输入字段,其中包含用于chmod的文件模式。
如果我使用它,它将被用作字符串,因此失败。我将它转换为int(intval()),它删除前导零(0777 => 777)并再次失败。如果我这样使用它:
$int = intval($input);
$finished = 0 . $int;
这也失败了,因为is_int($finished)
为假。
我该如何解决这个问题?
答案 0 :(得分:5)
前导零是整数的一个不存在的概念,因为它们在数学上是无关紧要的。在十进制表示法中,整数0777
简单而完全等于777
。
但是,如果您尝试将八进制表示法中的"0777"
转换为与511
一起使用的整数对数(chmod()
作为小数),则可以使用octdec($input)
。该函数接受一个字符串并吐出一个整数,完全按照它所说的那样执行。
当然,请务必先执行验证,例如通过使用正则表达式。您不希望将全局或无效标记传递给chmod()
,并可能将您的敏感文件和文件夹暴露给公众。
答案 1 :(得分:2)
您正在使用输入字段来获取$input
。这意味着该值是一个字符串。
您正在寻找该值内的octal number。 intval
未将字符串作为八进制数处理。
chmod
期望$mode
参数为整数值。
要转换包含八进制数字的字符串,您可以使用octdec
函数:
$int = octdec($value); # '0777' -> 511
所以你可能想要验证输入并检查它是否也符合八进制数,例如再次使用decoct
转换它并测试它是否会产生相同的结果:
$valid = "0".decoct($int) === $value;
答案 2 :(得分:1)
尝试使用preg_match()检查输入。参考下面的代码。
if(preg_match("/[^0-9.]/", $input))
{
return false;
}
else
{
-- Some Code Here --
}
感谢。
答案 3 :(得分:1)
没有什么可解决的,整数类型不能以0开头,除非它等于0. 0777等于777的值,通常没有问题将权限设置为777,系统会知道将其视为0777。
如果你必须传递一个前导零,它必须是一个字符串(例如'0'.$finished
)
晒。
答案 4 :(得分:0)
使用功能0时。 $ INT; php明白是一个操作添加两个字符串。结果 $ finished将是一个字符串。尝试使用函数number_format来解决。