我正在try 查看不同网络文件夹中的图像.一切正常,但一旦有一个文件夹的名称中有"&",我就无法查看其内容.URL在"&"之后停止,因此它找不到有问题的文件夹.

我已经研究了其他类似于这个问题的问题,但都不起作用(许多问题也可以使用strplace()来处理单个URL,在我的例子中,当我有数百个文件夹时,这是不起作用的)

Running on Windows Server 2022 with IIS.

我的代码是:

<?php 

$selectedDir = isset($_GET["dir"]) ? $_GET["dir"] : "";
//echo $selectedDir;
echo '<h1> '.$selectedDir.' </h1>';
$dirs = "\\\\server\images\\moreimages/$selectedDir";


$dir = new DirectoryIterator($dirs);
foreach ($dir as $fileinfo) {
    if ($fileinfo->isDir() && !$fileinfo->isDot()) {
        $directorypath = $selectedDir."/".$fileinfo->getFilename();
        echo "<a href='?dir=".$directorypath."'>".$fileinfo->getFilename()."</a><br><br>";
        
    }
        elseif (stripos($fileinfo, '.jpg') !== false || stripos($fileinfo, '.png') !== false) {

        
        ?>
        <?php  echo '<a target="_blank" href="'."\Intraimages\VD_images/$selectedDir/".$fileinfo.'"/>'; ?>
       <?php echo '<img src="'."\Intraimages\VD_images/$selectedDir/".$fileinfo.'"/> </a>'; ?>
         
         <?php 
    
    }

}

?>

