【问题标题】:Two different $_GET variables on SWITCH (PHP)SWITCH (PHP) 上的两个不同的 $_GET 变量
【发布时间】:2013-12-23 16:29:36
【问题描述】:

我正在使用 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>";
}

还有 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&amp;n=1 的网址,但没有显示任何内容。单独测试时一切正常。 有没有可能做出这样的事情并让它发挥作用?

【问题讨论】:

  • 我认为您不能将查询字符串传递给include,但您可以只包含该文件,然后使用$_GET 在该文件中再次获取n
  • @FDL 确实是正确的。 file_get_contents 会起作用,但你不包括它。

标签: php variables get switch-statement


【解决方案1】:

你不能这样做:

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

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

但是没有必要那样做;您包含的文件仍然可以访问 $_GET 变量 - 例如 $_POST 等,它们是全局的,因此可以在代码中的任何位置访问。

请注意,请注意;您将来自 $_GET 的值直接传递到查询中。这会让您面临 SQL 注入问题。您应该考虑使用 mysqli_ 或 PDO,它们都可以帮助您编写更安全的代码。

【讨论】:

  • 我只删除了 'n=".$n' 并且工作得很好!感谢您的澄清和提醒,我会做一些事情。
  • 很高兴能帮上忙。如果您需要更多帮助,请随时提出!
【解决方案2】:

您的代码存在很多问题。我会尽量一一解决。

  • 首先,您对SQL Injection 非常开放。始终使用 准备好的语句和参数化查询。

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

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

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

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

【讨论】:

  • 你给了我很多功课哈哈非常感谢你的信息,我有很多空闲时间,所以我会先阅读这篇文章以继续编写我的页面。谢谢!
猜你喜欢
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 2012-03-30
相关资源
最近更新 更多