SWITCH上有两个不同的$ _GET变量(PHP)

时间:2013-12-23 16:29:37

标签: php variables get switch-statement

我使用Switch语句来更改页面内容,如下所示:

$id=$_GET['id'];
$n = $_GET['n'];          
switch ($id) {
    case 0:
        include("news.php");   
        break;      
    case 1:
        include("newsdetail.php?n=".$n);
        break;                                                                                            
    default:  
        include("news.php");
}

在news.php中,我展示了所有现有的新闻:

    while($myrow = mysqli_fetch_array($result)){
    echo "<table>
            <tr>
             <td><img width='200' heigth='115' src='images/".$myrow['smallimage'].".jpg'/></td>
             <td>
             <b>".$myrow['title']."</b>
              <br />
             <i>By ".$myrow['author'].", ".$myrow['date']."</i>
              <br />
             ".$myrow['preview']."<br>
             <a href='index.php?id=1&n=".$myrow['id']."'><b>READ</b></a>
             </td>
            </tr>
           </table>";
}

and insidetails.php:

    $idnews = $_GET['n'];
$sql = "SELECT * FROM news WHERE id='$idnews'";
$result = mysqli_query($db,$sql);
while($myrow = mysqli_fetch_array($result)){
    echo    $myrow['title']."<br>
            <i>Por ".$myrow['author']."</i><br>
            ".$myrow['date']."<br>
            <img src='images/".$myrow['bigimage'].".jpg'>
            ".$myrow['body']."";
}

当我尝试这个时,我得到一个像.../index.php?id=1&n=1这样的网址,但没有显示任何内容。单独测试时一切正常。 是否可以制作这样的东西并让它发挥作用?

2 个答案:

答案 0 :(得分:6)

你不能做这样的包括:

case 1:
    include("newsdetail.php?n=".$n);
    break;                                 

这将让PHP尝试查找名为newsdetail.php?n=1的文件,因此没有内容显示。

但没有必要这样做;你所包含的文件仍然可以访问$ _GET变量 - 比如$ _POST等等,它们是全局的,因此可以在你的代码中的任何地方访问。

只是要小心谨慎;您将$_GET中的值直接传递给查询。这将使您了解SQL注入问题。你应该看一下使用mysqli_或PDO,它们都可以帮助你编写更安全的代码。

答案 1 :(得分:1)

您的代码存在很多问题。我将尝试逐一解决这些问题。

  • 首先,您对SQL Injection持开放态度。一直用 准备好的陈述和参数化的查询。

  • 您正在将SQL与您的逻辑甚至演示代码混合在一起。你应该将它放在完全不同的类中,因为每个类应该只有一个责任。这也使您的代码更易于维护,并且您可以重复使用代码而不是复制粘贴代码(违反DRY原则)。这个概念的一个例子是MVC模式。

  • 要访问应用程序的不同部分,您应该使用front controller模式(看起来您已经这样做了)。这很好。现在您可以使用autoloader来自动加载所需的文件。我建议使用namespaces并使用PSR-0 autoloader

  • 现在您仍然需要将请求路由到正确的类方法(控制器,如果您使用的是MVC)。我建议您使用许多可用的库中的一个,例如klein。如果你想编写自己的代码,至少要查看一些路由库的代码,看看它们是如何做的。

我知道这很多,但我希望你花时间了解我上面描述的概念。如果您第一次不理解所有内容,请不要担心。如果您有任何疑问,请随时提出。