PHP 动态面包屑脚本在切换到 PHP 8.0 后创建了错误的 URL
PHP dynamic breadcrumb script creates wrong URL after switching to PHP 8.0
我正在使用 PHP 脚本创建动态面包屑导航。几年前我在另一个论坛上发现了它,它最初发布于 2006 年。我通过删除一些已弃用的功能对其进行了更新,到目前为止它运行良好。它从页面 URL:
创建面包屑
$path = $this->_homepath;
$html ='';
$html .= '<a href="https://www.myhomepage.com">Start</a>';
$parts = explode('/', $_SERVER['PHP_SELF']);
$partscount = count($parts);
for($i = 1; $i < ($partscount - 1); $i++) {
$path .= $parts[$i] . '/';
$title = $parts[$i];
if ($this->_usereplacements == true) {
reset($this->_replacements);
foreach($this->_replacements as $search => $replace) {
$title = str_replace($search, $replace, $title);
}
}
if ($this->_replaceunderlines == true) {
$title = str_replace('_', ' ', $title);
}
if ($this->_ucfirst == true) {
$title = ucfirst($title);
}
if ($this->_ucwords == true) {
$title = ucwords($title);
}
$html .= $this->_separator . '<a href="' . $path . '">' . $title . '</a>';
}
当前页面标题,即bradcrumb的最后一个元素,生成如下:
$title = '';
if ($title == '') {
$title = $parts[$partscount-1];
if ($this->_usereplacements == true) {
reset($this->_replacements);
foreach($this->_replacements as $search => $replace) {
$title = str_replace($search, $replace, $title);
}
}
if ($this->_removeextension == true) {
$title = substr($title, 0, strrpos($title, '.'));
}
if ($this->_replaceunderlines == true) {
$title = str_replace('_', ' ', $title);
}
if ($this->_ucfirst == true) {
$title = ucfirst($title);
}
if ($this->_ucwords == true) {
$title = ucwords($title);
}
}
$html .= $this->_separator . '<b>' . $title . '</b>';
我只复制了脚本的相关部分并保留了例如。函数声明。
从 PHP 7.4 切换到 8.0 后,我发现脚本有点乱。考虑一个包含 url 的页面:https://www.myhomepage.com/site1/site2/site3
对于 site1
的碎片,脚本现在生成 URL https://www.myhomepage.com/site1/site2/site1
代替 https://www.myhomepage.com/site1/
,而对于 site2
它显示 https://www.myhomepage.com/site1/site2/site1/site2
而不是 https://www.myhomepage.com/site1/site2/
。如您所见,整个路径 https://www.myhomepage.com/site1/site2/
始终作为前缀添加到面包屑的实际路径之前。
这东西看了两天还没找到解决办法。我想 PHP 8.0 中有一些变化导致了这种行为,但我没有在不兼容列表 (https://www.php.net/manual/de/migration80.php) 中找到任何线索。我打印了 §path
和 $title
,它们看起来应该是这样。在 for 循环中的每次迭代后回显 $html
时,它已经显示了错误的 URL。这就是为什么我认为 for 循环可能是这里的问题所在。你有什么建议吗?
如有任何帮助,我们将不胜感激。
我终于弄清楚是什么导致了脚本的奇怪行为。在面包屑构造函数的声明中有$this->_homepath = '/';
。稍后我分配 $path = $this->_homepath;
。当我回显 $path 时它是空的而不是显示前面提到的“/”。所以我直接设置 $path = '/';
现在一切都正常了。
我正在使用 PHP 脚本创建动态面包屑导航。几年前我在另一个论坛上发现了它,它最初发布于 2006 年。我通过删除一些已弃用的功能对其进行了更新,到目前为止它运行良好。它从页面 URL:
创建面包屑$path = $this->_homepath;
$html ='';
$html .= '<a href="https://www.myhomepage.com">Start</a>';
$parts = explode('/', $_SERVER['PHP_SELF']);
$partscount = count($parts);
for($i = 1; $i < ($partscount - 1); $i++) {
$path .= $parts[$i] . '/';
$title = $parts[$i];
if ($this->_usereplacements == true) {
reset($this->_replacements);
foreach($this->_replacements as $search => $replace) {
$title = str_replace($search, $replace, $title);
}
}
if ($this->_replaceunderlines == true) {
$title = str_replace('_', ' ', $title);
}
if ($this->_ucfirst == true) {
$title = ucfirst($title);
}
if ($this->_ucwords == true) {
$title = ucwords($title);
}
$html .= $this->_separator . '<a href="' . $path . '">' . $title . '</a>';
}
当前页面标题,即bradcrumb的最后一个元素,生成如下:
$title = '';
if ($title == '') {
$title = $parts[$partscount-1];
if ($this->_usereplacements == true) {
reset($this->_replacements);
foreach($this->_replacements as $search => $replace) {
$title = str_replace($search, $replace, $title);
}
}
if ($this->_removeextension == true) {
$title = substr($title, 0, strrpos($title, '.'));
}
if ($this->_replaceunderlines == true) {
$title = str_replace('_', ' ', $title);
}
if ($this->_ucfirst == true) {
$title = ucfirst($title);
}
if ($this->_ucwords == true) {
$title = ucwords($title);
}
}
$html .= $this->_separator . '<b>' . $title . '</b>';
我只复制了脚本的相关部分并保留了例如。函数声明。
从 PHP 7.4 切换到 8.0 后,我发现脚本有点乱。考虑一个包含 url 的页面:https://www.myhomepage.com/site1/site2/site3
对于 site1
的碎片,脚本现在生成 URL https://www.myhomepage.com/site1/site2/site1
代替 https://www.myhomepage.com/site1/
,而对于 site2
它显示 https://www.myhomepage.com/site1/site2/site1/site2
而不是 https://www.myhomepage.com/site1/site2/
。如您所见,整个路径 https://www.myhomepage.com/site1/site2/
始终作为前缀添加到面包屑的实际路径之前。
这东西看了两天还没找到解决办法。我想 PHP 8.0 中有一些变化导致了这种行为,但我没有在不兼容列表 (https://www.php.net/manual/de/migration80.php) 中找到任何线索。我打印了 §path
和 $title
,它们看起来应该是这样。在 for 循环中的每次迭代后回显 $html
时,它已经显示了错误的 URL。这就是为什么我认为 for 循环可能是这里的问题所在。你有什么建议吗?
如有任何帮助,我们将不胜感激。
我终于弄清楚是什么导致了脚本的奇怪行为。在面包屑构造函数的声明中有$this->_homepath = '/';
。稍后我分配 $path = $this->_homepath;
。当我回显 $path 时它是空的而不是显示前面提到的“/”。所以我直接设置 $path = '/';
现在一切都正常了。