我使用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
这样的网址,但没有显示任何内容。单独测试时一切正常。
是否可以制作这样的东西并让它发挥作用?
答案 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。如果你想编写自己的代码,至少要查看一些路由库的代码,看看它们是如何做的。
我知道这很多,但我希望你花时间了解我上面描述的概念。如果您第一次不理解所有内容,请不要担心。如果您有任何疑问,请随时提出。