(For clarification the different paths if it's any help: "\\server\images\moreimages/" is the UNC path. "\Intraimages\VD_images/" is the Virtual Directory path in IIS.)

我会尽量提前提供更多的信息.

文件夹名称为:35144 MAN T&A;B T2-L62

加入时间:清华2007年01月25日下午3:33

Php致命错误:未捕获意外值异常:DirectoryIterator::__construct(\server\images\moreimages//35000-35999/35144 MAN T):系统在C:\inetpub\wwwroot\IntraImages\index.php:38中找不到特定文件(代码:2

已try var_ump $selectedDir,其中显示: 字符串(28)"%2F35000-35999%2F35144+MAN+T"

我网络浏览器中的URL显示:.../?dir=/35000-35999/35144 MAN T&amp;B T2-L62

HTTP Error

What I've tried

urlencode:$selectedDir

将php.ini中的某些设置更改为%26:

Arg_分离器.out="&amp;"

Arg_分离器.input=";&amp;"

我需要在URL中插入"%26"而不是"&amp;"吗?如果是这样的话,我不知道是怎么回事.

EDIT

我try 过: str_replace("&","%26",$selectedDir);但URL和$selectedDir不包含"&amp;",因为它正好停在"&amp;"之前,所以我猜没有什么可替换的...?

SOLVED, this is my new code thanks to the all the help:

if ($fileinfo->isDir() && !$fileinfo->isDot()) {
        $directorypath = http_build_query(array($selectedDir."/".$fileinfo->getFilename()));
        $url = parse_url($directorypath);
        $newurl = str_replace('0=','',$url['path']);
        echo "<a href='?dir=".$newurl."'>".$fileinfo->getFilename()."</a><br><br>";        
    }

NOTE:这可能不是最好的解决方案,因为我用的是str_replace(),但它只是证明了它适用于http_build_query

对于感兴趣的人,新的URL现在是: .../?dir=%2F35000-35999%2F35144+MAN+T%26B+T2-L62

推荐答案

它要求你首先了解这里正在发生的事情,否则很容易遗漏.

它从这里开始:

$_GET["dir"]

该数组成员的内容不是您所想的那样.您会发现从字符串中删除的任何内容都以(并包括)第一个"与"符号(&;)开头.

如果您随后查看$_GET的所有数组键,您将注意到,在"dir"条目之后,下一个键是您想要使用的路径名的延续.

这是因为PHP解析传入请求URL的方式,特别是查询信息部分.这是URL末尾的部分,从第一个问号开始.

?dir=why&why-not?

array (
  'dir' => 'why',
  'why-not?' => '',
)

因此,这基本上是缺少URL编码,正如您可以想象的那样,PHP具有这种编码.

因此,当您构建要单击的URL时,就像使用dir参数的目录路径名一样,正确地对路径名值进行编码.

您的脚本需要使用相同的语言,否则可能会出现意想不到的结果.这也是为什么很容易被忽视的原因.

构建URL(100)的查询以具有适当的href属性值.

并用于调试目的

echo '<h1> '.$selectedDir.' </h1>';

会显示$selectedDir的HTML值,那就用100吧.

这两个建议都应该是一个很好的例子,说明如何在您的PHP脚本和浏览器之间处理数据,并返回到您的PHP脚本中.

示例脚本

<?php
/*
 * index.php - example of http_build_query() and htmlspecialchars()
 *
 * @link https://www.php.net/manual/en/function.http-build-query.php
 * @link https://www.php.net/manual/en/function.htmlspecialchars.php
 * @link https://stackoverflow.com/a/76579728/367456
 */
?>

<ul>

  <li>
      <a href="?dir=why&why-not?">A</a>

  <li>
      <a href="?<?= http_build_query(array('dir' => 'why&why-not?')) ?>">B</a>

</ul>

<hr>

<pre><?=

    htmlspecialchars(var_export($_GET, true))

?></pre>

如果您自己的计算机上有PHP,则可以将此文件保存到您的某个目录中(创建一个新目录),然后打开cmd.exe并切换到该目录并运行PHP开发服务器:

php -S 127.0.0.1:8080

它将显示一个可用于运行该示例的http URL.然后,您将看到浏览器如何在终端中与您的PHP脚本交互:

[Thu Jun 29 11:44:50 2023] PHP 8.2.7 Development Server (http://127.0.0.1:8080) started
[Thu Jun 29 11:44:55 2023] 127.0.0.1:42426 Accepted
[Thu Jun 29 11:44:55 2023] 127.0.0.1:42426 [200]: GET /
[Thu Jun 29 11:44:55 2023] 127.0.0.1:42426 Closing
[Thu Jun 29 11:44:58 2023] 127.0.0.1:42440 Accepted
[Thu Jun 29 11:44:58 2023] 127.0.0.1:42440 [200]: GET /?dir=why&why-not?
[Thu Jun 29 11:44:58 2023] 127.0.0.1:42440 Closing
[Thu Jun 29 11:45:00 2023] 127.0.0.1:49138 Accepted
[Thu Jun 29 11:45:00 2023] 127.0.0.1:49138 [200]: GET /?dir=dir%3Dwhy%26why-not%3F
[Thu Jun 29 11:45:00 2023] 127.0.0.1:49138 Closing

您可以通过按ctrl+c停止PHP开发Web服务器.

Php相关问答推荐

Laravel:启动下载并同时在Blade 中显示Flash消息

有条件的运费率基于购物车小计与WooPayments货币转换

如何使用php-amqplib连接到ActiveMQ Classic Docker镜像

从WooCommerce购物车和 checkout 页面自定义发货标签

创建一个新的可变产品及其属性以用于WooCommerce中的变体

PHP-带POST验证的for循环

向WooCommerce管理订单总额添加自定义总额行

Laravel 10.x在到达控制器之前将查询参数强制转换为正确的类型

扩展 WooCommerce 类触发未捕获错误:未找到WC_Coupon类

将自定义字段添加到管理产品 在 WooCommerce 3.2+ 中批量编辑

在 Woocommerce 邮箱订单中显示产品 GTIN

API 平台 - UI 服务器端点定义

Woocommerce 相关产品按其类别或排名数学主要类别

根据支付网关选项更改 WooCommerce Checkout 上的立即付款按钮文本

在 DateTime 或 DateTimeImmutable 对象上调用modify() 时是否必须使用空格?

避免在 WooCommerce 中多次触发挂钩函数

Windows 身份验证在 IIS 中验证什么?我可以在我的情况下禁用匿名身份验证吗?

Symfony 迁移判断器在我的工作中失控

PHP for each 函数打印 td

如何将 2021-04-08T22:25:09.335541Z 作为时间戳保存到 Laravel 中的数据库中?