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