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






4.80/5 (84投票s)
面向初学者的 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/。
先决条件
在本教程中,我们将使用一些语言来增强我们的开发。 如果您真的不知道我将提到的任何内容,没关系。只需尝试跟着流程走即可。它们很容易理解,因为我不会使用高级方法。当然,由于这是为网站创建后端服务,您必须至少了解以下内容的非常非常非常基础的知识
HTML/CSS - 当然,在 Web 开发中,这永远不会从列表中消失。我为什么要费心把它放在这里?哈哈。- JavaScript - 用于重定向脚本。暂时不需要 jQuery
- mySQL - 最基本的查询语言。我们将使用它来实现我们的 CRUD(创建、读取、更新、删除)功能。
对于软件,您需要以下内容
- 文本编辑器 - Sublime Text/Notepad++ 即可。这将作为我们的编码环境。
- XAMPP - 这将是我们的 Web 服务器。我们将在其中保存网站文件并将数据保存到数据库中。
- 网络浏览器 - 您可以使用任何浏览器,只要它不会占用您太多内存。
确保已安装这三个程序。如果未完成安装,请勿继续。我已经提供了超链接以加快速度。
本次主题的议程
- 利用 SQL 中的 CRUD 语句 - 在数据库中创建、读取、更新和删除记录。
- 简单认证和安全 - 登录和注销、处理未经授权的用户和限制访问。
- 简单的时间和日期操作 - 显示时间和日期发布并监控您的帖子。
- 显示公共和私人数据 - 仅显示登录用户和公众的信息。
- 总结与回顾 - 最终输出和一些说明。常见问题也放在这里。
主题内容
注意:如果您在某个部分停止或想快速搜索,只需按 Ctrl + f 并查找您上次停止的数字即可继续。
- 设置您的服务器
- 创建公共 HTML 页面
- 创建数据库及其表
- 向数据库添加用户
- 用户登录:认证
- 为已登录用户设置主页和注销
- 测试页面安全性
- 向列表添加数据 - 仅限用户访问
- 在主页显示数据
- 编辑数据
- 删除数据
- 显示公共数据
- 总结与回顾
确保您按时间顺序操作。除非您了解代码,否则不要在未完成前一部分的情况下继续。
开始前的一些提醒
注意:如果图片看起来不清晰/模糊,您可以点击它以查看其放大尺寸。另外,请原谅我使用图片而不是原始文本来显示代码,因为我的 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 文件夹中,如图像所示
现在它在那里,通过单击操作列上的“启动”按钮来运行您的 Apache 和 mySQL。您应该看到一个随机的 PID(s) 和默认端口号。Apache 是我们的 Web 服务器的名称,它将处理所有文件并充当与 Web 浏览器的通信,而 MySQL 是我们的数据库,它将存储我们所有的信息。
打开您的网络浏览器,并在地址栏中键入 localhost。您应该会看到 XAMPP 的菜单。
如果这是您第一次运行它,它会询问您喜欢哪种语言,只需选择它,它就会将您带到菜单。如果您注意到目录是 localhost/xampp,即使您输入 localhost,它也会将您带到默认页面。
如果出现此情况,则表示您的 XAMPP 服务器已启动并运行。现在让我们尝试运行您刚刚放置的网站。尝试键入 localhost/MyFirstWebsite。 它应该与下图相同。
如果您会注意到 URL 是 MyFirstWebsite,它是从 htdocs 文件夹派生而来的,它会自动读取名为“index”(无论是 index.html、index.aspx 等)的文件,这些文件作为默认页面。键入 localhost/MyfirstWebsite/index.php 是完全相同的。您还可以通过简单地重命名文件夹来为 URL 创建自定义名称,但我们还是坚持使用 MyFirstWebsite。
注意:如果您没有名为 index 的文件并输入了 URL,您将收到 404 错误,因为服务器上没有该文件。如果您有其他未命名为 index.
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。它应该显示下面的输入。这是我的示例
在这一部分,您应该已经了解了如何从表单获取输入。现在将其添加到数据库中。在您的 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 服务器的语法。localhost 或 127.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 检查表中,我们现在已经完成了 Create
和 Read
。接下来是更新(编辑)和删除信息。如果您会注意到,我们在列上显示了编辑和删除链接。我将在列表中添加另一个名为“金枪鱼
”的数据,以提供另一个示例,这次它的隐私设置为否
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上关注我,您可以就这两篇文章发表您的反馈和评论。