65.9K
CodeProject 正在变化。 阅读更多。
Home

PHP 初学者分步教程 - 从零开始创建您的 PHP 程序:基本认证、会员和 CRUD 功能

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (84投票s)

2014 年 4 月 16 日

CPOL

22分钟阅读

viewsIcon

2358262

面向初学者的 PHP 教程

引言

对创建自己的网站感兴趣吗?有没有想过拥有一个具有登录/注销功能的网站有多酷?想学习如何在数据库中创建、读取、更新或删除 (CRUD) 记录吗?您是否在之前的教程中迷失方向了?那么,我将教您如何从零开始创建一个,您将了解代码工作的每一个细节。如果您是后端 Web 开发的新手,本教程适合您。我将详细解释所有内容,以便您不必研究所使用的特定方法。为了保持简单,我们将不使用任何框架。此外,我不会专注于网站设计,因为我们追求的是功能,尽管设计很容易实现。我们将做的是一个简单的项目列表,当用户登录时。

*无耻的广告*

您也可以在这里查看我的 ASP.NET MVC 5 从零开始版本:http://kristianguevara.net/creating-your-asp-net-mvc-5-application-from-scratch-for-beginners-using-entity-framework-6-and-identity-with-crud-functionalities/

我还有我的 NodeJS/Express 与 MongoDB 版本,地址在这里:http://kristianguevara.net/step-by-step-nodejs-tutorials-beginners-creating-your-nodejs-app-from-scratch-using-expressjs-with-authentication-and-crud-functionalities-with-mongoose/

先决条件

在本教程中,我们将使用一些语言来增强我们的开发。 如果您真的不知道我将提到的任何内容,没关系。只需尝试跟着流程走即可。它们很容易理解,因为我不会使用高级方法。当然,由于这是为网站创建后端服务,您必须至少了解以下内容的非常非常非常基础的知识

  1. HTML/CSS - 当然,在 Web 开发中,这永远不会从列表中消失。我为什么要费心把它放在这里?哈哈。
  2. JavaScript - 用于重定向脚本。暂时不需要 jQuery
  3. mySQL - 最基本的查询语言。我们将使用它来实现我们的 CRUD(创建、读取、更新、删除)功能。

对于软件,您需要以下内容

  1. 文本编辑器 - Sublime Text/Notepad++ 即可。这将作为我们的编码环境。
  2. XAMPP - 这将是我们的 Web 服务器。我们将在其中保存网站文件并将数据保存到数据库中。
  3. 网络浏览器 - 您可以使用任何浏览器,只要它不会占用您太多内存。

确保已安装这三个程序。如果未完成安装,请勿继续。我已经提供了超链接以加快速度。

本次主题的议程

  1. 利用 SQL 中的 CRUD 语句 - 在数据库中创建、读取、更新和删除记录。
  2. 简单认证和安全 - 登录和注销、处理未经授权的用户和限制访问。
  3. 简单的时间和日期操作 - 显示时间和日期发布并监控您的帖子。
  4. 显示公共和私人数据 - 仅显示登录用户和公众的信息。
  5. 总结与回顾 - 最终输出和一些说明。常见问题也放在这里。

主题内容

注意:如果您在某个部分停止或想快速搜索,只需按 Ctrl + f 并查找您上次停止的数字即可继续。

  1. 设置您的服务器
  2. 创建公共 HTML 页面
  3. 创建数据库及其表
  4. 向数据库添加用户
  5. 用户登录:认证
  6. 为已登录用户设置主页和注销
  7. 测试页面安全性
  8. 向列表添加数据 - 仅限用户访问
  9. 在主页显示数据
  10. 编辑数据
  11. 删除数据
  12. 显示公共数据
  13. 总结与回顾

确保您按时间顺序操作。除非您了解代码,否则不要在未完成前一部分的情况下继续。

开始前的一些提醒

注意:如果图片看起来不清晰/模糊,您可以点击它以查看其放大尺寸。另外,请原谅我使用图片而不是原始文本来显示代码,因为我的 WordPress 订阅无法正确格式化,但别担心,我将在本教程结束时上传最终产品以供您核对。

1) 设置您的服务器

现在您已经准备就绪,按照编程的基础,让我们从在服务器上创建简单的“hello world”问候语开始。

首先,转到您安装 XAMPP 的目录(通常在 C:\xampp)。从那里,转到 htdocs 文件夹(通常在 C:\xampp\htdocs)并创建一个名为“MyFirstWebsite”的文件夹。

从这一步开始,您已经为您的网站创建了一个本地 URL。该文件夹将用于提供所有网站文件(.html.php.css.js 等)。打开您的文本编辑器,让我们开始吧!

我使用 Sublime Text 作为我的文本编辑器。如果您使用的是 Notepad++ 或其他任何编辑器,没关系。这并不是一个重要的因素,只是个人偏好您喜欢使用哪一个。

我们将创建一个基本的 HTML 页面,并使用基本的 PHP 语法从服务器显示“hello world”。然后我们输入以下语法

