为什么输出不存在的映像会完全删除会话?


Why does outputting non existent image completelly deletes session

我正在开发一个大型网站php, mysql和js。但是有一个特定的脚本输出一个Mysql表,其中包含信息和图像位置,如果可用的话还包括图像。图片是可选的

删除所有会话信息,包括会话文件。

经过长时间的调试(没有错误,警告,通知,firebug或调试信息给出了一个类似的提示),我发现只有当图像文件名变成"./"时才会发生这种情况;

我已经通过在输出图像之前检查文件名解决了这个问题。(但我可以想到我写的许多脚本都没有检查图像名称。)

然而,这是一个奇怪的和不可预测的行为,我希望脚本只是显示什么,好一个"不存在的图像框…"

没有搜索证明有用。有趣的是,会话删除在调用页上并不明显,而是在下一页中。即使在结束脚本之前检查会话,如下所示。在我的系统中不允许缓存写到磁盘。

在那里,我最终写了一些调试脚本如下…(重新读取会话在第二个脚本只是为了演示的目的,这是不需要的,也不影响结果,这只是为了表明显然会话仍然活着。

如何复制:(在Chrome和Firefox上测试)

将这些脚本复制到您的web服务器中,将图像名称替换为您的名称之一(可选)并运行"SetSession.php"。一切看起来都很好,但是重新加载"CheckSession.php",你会注意到会话信息丢失了,实际上它在第一次运行时已经丢失了,但是脚本没有显示它…

"SessionSet.php"

      <?php
      session_start();
      if (isset($_POST['SessionData']))
      {
           $_SESSION['SessionData'] = $_POST['SessionData'] ;
           echo "<br> SessionData value:  ",$_SESSION['SessionData'];
           echo "<br> Check Session <br>";
           ?>
                <form  method="get"  action="CheckSession.php">
                     <input type="submit" value="Submit">
                </form> 
           <?php
      }
      else
      {
          echo '<br> Will place "SessionData" in $_SESSION["SessionData"] <br>';
           ?> 
            <form  method="post"  action="">
                <input type="text" name="SessionData" value="SessionData"  />  
                <input type="submit" value="Submit">
           </form> 
           <?php     
      }
      ?>
"CheckSession.php"

          <?php
      session_start();
      // Display all errors
           error_reporting(E_ALL);
           ini_set("display_errors", 1);
      echo "<br>At Script Start <br> Session: <br>",   print_r($_SESSION),"<br><br><br>";
      // Sample image (>>>Change to an available image in your enviroment<<<)
      $ImgThumb ="images/RegAdd.png" ;
      // Outputting image
      ?> 
      Known Image: <IMG SRC="<?php echo $ImgThumb; ?>" alt="" /></td>
      <?php
      // checking session values again
      echo " <br> After ouputing known image Session: <br>", print_r($_SESSION),"<br><br><br>";

      // SECOND ASSIGNMENT Setting image value to offending value (v,gr ./ & /)
      $ImgThumb ="./" ;
      ?>
      Unknown image: <IMG SRC="<?php echo $ImgThumb; ?>" alt="" />
      <?php
      echo "<br>Session Array After outputting  $ImgThumb image: <br> ",print_r($_SESSION);
      ?>

运行第二个脚本(从第一个脚本开始)产生以下输出:

At Script Start会话:Array ([SessionData] => SessionData) 1

已知图片:{Image}输出已知图像Session后:Array ([SessionData] => SessionData) 1

未知的图像:输出。/image后:Array ([SessionData] => SessionData) 1


重新加载"CheckSession.php"脚本(如下所示)显示数据会话已丢失,实际上会话已从磁盘中删除。

At Script Start会话:Array () 1

已知图片:{Image}输出已知图像Session后:Array () 1

未知的图像:输出。/image后:Array () 1


将$ImageTemp的第二个赋值值更改为任何其他东西,现在它工作了…

有人知道为什么会这样吗?或者这是一种解析器/程序错误。一个HTML图像占位符把会话管理和磁盘文件搞得一团糟,这真是太奇怪了。

我无法在Linux服务器上重现这个问题(就像大多数生产站点一样),因此为我的问题中描述的环境提供一个解决方案似乎涵盖了大多数情况。因此,我相信从实际目的来看,如果这只是我的安装或更常见的windows问题,那么进一步挖掘的好处可以忽略不计。