【问题标题】:php syntax: switch / case with an undefined stringphp 语法:switch / case 带有未定义的字符串
【发布时间】:2023-04-07 14:33:01
【问题描述】:

我有这段代码可以将任何项目加载到 ../content/interieur/interieur.php 的页面中:

<ul>
<?
if (glob('content/interieur/*.txt')) {
$files = glob('content/interieur/*.{txt}', GLOB_BRACE);

foreach ($files as $file) {

    $info = pathinfo ($file);
    $file_name = basename($file,'.'.$info['extension']);
    ?>

    <li class="crop"><a href="?topic=<?=$file_name?>" ><img src="content/interieur/<?=$file_name,'.jpg'?>" /></a>
    <p><?=include $file?></p>
    <hr /> 
    </li>
<? } //end foreach

} //end if 

else {?>
<li><img src="./img/404.jpg" />
<p><b>Sorry, </b>Geen projecten gevonden!</p>
</li>

<? ;} //end else

?> 

每个项目都应该有一个同名的.txt、.jpg和.html,然后就可以正常工作了。

接下来,我希望能够单击项目并将具有该名称的项目内容加载到同一个 div 中。因此,在我的 index.php 中,我有以下代码:

<div id="mainContent">

        <?
            $files = glob('content/interieur/*.{html}', GLOB_BRACE);
            $info = pathinfo ($file);
            $file_name = basename($file,'.'.$info['extension']);

            if (isset ($_GET["topic"])) {

                foreach ($files as $file) {
                    switch($_GET['topic']){
                        case $file_name: include $file; break;
                        }
                    }

                switch($_GET['topic']){                 
                    case 'home': include("content/home.html" ); break;
                    case 'werkwijze': include("content/werkwijze.html"); break;
                    (et cetera)
                    default: include("content/home.html"); break;
                }
            }
            else
            {
                include("content/home.html");
            }
        ?>  


</div>

我不知道的是如何将 switch / case 语句与为每个附加项目执行此操作的规则结合起来。就像现在一样,它不会返回任何错误,但是当我单击项目时,div 会加载默认大小写(home.html)。

那么,如何将这些组合成一个“开关”?我认为大部分代码是正确的,但它可能重定向到错误的文件夹,因此也许我需要使用路径(/comtent/interieur)定义“包含”命令,但我不知道它是如何工作的...... .

看看:http://www.wgwd.nl/bedaux 并点击“投影 -> 内部”

希望这是一个明确的问题 ;-) 谢谢!

编辑: 感谢 var_dump 提示!我试过这个,当我点击“project1”时我得到的字符串确实是“project1”,所以得到正确的?主题工作正常。它只是没有将我引向 'project1.html。

所以基本上我认为我需要的是将未定义的情况与其他情况放在一起的东西:

            if (isset ($_GET["topic"])) {

                    case $file_name: include $file; break;
                    case 'home': include("content/home.html" ); break;
                    case 'werkwijze': include("content/werkwijze.html"); break;
                    (et cetera)
                    default: include("content/home.html"); break;
                }
            }
            else
            {
                include("content/home.html");
            }

但是这当然行不通

或者:代码很好,我需要添加一个路径,比如:

foreach ($files as $file) {
    switch($_GET['topic']){
     case $file_name: include './content/interieur/'$file; break;
    }
}

但我猜语法是错误的.....

编辑 2 - 已解决:

我明白了!

查看代码的第一部分,我在其中定义了 $files,然后是第一个开关:

 <?
        $files = glob('content/interieur/*.{html}', GLOB_BRACE);
        $info = pathinfo ($file);
        $file_name = basename($file,'.'.$info['extension']);

        if (isset ($_GET["topic"])) {

            foreach ($files as $file) {
                switch($_GET['topic']){
                    case $file_name: include $file; break;
                    }
                }

我注意到我在 foreach 语句中指的是 $file 在它被创建之前(你是这么说的吗?)......所以显然当我这样做时:

        <?
            $files = glob('content/interieur/*.{html}', GLOB_BRACE);

            if (isset ($_GET["topic"])) {

                $file_included=0;
                foreach ($files as $file) {
                    $info = pathinfo ($file);

一切正常! 谢谢帮忙!

【问题讨论】:

  • 在混合 php 和 html 时尝试使用 php 模板语法:php.net/manual/en/control-structures.alternative-syntax.php - 通常,您应该尽可能避免将程序逻辑与 html 混合。查看基于 MVC 的框架。他们还为你做了很多肮脏的工作。 phpframeworks.com
  • 另外, = openers 可能会在 php 驱动的平台
  • 谢谢,我看看能不能写出更兼容 php 4.x 的代码! ...一旦我解决了这个问题;-)

标签: php switch-statement


【解决方案1】:

替换为以下部分

 $file_included=0;
    foreach ($files as $file) {
                        switch($_GET['topic']){
                            case $file_name: include $file;$file_included=1; break;
                            }
                        }

    if($file_included==0){
                    switch($_GET['topic']){                 
                        case 'home': include("content/home.html" ); break;
                        case 'werkwijze': include("content/werkwijze.html"); break;
                        (et cetera)
                        default: include("content/home.html"); break;
                    }
    }

【讨论】:

  • 您的代码运行良好,谢谢! (为什么这行得通,顺便说一句?)但是,单击链接仍然带我回家 ;-) 我编辑了我的问题,我相信它找不到正确的 .html 文件,因为它在错误的文件夹中查找,并且我不知道在 'include' 和 '$file' 之间放置路径的语法...
  • include('content/'.$file);这就是你要问的?
【解决方案2】:

也许不是 100% 的答案,而是太多的文字无法放在评论中

foreach ($files as $file) {
    switch($_GET['topic']){
         case $file_name: include $file; break;
    }
}

首先,具有一个条件的开关基本上是if,在这个循环中$_GET$file_name 都设置在循环之外。所以这个比较要么适用于所有文件,要么不适用。所以它真的是这样说的:

if ($_GET['topic'] == $file_name) {
    foreach ($files as $file) {
         include $file;
    }
}

关于你总是得到默认的“家”这一点,我猜这是因为你最终出现在default 语句中。你试过var_dump($_GET['topic']) 看看里面到底有什么吗?也许您没有收到您期望的价值。

【讨论】:

  • 谢谢,我添加了 var_dump 来看看我得到了什么。结果如我所料,所以问题一定出在其他地方。不过,我在原帖中改写了这个问题。
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 2020-12-06
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多