<html>
    <head>
    <title>My first PHP Website</title>
    </head>
    <body>
        <?php
            echo "<p>Hello World!</p>";
        ?>
    </body>
</html>

将文件保存到“MyFirstWebSite”文件夹,并将其命名为“index.php”。(目录如图片顶部所示。)

现在您有了文件。现在让我们打开您的 XAMPP 控制面板。如果它没有出现在您的桌面上,它位于您的 XAMPP 文件夹中,如图像所示

Untitled

Untitled

现在它在那里,通过单击操作列上的“启动”按钮来运行您的 Apache 和 mySQL。您应该看到一个随机的 PID(s) 和默认端口号。Apache 是我们的 Web 服务器的名称,它将处理所有文件并充当与 Web 浏览器的通信,而 MySQL 是我们的数据库,它将存储我们所有的信息。

打开您的网络浏览器,并在地址栏中键入 localhost。您应该会看到 XAMPP 的菜单。

如果这是您第一次运行它,它会询问您喜欢哪种语言,只需选择它,它就会将您带到菜单。如果您注意到目录是 localhost/xampp,即使您输入 localhost,它也会将您带到默认页面。

如果出现此情况,则表示您的 XAMPP 服务器已启动并运行。现在让我们尝试运行您刚刚放置的网站。尝试键入 localhost/MyFirstWebsite 它应该与下图相同。

如果您会注意到 URL 是 MyFirstWebsite,它是从 htdocs 文件夹派生而来的,它会自动读取名为“index”(无论是 index.htmlindex.aspx 等)的文件,这些文件作为默认页面。键入 localhost/MyfirstWebsite/index.php 是完全相同的。您还可以通过简单地重命名文件夹来为 URL 创建自定义名称,但我们还是坚持使用 MyFirstWebsite

注意:如果您没有名为 index 的文件并输入了 URL,您将收到 404 错误,因为服务器上没有该文件。如果您有其他未命名为 index. 的文件,则必须指定具体的文件名。例如:localhost/MyfirstWebsite/page.php。

2) 创建公共 HTML 页面

接下来,让我们重新修改我们的网站,并添加一个注册链接,用户可以在其中注册,以及注册后的登录页面。让我们用以下代码修改我们的主页

index.php

<html>
    <head>
        <title>My first PHP Website</title>
    </head>
    <body>
        <?php
            echo "<p>Hello World!</p>";
        ?>
        <a href="login.php"> Click here to login 
        <a href="register.php"> Click here to register 
    </body>
</html> 

如您所见,我们只添加了两个链接,分别是用于登录和注册的。让我们先创建注册页面。

register.php

<html>
    <head>
        <title>My first PHP Website</title>
    </head>
    <body>
        <h2>Registration Page</h2>
        <a href="index.php">Click here to go back<br/><br/>
        <form action="register.php" method="POST">
           Enter Username: <input type="text" 
           name="username" required="required" /> <br/>
           Enter password: <input type="password" 
           name="password" required="required" /> <br/>
           <input type="submit" value="Register"/>
        </form>
    </body>
</html>

如您所见,这只是一个基本表单,用户可以在其中输入他/她的凭据。现在是登录页面

提示:只需复制粘贴相同的代码即可加快速度。

login.php

<html>
    <head>
        <title>My first PHP Website</title>
    </head>
    <body>
        <h2>Login Page</h2>
        <a href="index.php">Click here to go back<br/><br/>
        <form action="checklogin.php" method="POST">
           Enter Username: <input type="text" 
           name="username" required="required" /> <br/>
           Enter password: <input type="password" 
           name="password" required="required" /> <br/>
           <input type="submit" value="Login"/>
        </form>
    </body>
</html>

基本上,它与 register.php 中的代码相同,但所做的更改是带下划线的那些。

点击此处查看完整的 login.php 代码。

再次尝试运行 localhost/MyFirstWebsite,您的页面应该如下所示

index.php

register.php

3) 创建数据库及其表

现在我们有了面向公众的基本页面。让我们继续数据库部分。首先,输入 localhost/phpmyadmin。这将带您进入 phpmyadmin 主页

localhost/phpmyadmin

从那里,转到顶部的“数据库”选项卡,然后在中间的文本框中,键入 first_db,然后单击“创建”。将“字符集”保留不变。

您已成功创建了您的第一个数据库。现在,让我们创建一个表,以便我们可以在其中注册用户和显示信息。首先,单击左侧的 first_db,然后创建一个名为 users 的表,包含 3 列,然后单击执行

对于表的结构,请确保具有以下字段,然后单击保存

  • 格式:列名 - 类型 - 长度 - 空属性 - 其他属性
  • id - INT - N/A - 非空 - 自动递增
  • username - varchar - 50 - 非空
  • password - varchar - 50 - 非空

如果未指定,所有内容均保留默认值。

注意:您需要向右滚动才能看到 auto_increment。我只是编辑了图片以适应 A_I 字段。

