我一直在尝试为数据库中的每一行创建一个唯一的页面。我的计划是创建一个dictionary.php?word=title
网址,我可以在其中显示该特定ID的说明和标题。我的数据库包含id
,term_title
和term_description
。
当涉及到PHP时,我已经超越了欧文,但我已经设法完成了这个:
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "dbname";
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
die("Cannot connect to database." . mysqli_connect_error());
}
if (isset($_GET['id']))
{
$id = (int) $_GET['id'];
$sql = 'SELECT * FROM dbname WHERE id = $id LIMIT 1 ';
}
$sql = "SELECT * FROM terms";
$result = $conn->query($sql);
mysqli_close($conn);
?>
我真的被困了,我不知道下一步是什么,我已将<a href='dictionary.php?=".$row["id"]."'>
添加到我想要链接的每个单词中,并且这已在主index.php
中正确显示文件(我的所有单词都列在<li>
。这是我的代码:
<?php
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "<a href='dictionary.php?=".$row["id"]."'><li class='term'><h4 class='term-title'>" . $row["term_title"]. "</h4></li></a>";
} else {
echo "No words in database.";
}
?>
如何创建此唯一页面,仅显示该ID的标题和说明?如何将?word=
添加到网址?
感谢您抽出宝贵时间帮助我。
答案 0 :(得分:1)
你走在正确的轨道上,ajhanna88的评论也是正确的:你想确保在正确的密钥中包含正确的密钥(&#34;#34;在这种情况下) URL。否则,您在不告诉页面该值的情况下发送值。
我确实看到了其他一些问题:
当您点击其中一个链接时,您需要将$ _GET [&#34; word&#34;]发送到dictionary.php。但是,在您的dictionary.php代码中,您正在通过&#34; id&#34;来搜索您的单词。而不是&#34;字&#34;。我猜你希望用户在你的词典中搜索类似&#34; celestial&#34;而不是&#34; 1598&#34;,所以试试这个:
if(isset($ _ GET [&#39; word&#39;])){ $ word = $ _GET [&#39; word&#39;]; $ sql =&#39; SELECT * FROM dbname WHERE word = $ word LIMIT 1&#39 ;; }
BUT!还要注意一个安全问题:您让用户将他们想要的任何内容放入您的查询中。看看classic illustration of SQL injection。要解决此问题,请将上面的第二行更改为:
$word = $conn->real_escape_string($_GET['word']);
另一个问题?您正在寻找完全这个词。相反,你可能想让它不区分大小写,所以&#34; Semaphore&#34;仍然会带来信号量&#34;。有很多方法可以做到这一点。根据我的经验,最简单的方法就是在比较之前将所有内容更改为小写。所以$word
任务现在应该是这样的:
$word = $conn->real_escape_string(strtolower($_GET["word"]));
您的查询应该如下所示:
$sql = "SELECT * FROM dbname WHERE word = LOWER('$word') LIMIT 1 ";
接下来!再往下,您用$sql
覆盖SELECT * FROM terms
变量,这完全取消了您的工作。如果用户没有提供要查找的单词,您似乎正在尝试显示所有单词。如果这是您尝试做的事情,请将该行放在else
声明中。
您的$result
看起来不错。现在你只需要使用它。第一步是像测试连接查询(if(!$conn)...
)时那样做,并检查它是否返回结果。
一旦获得了这些结果(或者一个结果,因为您的查询中有LIMIT 1
),您就会想要显示它们。此过程正是您在打印链接时所执行的操作。只是这一次,你预计只有一个结果。
这是我从您的代码中提出的真实基本页面:
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "dbname";
$conn=new mysqli($servername,$username,$password,$dbname);
if($conn->connect_errno){
die("Can't connect: ".$conn->connect_error);
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Dictionary!</title>
</head>
<body>
<?php
if(isset($_GET["word"])){
$word = $conn->real_escape_string(strtolower($_GET["word"]));
$sql = $conn->query("SELECT * FROM dictionary WHERE word=LOWER('".$word."') LIMIT 1");
if(!$sql){
echo "Sorry, something went wrong: ".$conn->error_get_last();
} else {
while($row=$sql->fetch_assoc()){
echo "<h2>".$row["word"]."</h2>";
echo "<p>".$row["definition"]."</p>";
}
}
} else {
$sql = $conn->query("SELECT word FROM dictionary");
if(!$sql){
echo "Sorry, something went wrong: ".$conn->error_get_last();
} else {
echo "<p>Here are all our words:</p><ul>";
while($row=$sql->fetch_assoc()){
echo "<li><a href=\"dictionary.php?word=".$row["word"]."\">".$row["word"]."</a></li>";
}
}
echo "</ul>";
}
?>
</body>
</html>
您还应该注意保持术语的一致性。为此,我的MySQL表有三列:id
,word
和definition
。由于您的网址使用term
,我删除了word
。根据我的经验,保持相同的术语是最好的。当您的应用程序变得更复杂时,它可以避免混淆。
最后,要回答关于创建单独页面的问题,您可以看到,对于这样的简单页面,您可能不需要单独的页面来显示定义和链接 - 只需要if / else语句。如果您想扩展if / else块中的内容,我建议您查看PHP include函数。
你有一个好的开始。坚持下去!