使用PHP在数据库中每行的唯一页面

时间:2017-12-01 03:59:26

标签: php html mysql

我一直在尝试为数据库中的每一行创建一个唯一的页面。我的计划是创建一个dictionary.php?word=title网址,我可以在其中显示该特定ID的说明和标题。我的数据库包含idterm_titleterm_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=添加到网址?

感谢您抽出宝贵时间帮助我。

1 个答案:

答案 0 :(得分:1)

你走在正确的轨道上,ajhanna88的评论也是正确的:你想确保在正确的密钥中包含正确的密钥(&#34;#34;在这种情况下) URL。否则,您在不告诉页面该值的情况下发送值。

我确实看到了其他一些问题:

  1. 当您点击其中一个链接时,您需要将$ _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 ";

  2. 接下来!再往下,您用$sql覆盖SELECT * FROM terms变量,这完全取消了您的工作。如果用户没有提供要查找的单词,您似乎正在尝试显示所有单词。如果这是您尝试做的事情,请将该行放在else声明中。

  3. 您的$result看起来不错。现在你只需要使用它。第一步是像测试连接查询(if(!$conn)...)时那样做,并检查它是否返回结果。

  4. 一旦获得了这些结果(或者一个结果,因为您的查询中有LIMIT 1),您就会想要显示它们。此过程正是您在打印链接时所执行的操作。只是这一次,你预计只有一个结果。

  5. 这是我从您的代码中提出的真实基本页面:

    <?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表有三列:idworddefinition。由于您的网址使用term,我删除了word。根据我的经验,保持相同的术语是最好的。当您的应用程序变得更复杂时,它可以避免混淆。

    最后,要回答关于创建单独页面的问题,您可以看到,对于这样的简单页面,您可能不需要单独的页面来显示定义和链接 - 只需要if / else语句。如果您想扩展if / else块中的内容,我建议您查看PHP include函数。

    你有一个好的开始。坚持下去!