接下来,创建另一个名为 list 的表,包含 7 列,其表结构如下

  • id - INT - N/A - 非 NULL - 自动递增
  • details - 文本 - 非 NULL
  • date_posted - varchar - 30 - 非 NULL
  • time_posted - Time - 非 NULL
  • date_edited - varchar - 30 - 非 NULL
  • time_edited - Time - 非 NULL
  • public - varchar - 5 - 非 NULL

4) 将用户添加到数据库

现在我们已经有了表格。让我们进入有趣的部分,让您的注册页面投入使用。在您的 registration.php 中,在 html 代码下面添加以下内容

register.php

<html>
    <head>
        <title>My first PHP Website</title>
    </head>
    <body>
        <h2>Registration Page</h2>
        <a href="index.php">Click here to go back<br/><br/>
        <form action="checklogin.php" method="POST">
           Enter Username: <input type="text" 
           name="username" required="required" /> <br/>
           Enter password: <input type="password" 
           name="password" required="required" /> <br/>
           <input type="submit" value="Register"/>
        </form>
    </body>
</html>

<?php
if($_SERVER["REQUEST METHOD"] == "POST"){
    $username = mysql_real_escape_string($_POST['username']);
    $password = mysql_real_escape_string($_POST['password']);

    echo "Username entered is: ". $username . "<br />";
    echo "Password entered is: ". $password;
}
?>

以下是代码的解释

  • $_SERVER["REQUEST_METHOD"] == "POST" - 检查在单击提交按钮时表单是否收到了 POST 方法。POST 方法是在 html 中通过 method="POST" 创建的。单击此处查看表单方法参考。
  • $_POST[''] - 获取来自 POST 方法的名称。这只是简单地根据表单中的名称获取输入。在我们的例子中,它是用户名和密码。
  • mysql_real_escape_string() - 将输入封装为 string 以防止 SQL 注入。这确保您的 string 不会转义不必要的字符。单击此处了解有关 SQL 注入的更多信息。

现在尝试转到您的 register.php 并尝试输入任何内容,然后单击“Register”。在我的情况下,我将用户名设置为 xtian,密码设置为 123456。它应该显示下面的输入。这是我的示例

Untitled

在这一部分,您应该已经了解了如何从表单获取输入。现在将其添加到数据库中。在您的 register.php 中,添加以下代码

register.php

<html>
    <head>
        <title>My first PHP Website</title>
    </head>
    <body>
        <h2>Registration Page</h2>
        <a href="index.php">Click here to go back<br/><br/>
        <form action="register.php" method="post">
           Enter Username: <input type="text" 
           name="username" required="required" /> <br/>
           Enter Password: <input type="password" 
                            name="password" required="required" /> <br/>
           <input type="submit" value="Register"/>
        </form>
    </body>
</html>


<?php
if($_SERVER["REQUEST_METHOD"] == "POST"){
    $username = mysql_real_escape_string($_POST['username']);
    $password = mysql_real_escape_string($_POST['password']);
    $bool = true;
   
    mysql_connect("localhost", "root","") or die(mysql_error());      //Connect to server
    mysql_select_db("first_db") or due("Cannot connect to database"); //Connect to database
    $query = mysql_query("Select * from users"); //Query the users table
    while($row = mysql_fetch_array($query)) //display all rows from query
    {
        $table_users == $row['username']; // the first username row 
                                          // is passed on to $table_users, 
                                          // and so on until the query is finished
        if($username == $table_users)     // checks if there are any matching fields
        {
            $bool = false; // sets bool to false
            Print '<script>alert("Username has been taken!");</script>';     //Prompts the user
            Print '<script>window.location.assign("register.php");</script>";//redirects to 
                                                                             //register.php
        }
    }

    if($bool) // checks if bool is true
    {
        mysql_query("INSERT INTO users (username, password) _
                     VALUES ('$username', 'password')"); // inserts value into table users
        Print '<script>alert("Successfully Registered!");</script>';      // Prompts the user
        Print '<script>window.location.assign("register.php");</script>'; // redirects to 
                                                                          // register.php
    }
}
?>

点击此处查看完整的 register.php 文件

以下是代码的解释

  • mysql_connect("服务器名称","服务器用户名","服务器密码") - 用于连接到我们的 XAMPP 服务器的语法。localhost127.0.0.1 是服务器的名称。默认用户名为 root,默认无密码。
  • mysql_select_db("数据库名称") - 选择要使用的数据库。
  • or die('消息') - 如果条件不满足,则显示错误消息。
  • mysql_query('sql query') - 执行 SQL 查询。单击此处获取一些 SQL 查询示例。再次强调,我在这里不讨论 mySQL。
  • mysql_fetch_array('query') - 提取表中所有查询以显示或操作数据。它放置在一个 while 循环中,以便它将查询所有行。请注意,每个循环只查询 1 行,这就是为什么 while 循环是必需的。
  • $row['行名'] - 当前查询中列的值。它表示为一个数组。在我们的例子中,$row 是循环中行的变量名。

尝试您之前输入的那些内容,看看会发生什么。它应该提示您已成功注册。尝试访问 phpmyadmin 并查看您的 users 表:

恭喜!现在您知道如何将数据添加到具有数据验证的数据库中。

5) 用户登录:认证

