【问题标题】:PHP file_exists returns false when variable is in file name当变量在文件名中时,PHP file_exists 返回 false
【发布时间】: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){ 应该失败了。我假设你在这里混淆了一些输出

标签: php filenames file-exists


【解决方案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] );,看看是否一切都如您所愿。
  • 是的,实际上我有一个隐藏的&lt;br&gt;标签。
  • @MarkFrankli 这解释了 4 个额外的字符。如果我的回答对您有所帮助,请随时接受。
猜你喜欢
  • 1970-01-01
  • 2012-09-02
  • 2011-06-05
  • 2015-09-14
  • 2016-01-13
  • 2014-01-02
  • 2015-10-08
  • 2017-08-15
  • 2013-10-12
相关资源
最近更新 更多