当变量在文件名中时,PHP file_exists 返回 false
Posted
技术标签:
【中文标题】当变量在文件名中时,PHP file_exists 返回 false【英文标题】:PHP file_exists returns false when variable is in file name 【发布时间】:2018-12-15 05:21:04 【问题描述】:我想检查我的服务器上是否存在jpeg
文件。但是,当我检查它时,返回值为 false。
clearstatcache();
// the $img variable is dynamically got from $split[1] which is something like image.jpeg" />
$img = str_replace('"','',$split[1]); // remove double quotes
$img = str_replace('/>','',$img); // remove img end tag
$img = str_replace(' ','',$img); // remove spaces
$filename = "uploads/image.jpeg"; // original file name
$fn = "uploads/".$img; // file name with dynamic variable in it
if(file_exists($fn))
echo "yes";
else
echo "no";
// Check if the two strings are the same and they are
if($fn == $filename)
echo "same";
原始静态文件名返回yes
,而动态文件名返回no
。我检查了safe_mode
在我的服务器上是off
,两个变量($fn
和$filename
)完全一样。如果我只是简单地使$img
等于image.jpeg
而没有任何str_replace
它也会返回true
并回显yes
。
总的来说,我不知道$img
变量有什么问题,如果变量相同,为什么它会给我两个不同的结果?
【问题讨论】:
var_dump($filename, $fn)
请...
另外,/uploads/...
指的是目录uploads
在您的硬盘根目录中。那是对的吗?不知何故,我怀疑它是。
var_dump
还给我string(97) "permUploads/_jrP_Nq_X3hHsXdQ0_vHG1Yr5Z_touryx_xZsxsYCiAzWNNj9hc8HIck_UN9BISgxszzNvmV_uOq.jpeg " string(93) "permUploads/_jrP_Nq_X3hHsXdQ0_vHG1Yr5Z_touryx_xZsxsYCiAzWNNj9hc8HIck_UN9BISgxszzNvmV_uOq.jpeg"
。两个相同但长度不同的字符串。怎么样?
@MarkFrankli 93 != 97 你的问题
这毫无意义,if($fn == $filename)
应该失败了。我假设你在这里混淆了一些输出
【参考方案1】:
你的调试逻辑有严重缺陷,试试这个:
echo '<hr/>';
clearstatcache();
// the $img variable is dynamically got from $split[1] which is something like image.jpeg" />
$img = str_replace('"','',$split[1]); // remove double quotes
$img = str_replace('/>','',$img); // remove img end tag
$img = str_replace(' ','',$img); // remove spaces
$filename = "uploads/image.jpeg"; // original file name
$fn = "uploads/".$img; // file name with dynamic variable in it
if(file_exists($fn))
echo '$fn: yes';
echo '<br/>';
else
echo '$fn: no';
echo '<br/>';
if(file_exists($filename))
echo '$filename: yes';
echo '<br/>';
else
echo '$filename: no';
echo '<br/>';
// Check if the two strings are the same and they are
if($fn == $filename)
echo "same";
echo '<br/>';
else
echo 'different';
echo '<br/>';
echo '<pre>';
var_dump( $split[1], $filename, $fn )
echo '</pre>';
echo '<hr/>';
【讨论】:
其实和原来一样。$fn: no $filename: no different string(93) "permUploads/_jrP_Nq_X3hHsXdQ0_vHG1Yr5Z_touryx_xZsxsYCiAzWNNj9hc8HIck_UN9BISgxszzNvmV_uOq.jpeg" string(97) "permUploads/_jrP_Nq_X3hHsXdQ0_vHG1Yr5Z_touryx_xZsxsYCiAzWNNj9hc8HIck_UN9BISgxszzNvmV_uOq.jpeg "
。我根本无法使用trim()
和str_replace
删除空格。
@MarkFrankli 您的网络浏览器正在隐藏字符。您需要查看源代码,而不是从您的网络浏览器正常显示复制+粘贴; ctrl
+ u
在 Chrome 中。
@MarkFrankli 试试var_dump( $split[1] );
,看看是否一切都如您所愿。
是的,实际上我有一个隐藏的<br>
标签。
@MarkFrankli 这解释了 4 个额外的字符。如果我的回答对您有所帮助,请随时接受。以上是关于当变量在文件名中时,PHP file_exists 返回 false的主要内容,如果未能解决你的问题,请参考以下文章
附加到 PHP 变量,但在 '.jpg' / '.png' 等之前