现在是登录页面。让我们创建一个名为 checklogin.php 的新文件。原因是回到我们的 login.php,我们的表单有一个名为“checklogin.php”的动作,特别是 <form action = "checklogin.php" method= "POST">。如果您会注意到在 register.php 中,它也在 register.php 上,因为后端也是在同一个文件中完成的。

现在让我们用以下语法编写 checklogin.php

checklogin.php

<?php
    session_start();
    $username = mysql_real_escape_string($_POST['username']);
    $password = mysql_real_escape_string($_POST['password']);
    $bool = true;

    mysql_connect("localhost", "root", "") or die (mysql_error());     //Connect to server
    mysql_select_db("first_db") or die ("Cannot connect to database"); //Connect to database
    $query = mysql_query("Select * from users WHERE username='$username'"); // Query the 
                                                                            // users table
    $exists = mysql_num_rows($query); //Checks if username exists
    $table_users = "":
    $table_password = "";
    if($exists > 0) //IF there are no returning rows or no existing username
    {
       while($row = mysql_fetch_assoc($query)) // display all rows from query
       {
          $table_users = $row['username'];     // the first username row is 
                                               // passed on to $table_users, 
                                               // and so on until the query is finished
          $table_password = $row['password'];  // the first password row is passed on 
                                               // to $table_password, and so on 
                                               // until the query is finished
       }
       if(($username == $table_users) && ($password == $table_password)) // checks if there 
                                                                  // are any matching fields
       {
          if($password == $table_password)
          {
             $_SESSION['user'] = $username;    // set the username in a session. 
                                               // This serves as a global variable
             header("location: home.php");     // redirects the user to the authenticated 
                                               // home page
          }
       }
       else
       {
        Print '<script>alert("Incorrect Password!");</script>';        // Prompts the user
        Print '<script>window.location.assign("login.php");</script>'; // redirects to login.php
       }
    }
    else
    {
        Print '<script>alert("Incorrect username!");</script>';        // Prompts the user
        Print '<script>window.location.assign("login.php");</script>'; // redirects to login.php
    }
?>

点击此处获取完整的 checklogin.php 代码

以下是代码的解释。(有些前面已经解释过,所以无需重复)

  • session_start() - 启动会话。这通常在已认证的页面上完成。我们使用它的原因是它是 $_SESSION[''] 所必需的。
  • mysql_num_rows() - 这会返回一个整数。它根据查询统计所有行。
  • $_SESSION['name'] - 作为整个会话的会话名称。这与面向对象编程中的 public 变量相对相似。我们将使用它来验证用户是否已认证。

现在尝试使用错误的用户名和密码测试您的输入。它应该返回所需的提示。测试后,尝试输入正确的值。它应该会带您进入 home.php

注意home.php 尚不存在,因此会产生 404 错误。

6) 为已登录用户设置主页和注销

现在我们已经通过认证,让我们创建我们的主页 (home.php),使用以下语法

home.php

<html>
    <head>
        <title>My first PHP Website</title>
    </head>
    <?php
    session_start(); //starts the session
    if($_SESSION['user']){ // checks if the user is logged in  
    }
    else{
        header("location: index.php"); // redirects if user is not logged in
    }
    $user = $_SESSION['user']; //assigns user value
    ?>
    <body>
        <h2>Home Page</h2>
        <p>Hello <?php Print "$user"?>!</p> <!--Displays user's name-->
        <a href="logout.php">Click here to go logout</a><br/><br/>
        <form action="add.php" method="POST">
            Add more to list: <input type="text" name="details" /> <br/>
            Public post? <input type="checkbox" name="public[]" value="yes" /> <br/>
            <input type="submit" value="Add to list"/>
        </form>
    	<h2 align="center">My list</h2>
    	<table border="1px" width="100%">
		<tr>
			<th>Id</th>
			<th>Details</th>
			<th>Edit</th>
			<th>Delete</th>
		</tr>
		</table>
	</body>
</html>

以下是代码的解释

  • session_start() - 基本启动会话。$_SESSION[''] 所必需的。
  • header() - 重定向用户。

尝试刷新您的浏览器,它应该如下所示

现在我们有了我们的主页,让我们尝试创建我们的 logout.php 并测试用户会话是否已关闭。我们要做的就是,如果用户已注销,则用户不应访问 home.php。所以这是 logout.php 的简单语法

logout.php

<?php
    session_start();
    session_destroy();
    header("location:index.php");
?>

语法很简单。session_destroy() 只是简单地移除所有会话,这意味着 $_SESSION[''] 的值将被移除,header() 将简单地将其重定向到主页。

7) 测试页面安全性

现在尝试刷新 home.php 并点击注销。现在尝试点击浏览器的后退按钮,看看会发生什么

