PHP是一种广泛使用的服务器脚本语言。它的强大功能和轻量级的特性使其非常适合Web前端开发,并且虽然可以在其中创建高级结构,但它的基本用法也很容易学习,这对于初学者也是一个很好的起点。但是,我们构建的应用程序记录,处理,发送或显示的数据需要存储在某个地方。没有这些数据,我们的网页将是无状态的。我们可以采用多种方式存储数据,甚至在使用后将其丢弃,但是最标准的方法是将其存储在数据库中,其唯一目的是可靠地存储数据,并在需要时尽快提供数据。
在本教程中,我们将构建一个简单的网页来记录和显示用户数据。我们将使用PostgreSQL RDBMS作为后端,并使用PHP开发将在Apache Web服务器上运行的应用程序。这样,我们可以从任何常用浏览器访问Web应用程序以查看或添加到我们的用户数据库。 Web应用程序的本质是许多用户/操作员可以同时使用它,他们所需要的只是浏览器和对我们应用程序的网络访问。
在本教程中,您将学习:
- 如何在PHP中安装PostgreSQL连接所需的软件包
- 如何创建应用程序的数据库端
- 如何编写示例应用程序
- 如何操作和验证示例应用程序
使用的软件要求和约定
类别 | 使用的要求,约定或软件版本 |
---|---|
系统 | Ubuntu 18.04.2 |
软件 | PostgreSQL 10.9,PHP 7.2.19 |
其他 | 以root身份或通过Linux特权访问Linux系统sudo 命令。 |
约定 | #-要求linux命令可以直接以root用户身份或通过使用root特权以root特权执行sudo 命令$-要求linux命令以普通非特权用户身份执行 |
关于软件组件的注意事项
我们在Ubuntu上设置了我们的应用程序,但是基本上这个过程可以移植到任何发行版上。软件包管理器和软件包名称以及某些目录路径有所不同。还要注意,尽管我们将使用上述软件组件的版本,但是可以在不做任何调整的情况下,在各种版本的组件上构建此应用程序。为了比较,将包括其他分布的一些示例。
您可能会注意到该应用程序非常简单:这是有意的。本指南的目的是尽可能简单地展示开发可与数据库通信的应用程序的基本原理。最少的代码,最少的组件。不要使用本指南来构建生产应用程序,因为它缺乏针对此问题的任何安全性度量,可重用性或优化。
安装所需的软件包
后安装PostgreSQL数据库,我们所需要的只是添加php支持。为此,我们需要php-pgsql
包。我们将使用apt
安装它:
# apt-get install php-pgsql
一些发行版可能会称之为php7-pgsql
等等,但是所有的包管理器都提供搜索功能,因此很容易找到我们需要的东西。例如,这是如何在RHEL8 /centOS 8上安装PostgreSQLLinux系统。
我们还需要安装php,网络服务器以及在网络服务器上对php的支持。那是两个包:
# apt-get install apache2 libapache2-mod-php
我们可以启动这两种服务,以便在下一步中可以使用它们。我们将使用systemd
为了那个原因。
# systemctl start postgresql
# systemclt start apache2
创建数据库和所需的对象
我们应用程序的数据库端将包括一个数据库,一个表和一个序列,以支持自动主键分配。
- 我们将切换到
postgres
用户:# su - postgres
- 登录数据库:
$ psql psql (10.9 (Ubuntu 10.9-0ubuntu0.18.04.1)) Type "help" for help. postgres=#
- 创建一个新用户:
postgres=# create role exampleuser with login password 'ExamplePass';
并与所有者设置一个数据库。
postgres=# create database exampledb owner exampleuser encoding 'UTF-8';
- 退出后
psql
工具,我们创建一个名为example_table.sql
具有以下内容:create sequence userid_seq start with 0 increment by 1 no maxvalue minvalue 0 cache 1; alter sequence userid_seq owner to exampleuser; create table users ( userid numeric primary key default nextval('userid_seq'::regclass), username text not null, email text not null, registration_date timestamp default now() ); alter table users owner to exampleuser;
在这里我们创建一个序列1行它将为表中的每个记录提供唯一的主键,而不是设置其所有权。在3号线我们创建一个表,该表将保存将在应用程序中记录和显示的用户数据。我们为
userid
和registration_date
,并将其留在数据库中,以供我们填写这些字段。 - 我们将上述SQL文件加载到新数据库中:
$ psql -d exampledb < example_table.sql CREATE SEQUENCE ALTER SEQUENCE CREATE TABLE ALTER TABLE
这样,我们的数据库就可以建立并可以使用了。默认情况下,Ubuntu上的PostgreSQL 10.9接受回送设备上的password-protected登录。如果您使用其他版本,则可能需要修改pg_hba.conf
启用对数据库的访问。我们有一个例子Redmine安装指南关于如何设置。
构建应用程序代码
尽管肯定有很多很棒的工具可以帮助您生成有效的源代码,但我们不会在此处进行介绍,但这会增加本指南的复杂性。我们将创建一个名为recording.php
,默认情况下DOCUMENT_ROOT
Ubuntu 18上的目录,/var/www/html/
。在其他发行版上,这可能是/srv/www/htdocs/
, 或者是其他东西。如果不确定,请参考网络服务器的配置。
PHP是一种脚本语言,这意味着我们不需要编译我们的代码,只需将其提供给Web服务器,即可解释运行时。
我们可以使用命令行文本编辑器,例如vi
要么nano
用以下源代码填充提到的php文件:
<!-- section 1 -->
<!DOCTYPE html>
<html>
<head>
<title>User recording page</title>
</head>
<body>
<p>Please fill out the below form and press submit to record the data.</p>
<!-- section 2 -->
<form name="record" action="recording.php" method="post">
<input type="text" name="username"><br>
<input type="text" name="email"><br>
<input type="submit" value="Submit"><br>
</form>
<hr>
<!--section 3 -->
<?php
/* section 4 */
$dbconn = pg_connect("host=127.0.0.1 port=5432 dbname=exampledb user=exampleuser password=ExamplePass");
if(!$dbconn) {
die('Error connecting to database: ' . pg_last_error());
}
/* section 5 */
if(isset($_REQUEST["username"]) && isset($_REQUEST["email"])) {
$un = pg_escape_string($_REQUEST["username"]);
$mail = pg_escape_string($_REQUEST["email"]);
$insert_res = pg_query("insert into users (userid, username, email, registration_date) values (default,'$un','$mail',default)");
if(!$insert_res) {
echo ("Error while inserting data: " . pg_last_error());
} else {
echo ("Recoring successful");
}
}
/* section 6 */
$result = pg_query("SELECT * from users order by registration_date");
echo "<table border='1'>\n<tr><th>#</th><th>Username</th><th>E-mail address</th><th>Registration date</th></tr>\n";
while($row = pg_fetch_row($result)) {
echo "<tr><td>" . $row[0] . "</td><td>" . $row[1] . "</td><td>" . $row[2] . "</td><td>" . $row[3] . "</td></tr>\n";
}
echo "</table>\n";
/* section 7 */
pg_close($dbconn);
?>
<!-- section 8 -->
</body>
</html>
我们以一个简单的静态HTML页面开始我们的代码,网址为section 1
。我们在以下位置创建一个表单section 2
使用户能够将数据记录到应用程序中。我们只要求提供用户名和e-mail地址。在section 3
我们将PHP代码嵌入到页面中。Section 4
使用我们在数据库步骤中设置的连接信息来创建数据库连接。如果无法建立连接,则应用程序将死并显示一条错误消息。
在section 5
我们使用在处创建的表单来处理发送来处理的所有数据section 2
。如果同时发布了”username”和”email”,我们将检查它们是否不为空,如果不为空,则将使用数据库连接将它们插入数据库。
无论收到任何发布的数据,我们都会在数据库表中查询已记录的用户数据section 6
。我们将生成必要的HTML代码,以提供一个表格,其中填充了从数据库返回的数据。
在setion 7
我们关闭数据库连接(总是清除不再需要的对象!),并在section 8
我们留下PHP代码,并使用简单的HTML标签完成页面。至此,我们的应用程序完成了,我们可以开始使用它了。
使用应用程序
我们将浏览器指向http://localhost/recording.php
。将显示示例应用程序的唯一页面。
我们可以用随机数据填充表单的字段以测试应用程序。当文本添加到两个字段中时,我们可以提交数据。
提交后,页面显示了相同的表单,我们可以在其中记录下一个用户以及已经记录的下一个用户,该表单是在插入后从数据库中查询的。我们已经完成了用户数据记录应用程序的目标。
我们还可以使用以下方法验证数据是否已成功存储在数据库中psql
:
$ psql -d exampledb
exampledb=# select * from users;
userid | username | email | registration_date
--------+----------+------------------------+----------------------------
0 | foobar | foo.bar@maildomain.org | 2019-06-25 20:28:18.224375
(1 row)
最后的想法
我们使用来自不同领域,数据库,网络服务器,HTTP
协议,当然还有PHP开发。本指南旨在说明通过这些字段的联合来创建有用的东西是多么容易。我希望该指南可以帮助初学者了解开发的某些方面,并可以证明它不是空间科学-我们在这里和那里仅添加了几行代码,整个过程开始可以一起工作。
尽管此示例应用程序确实可以达到其演示目的,但代码和整个解决方案当然都需要改进。仅举几个…
- 没有什么可以阻止操作员两次记录确切的用户名和/或e-mail。这将导致多余的记录。这可以在数据库(唯一约束)和应用程序(在插入之前验证数据)方面进行处理。
- 记录的数据来自哪里?是什么保护应用程序免受不良行为的影响?目前什么也没有,只需要一个shell脚本就可以使它过载,只有Web服务器的默认防御措施到位了-但这并不能阻止我将完整的《指环王》三部曲每分钟发布1000次(仅带宽)。在此应用程序状态下,很容易用随机数据填充数据库下的磁盘-用户输入验证将再次在这里发挥作用,而且还会进行身份验证和授权。
- 此时,网页设计已完全缺失。一些
css
,更多有助于操作员工作的文本,有用的错误消息…用户友好性也是一个重要的观点。 - 自然地记录用户的用户名和关联的e-mail只是一个例子,我们可以记录名字和姓氏,电话号码,每个用户可以记录多个e-mail …还有其他对存储有用的东西。
该清单可以继续下去。读者,取决于您自己,以改善您自己的应用程序。如果本指南帮助您踏上发展的道路(无论是业余爱好还是以成为专业人士为目标),那么它都能很好地实现其目标。