如您所见,它不会将您重定向到 home.php,因为您已注销。现在进行第二个测试,尝试手动输入地址 localhost/MyFirstWebsite/home.php。同样的情况也应该发生。由于我们已注销,即使手动输入地址也无法访问授权页面。我们所做的是一个简单的安全机制,我们将未经授权的用户重定向回公共页面。

现在尝试再次登录,让我们回到 home.php

8) 向列表中添加数据 - 仅限用户访问

在下一步中,我们来创建添加项目到列表的功能。正如您将从表单中注意到的,它写为 <form action="add.php" method="POST">,这意味着我们的 HTTP POST 请求发送到 add.php,因此,我们创建了 add.php,其语法如下

<?php
    session_start();
    if($_SESSION['user']){
    }
    else{ 
       header("location:index.php");
    }

    $details = mysql_real_escape_string($_POST['details']);
    $time = strftime("%X"); //time
    $date = strftime("%B %d, %Y"); //date

    Print "$time - $date - $details";
?>

请注意,这还不是我们官方的 add.php 语法,我只是演示时间和日期语法以及获取您的输入。

现在返回到您的 home.php,尝试添加一个项目,然后单击“添加到列表”。

这应该是 add.php 上的以下输出

如您所见,我们有当前时间、日期和您的输入。以下是代码的解释

  • strftime() - 根据您放置的格式获取时间
  • %X - 当前系统时间
  • %B - 当前系统月份
  • %d - 当前系统日期
  • %Y - 当前系统年份

现在让我们修改 add.php,并将以下数据以及来自复选框的数据添加到数据库中。

add.php

<?php
    session_start();
    if($_SESSION['user']){
    }
    else{ 
       header("location:index.php");
    }

    if($_SERVER['REQUEST_METHOD'] == "POST")
    {
       $details = mysql_real_escape_string($_POST['details']);
       $time = strftime("%X"); //time
       $date = strftime("%B %d, %Y"); //date
       $decision = "no";
   
       mysql_connect("localhost","root","") or die(mysql_error());       //Connect to server
       mysql_select_db("first_db") or die("Cannot connect to database"); //Connect to database
       foreach($_POST['public'] in $each_check)                          //gets the data from
                                                                         //the checkbox
       {
          if($each_check != null){ //checks if checkbox is checked
             $decision = "yes"; // sets the value
          }
       }

       mysql_query("INSERT INTO list(details, date_posted, time_posted, public) _
                    VALUES ('$details','$date','$time','$decision')"); //SQL query
       header("location:home.php");
    }
    else
    {
       header("location:home.php"); //redirects back to home
    }
?>

点击此处获取完整的 add.php 代码

这里有一个小解释

  • foreach() - 获取复选框的值。您会注意到,表单中的复选框格式是 name="checkbox[]"。要从复选框获取数据,它必须被实例化为一个数组。这样做可以从多个复选框中获取数据。

现在尝试输入一些数据并点击“添加到列表”。在我的例子中,我将再次使用“完成”。让我们前往 phpmyadmin,看看数据是否已添加。这是我的结果

localhost/phpmyadmin

9) 在主页显示数据

现在我们已经看到数据已成功添加,接下来让我们在主页上显示数据。让我们修改 home.php,并添加一些日期列

home.php

<html>
    <head>
        <title>My first PHP Website</title>
    </head>
    <?php
    session_start(); //starts the session
    if($_SESSION['user']){ // checks if the user is logged in  
    }
    else{
        header("location: index.php"); // redirects if user is not logged in
    }
    $user = $_SESSION['user']; //assigns user value
    ?>
    <body>
        <h2>Home Page</h2>
        <p>Hello <?php Print "$user"?>!</p> 
        <a href="logout.php">Click here to go logout</a><br/><br/>
        <form action="add.php" method="POST">
            Add more to list: <input type="text" name="details" /> <br/>
            Public post? <input type="checkbox" name="public[]" value="yes" /> <br/>
            <input type="submit" value="Add to list"/>
        </form>
    <h2 align="center">My list</h2>
    <table border="1px" width="100%">
		<tr>
		    <th>Id</th>
			<th>Details</th>
			<th>Post Time</th>
			<th>Edit Time</th>
			<th>Edit</th>
			<th>Delete</th>
			<th>Public Post</th>
		</tr>
        <?php
            mysql_connect("localhose", "root","") or die(mysql_error());     //Connect to server
            mysql_select_db("first_db") or die("Cannot connect to database");//connect to 
                                                                             //database
            $query = mysql_query("Select * from list");                      // SQL Query
            while($row = mysql_fetch_array($query))
            {
                Print "<tr>";
			        Print '<td align="center">'. $row['id'] . "</td>";
			        Print '<td align="center">'. $row['details'] . "</td>";
			        Print '<td align="center">'. $row['date_posted'] . 
                          " - " . $row['time_posted'] . "</td>";
			        Print '<td align="center">'. $row['date_edited'] . 
                          " - " . $row['time_edited'] ."</td>";
			        Print '<td align="center"><a href="edit.php">edit</a> </td>';
			        Print '<td align="center"><a href="delete.php">delete</a> </td>';
			        Print '<td align="center">'. $row['public'] . "</td>";
		        Print "</tr>";
            }
        ?>
    </table>
    </body>
</html>

对添加的代码的解释非常简单。它基本上只是显示来自 while 循环的数据。这在我们的教程中已经解释过了,所以我相信到目前为止,您应该已经理解了在查询中获取数据的过程。回到浏览器,尝试刷新您的 home.php,看看会发生什么

现在应该显示该数据。从我们的 CRUD 检查表中,我们现在已经完成了 CreateRead。接下来是更新(编辑)和删除信息。如果您会注意到,我们在列上显示了编辑和删除链接。我将在列表中添加另一个名为“金枪鱼”的数据,以提供另一个示例,这次它的隐私设置为

10) 编辑数据

现在让我们尝试编辑我们的数据,为此我们将使用一个新功能,称为“GET”。在我们之前的方法中,我们一直使用 POST 作为我们的 HTTP 请求,但这次,让我们使用 GET 来编辑和删除记录。首先,让我们修改我们的 home.php 并向 2 列添加一些代码。

home.php

<html>
    <head>
        <title>My first PHP Website</title>
    </head>
    <?php
    session_start();                   //starts the session
    if($_SESSION['user']){             // checks if the user is logged in  
    }
    else{
        header("location: index.php"); // redirects if user is not logged in
    }
    $user = $_SESSION['user'];         //assigns user value
    ?>
    <body>
        <h2>Home Page</h2>
        <p>Hello <?php Print "$user"?>!</p> <!--Displays user's name-->
        <a href="logout.php">Click here to go logout</a><br/><br/>
        <form action="add.php" method="POST">
            Add more to list: <input type="text" name="details" /> <br/>
            Public post? <input type="checkbox" name="public[]" value="yes" /> <br/>
            <input type="submit" value="Add to list"/>
        </form>
        <h2 align="center">My list</h2>
        <table border="1px" width="100%">
	    	<tr>
		    	<th>Id</th>
			    <th>Details</th>
			    <th>Post Time</th>
			    <th>Edit Time</th>
			    <th>Edit</th>
			    <th>Delete</th>
			    <th>Public Post</th>
		    </tr>
            <?php
                mysql_connect("localhost", "root","") or 
                               die(mysql_error()):               //Connect to server
                mysql_select_db("first_db") or 
                               die("Cannot connect to databse"); //Connect to database
                $query = mysql_query("Select * from list");      // SQL Query
                while($row = mysql_fetch_array($query))
                {
                    Print "<tr>";
                    Print '<td align="center">'. $row['id'] . "</td>";
                    Print '<td align="center">'. $row['details'] . "</td>";
                    Print '<td align="center">'. $row['date_posted'] . 
                          " - " . $row['time_posted'] . "</td>";
                    Print '<td align="center">'. $row['date_edited'] . 
                          " - " . $row['time_edited'] ."</td>";
                    Print '<td align="center"><a href="edit.php?id='. 
                          $row['id'] .'">edit</a></td>';
                    Print '<td align="center"><a href="delete.php?id='. 
                          $row['id'] .'">delete</a></td>';
                    Print '<td align="center">'. $row['public'] . '</td>';
                Print "</tr>";
            }
        ?>
    </table>
    </body>
</html>

如果您注意到了,我们只为编辑和删除链接添加了 URL 参数,即 id。我们稍后将使用它来处理数据。我们使用 id 的原因是它是一个唯一标识符。用户有可能输入相同的数据,因此不建议在以后的操作中使用 details 作为操作的手段。

尝试将光标放在编辑链接上,您将在左下角看到 ID 的值

现在我们有了这个,让我们尝试创建我们的 edit.php,并尝试从那里获取数据

edit.php

第 1 - 42 行

<html>
    <head>
        <title>My first PHP Website</title>
    </head>
    <?php
    session_start();       //starts the session
    if($_SESSION['user']){ // checks if the user is logged in  
    }
    else{
        header("location: index.php"); // redirects if user is not logged in
    }
    $user = $_SESSION['user']; //assigns user value
    ?>
    <body>
        <h2>Home Page</h2>
        <p>Hello <?php Print "$user"?>!</p> <!--Display's user name-->
        <a href="logout.php">Click here to go logout</a><br/><br/>
        <a href="home.php">Return to home page</a>
        <h2 align="center">Currently Selected</h2>
        <table border="1px" width="100%">
	    	<tr>
		    	<th>Id</th>
			    <th>Details</th>
			    <th>Post Time</th>
			    <th>Edit Time</th>
			    <th>Public Post</th>
		    </tr>
            <?php
                if(!empty($def['id']))
                {
                    $id = $_GET['id'];
                    $_SESSION['id'] = $id;
                    $id_exists = true;
                    mysql_connect("localhost", "root","") 
                                   or die(mysql_error()):            //Connect to server
                    mysql_select_db("first_db") 
                                or die("Cannot connect to databse"); //Connect to database
                    $query = mysql_query("Select * from list");      // SQL Query
                    $count = mysql_num_rows($query);
                    if($count > 0)
                    {
                        while($row = mysql_fetch_array($query))
                        {

一些代码解释

  • !empty() - 检查值是否不为空的方法。如果您想检查它是否为空,可以通过删除感叹号 (!) 来反转语法,因此它的语法将是 empty()
  • $_GET[''] - 用于从参数获取值。在我们的例子中,我们使用 id 作为我们的 URL 参数,所以语法将是 $_GET['id']
  • $id_exists - 检查给定 id 是否存在的变量。
  • $_SESSION['id'] - 我们将 id 的值放入会话中,以便在另一个文件中使用。

第 42 - 76 行

                    $query = mysql_query("Select * from list"); // SQL Query
                    $count = mysql_num_rows($query);
                    if($count > 0)
                    {
                        while($row = mysql_fetch_array($query))
                        {
                            Print "<tr>";
			                    Print '<td align="center">' . $row['id'] . "</td>";
                                Print '<td align="center">' . $row['details'] . "</td>";
			                    Print '<td align="center">' . $row['date_posted'] . 
                                      " - " . $row['time_posted']."</td>";
			                    Print '<td align="center">' . $row['date_edited'] . 
                                      " - " . $row['time_edited']."</td>";
			                    Print '<td align="center">' . $row['public'] . "</td>";
		                    Print "</tr>";
                         }
                     }
                     else
                     {
                         $id_exists = false;
                     }
                 }
             ?>
         </table>      
         <br/>
         <?php
         if($id_exists)
         {
         Print '
         <form action="edit.php" method="post">
             Enter new detail: <input type="text" name="details"/><br/> 
             public post? <input type="checkbox name="public[]" value="yes"/><br/> 
             <input type="submit" value="Update List"/> 
         </form> 
         '; 
         }
         else
         {
             Print '<h2 align="center">There is not data to be edited.</h2>';
         } 
         ?>
    </body>
</html>

我们之所以放置变量 $id_exists,是因为如果用户将 URL 参数修改为一个不存在的数字(在我们的例子中我们只有 2 行/id),我们可以显示一个提示,表明数据不存在。

现在尝试点击第一行的编辑链接,它应该显示如下

让我们尝试修改 URL 参数,删除 ?id=1,现在应该变成 localhost/MyFirstWebsite/edit.php,结果应该如下所示

现在尝试输入一个大于 id 号的值,在我们的例子中,我们尝试 5,结果应该如下所示

localhost/MyFirstWebsite/edit.php?id=5

现在我们已经保护了 URL 参数,接下来让我们放置编辑语法。让我们回到 edit.php 并添加一些代码来更新数据库中的信息

edit.php

    <?php
       if($_SERVER['REQUEST_METHOD'] == "POST")
       {
          mysql_connect("localhost", "root", "") or die (mysql_error());    //Connect to server
          mysql_select_db("first_db") or die ("Cannot connect to database");//Connect to database
          $details = mysql_real_escape_string($_POST['details']);
          $public = "no";
          $id = $_SESSION['id'];
          $time = strftime("%X"); //time
          $date = strftime("%B %D, %Y"); //date

          foreach($_POST['public'] as $list)
          {
             if($list != null)
             {
                $public = "yes";
             }
          }
          mysql_query("UPDATE list SET details='$details', 
          public='$public', date_edited='$date', time_edited='$time' WHERE id='$id'");
          header("location:home.php");
       }
    ?>

点击此处获取完整的 edit.php 代码 (Github)。

现在尝试刷新并返回编辑页面。让我们尝试不同的数据。在我的例子中,我将使用“Salmon”并将其更改为非 public

edit.php?id=1

继续并点击“更新列表”,您应该会被重定向到 home.php 并查看更新后的列表。

现在,我们的编辑时间列显示了编辑时间和日期。我们的隐私现在已设置为非公开,并且值已更改为三文鱼

恭喜!我们现在已经完成了编辑功能!

11) 删除数据

回顾 CRUD,我们现在已经完成了记录的创建(添加)、读取(显示)和更新(编辑)。现在是最后一部分,删除记录。对于这一部分,它与我们在编辑时所做的基本相同,但不同之处仅仅是 SQL 语句。我们将使用 DELETE 语法而不是 UPDATE。在删除记录时,我们必须提示人们,确保他们真的想删除记录,所以我们将在 home.php 中添加一些 JavaScript。为此,让我们修改我们的代码并在 home.php 中添加一些内容。

home.php

<script>
    function myFunction(id)
    {
       var r = confirm("Are you sure you want to delete this record?");
       if(r == true)
       {
          window.location.assign("delete.php?id=" + id);
       }
    }
</script>

点击此处获取完整的 home.php 代码

如您所见,我们修改了删除链接。我们将 href 更改为“#”,并为 JavaScript 的 myFunction 方法添加了 onclick 函数,其参数是行的 ID。表格下方写的是 JavaScript 语法,它会提示用户是否要删除记录。如果用户确认,页面将重定向到 delete.php,其中嵌入了 id 的值。现在让我们创建 delete.php,以下是其语法。

delete.php

<?php
    session_start(); //starts the session
    if($_SESSION['user']){           //checks if user is logged in
    }
    else {
       header("location:index.php"); //redirects if user is not logged in.
    }

    if($_SERVER['REQUEST_METHOD'] == "GET")
    {
       mysql_connect("localhost", "root", "") or die(mysql_error());     //connect to server
       mysql_select_db("first_db") or die("cannot connect to database"); //Connect to database
       $id = $_GET['id'];
       mysql_query("DELETE FROM list WHERE id='$id'");
       header("location:home.php");
    }
?>

点击此处获取完整的 delete.php 代码。

代码很简单,语法也和我们之前用过的一样,但请注意,我们已将请求方法更改为 GET。由于我们有 URL 参数,我们现在使用 GET 请求。现在尝试刷新 home.php,让我们尝试删除第一条记录。结果应该如下所示

提示

最终结果

恭喜!现在我们已经正式完成了 CRUD 语句!

12) 显示公共数据

现在是最后一部分,显示公共数据。我们将在 index.php 中显示已设置为的数据,这是一个非认证用户页面。这非常简单。我们只需编辑 index.php 并添加一些 php 代码和表格。这是我们更新后的 index.php

index.php

现在注销并查看您的默认页面。它应该看起来像这样

注意:您还不会看到数据,因为我们尚未将任何信息设置为公开。

现在让我们再次登录,这次,让我们添加更多数据。在我的例子中,我添加了以下内容

  • 沙拉 - 公开
  • 玉米 - 非 公开
  • 意大利面 - 公开
  • 鸡肉 - 公开
  • 意大利面 - 非 公开

总共有 6 条数据,每种隐私设置各有 3 条

home.php

现在让我们注销并查看我们的默认页面 (index.php)。它现在应该看起来像这样

index.php

如您所见,它只显示设置为 public 的数据。

恭喜!我们终于完成了本次教程!

13) 总结与回顾

最后,您应该拥有以下文件

正如我之前提到的,我将上传完成的产品。点击这里

我还上传了数据库的 SQL 文件,以防您想使用我拥有的确切数据。要导入 SQL 文件,您只需单击导出并选择 SQL 文件,但请务必先创建数据库。如果您愿意,我可以为此创建一个单独的博客。只需在评论部分告诉我即可。

预期问题

以下是我认为您会提出的一些问题。我试图预料到这些问题,以避免混淆

  • 每当我注册一个新用户时,都会出现相同的列表。我期望每个不同的用户都有一个单独的列表。我做错什么了吗?

这确实是个好问题。如您所见,我只教授基本的 CRUD 功能、身份验证和安全性,而不是会员系统。为每个用户创建单独的列表需要为他们每个人创建一个单独的表。所以,其背后的逻辑是,每次插入数据后,您都会将其插入到另一个表中,并建立相互关系。您可以使用 CREATE 语法为用户创建单独的表,代码如下所示

Create table $username (column1 int auto_increment, column2 varchar(50), etc...)

您可以点击这里查看创建表语法。

我之所以没有做那一部分,是因为您将不得不进行大量的查询,而且我的代码会变得复杂,这会花费大量的开发时间,所以它绝对超出了我的范围。最好您自己尝试一下并找出方法。毕竟,您需要的一切都已在此博客中。

  • 使用主页会更容易吗?因为我注意到您必须为每个页面重新编写服务器和数据库连接。

是的,使用母版页会更容易。我没有使用它的原因是为了让我们的读者更容易理解其背后的逻辑。母版页对于初学者来说可能会有点令人困惑。

  • 为什么不使用框架?我敢打赌那样会看起来更简洁、更容易。

我又提到了标题“从零开始创建您的第一个 PHP 程序”。从无到有开始比从“模板”开始更好,这样我们的读者就能熟记代码。

  • 我知道这可能是开发 PHP 的老方法。我听说有新功能发布了。

我只根据我的掌握来介绍。我从事 PHP 工作很长时间了,可能没有听说过新功能。如果您认为新功能看起来更好,那就试试看。

  • 为什么不为 CSS 和 JavaScript 创建单独的文件呢?

很简单,我只是向您演示功能。我们更关注后端代码而不是前端。我真的没有专注于设计。如果您问如何使用 PHP 设计您的代码,那么它就像设计普通的 HTML 文件一样简单。

嗯,我想这就结束了。谢谢大家!希望您从本主题中学到了一些东西。

再次重申,如果您想从头开始学习创建自己的 ASP.NET MVC 5 Web 应用程序,可以点击此处查看。在Twitter上关注我,您可以就这两篇文章发表您的反馈和评论。

© . All rights reserved.