四、数据操作

在上一章中,我们学习了函数和类。我们讨论了如何定义和调用函数。我们还讨论了如何定义类以及如何将类和函数一起使用。

在本章中,我们将着重于处理来自用户的输入并将结果打印回用户,优雅地处理错误,以及学习使用 MySQL 数据库的基础知识。

在本章结束时,您将能够:

  • 确定如何接受用户的输入并将其打印到屏幕上
  • 实现使用 MySQL 的基础知识

数据的输入和输出

从使用 PHP 构建网站到使用 PHP 构建 web 应用,能够接受用户的输入是一项主要要求。通常,输入来自 HTML 表单。

让我们创建一个简单的联系方式:

<html>
<body>
    <form action="index.php" method="POST">
        <input type="text" name="name" />
        <input type="text" name="email" />
        <textarea name="message"></textarea>
        <button type="submit">Send</button>
    </form>
</body>
</html>

在前面的联系人表单中,我们看到了用户名、电子邮件和消息的输入。我们将用来提交此表单的方法称为POST请求。

要读取提交的数据,我们将在表单顶部添加一些 PHP,它将读取并呈现我们POST请求中的数据:

有关完整的代码片段,请参阅代码文件文件夹中的Lesson 4.php文件。

<?php
    if($_POST){
        echo "Name: " . $_POST['name'] . "\n";
        echo "Email: " . $_POST['email'] . "\n";
......
        <input type="text" name="email" />
        <textarea name="message"></textarea>
        <button type="submit">Send</button>
    </form>
</body>
</html>

如您所见,很容易接受应用用户的输入。在前面的代码示例中,我们使用一个特殊变量$_POST数组来访问通过POST请求提交的所有数据。$_POST变量、关联数组和内容可以通过您在输入元素中指定的名称进行访问。

您可以使用的另一种请求类型是GET请求。GET请求的使用频率比您想象的要高;GET是您导航到网站或在 Google 上执行搜索时使用的请求类型。GET请求的输入通过查询字符串完成。

查询字符串是附加到 URL 末尾的字符串,前面带有问号,如下所示:https://www.example.com?name=Michael &年龄=12

Inputting and Outputting Data

在前面的示例中,您可以看到我们有两个键,它们用一个符号和分隔。就像在POST方法中一样,GET请求有一个特殊的变量,那就是$_GET变量(也是一个关联数组)。

如果要从前面的查询字符串中获取名称,可以使用以下代码行:

<?php

    $name = $_GET['name'];

?>

您也可以在表单中使用请求。让我们回顾一下我们以前看到的表单元素:

有关完整的代码片段,请参阅代码文件文件夹中的Lesson 4.php文件。

<?php
    if($_GET){
        echo "Name: " . $_GET['name'] . "\n";
        echo "Email: " . $_GET['email] . "\n";
......
        <button type="submit">Send</button>
    </form>
</body>
</html>

在表单的 method 属性中,我们将其更改为GET,将$_POST变量与$_GET变量交换。

在接受用户输入时,有时需要先清理输入,然后再对其执行任何操作。有些输入需要从开头和结尾清除任何空格。这就是 PHP 的trim函数发挥作用的地方。trim函数将清除用户输入两侧的空白和其他类似字符。如果要从左侧或右侧移除,可以分别使用ltrimrtrim功能。

为我们的用户列表创建表单

我们将首先为我们的用户列表构建一个表单。在本节末尾,您将有一个表格,可以接受您的firstnamelastnameemail。其末尾将有一个提交按钮,用于提交信息:

  1. 创建一个新目录并将其命名为users_list
  2. 在新目录中,创建一个index.php文件。
  3. Open the index.php file in your text editor, and add the form code:

    有关完整的代码片段,请参阅代码文件文件夹中的Lesson 4.php文件。

    php <html> <body> <form action="index.php" method="post"> ...... </form> </body> </html>

  4. Now that we have our form, we want to be able to view the data submitted to the form:

    有关完整的代码片段,请参阅代码文件文件夹中的Lesson 4.php文件。

    php <?php if($_POST){ echo "First Name: " . $_POST['firstname'] . "\n"; echo "Last Name: " . $_POST['lastname'] . "\n"; ...... id="email"/> <br> <button type="submit">Save</button> </form> </body> </html>

  5. 现在,为了查看表单的运行情况,我们将在终端中打开工作目录并运行以下命令:

    php php -S localhost:8000 -t

对于任何 web 应用,您都需要有一种存储数据的方法。允许您在 MySQL 数据库中持久化当前状态的服务称为持久化。如果变量允许临时存储数据,则持久性允许长期将数据存储在数据库中。

PHP 中使用的主要数据库类型是 MySQL。MySQL 数据库被称为基于关系的数据库,被组织成表。

在本节中,我们将介绍如何在 PHP 中使用 MySQL 数据库,以及如何使用它执行各种操作。

连接到数据库

使用数据库的第一步是连接到数据库。在本章中,我们将重点介绍 PDO 或 PHP 数据对象的使用风格。

要连接到数据库,请使用以下代码行:

有关完整的代码片段,请参阅代码文件文件夹中的Lesson 4.php文件。

MySQL 基础

<?php
    $host = "DATABASE_HOST";
    $username = "DATABASE_USERNAME";
    $password = "DATABASE_PASSWORD";
    $database = "DATABASE_NAME";
......

            echo "Connected successfully"; 
        }
    catch(PDOException $e)
        {    

            echo "Connection failed: " . $e->getMessage();
}
?>

在前面的代码中,您可以看到我们有很多新代码。我们首先定义四个新变量来保存数据库的凭据值:一个用于主机 URL,一个用于用户名,一个用于密码,最后一个用于连接到的数据库的名称。接下来,我们将数据库连接代码包装在一个try块中;这将catch当我们连接到数据库并运行查询时出现的任何错误。在try块中,我们使用前面定义的凭证变量启动 PDO 类的新实例,并将其分配给$conn变量。然后,我们设置错误模式,以确保在发生任何错误时触发catch块。最后,在try部分,我们echo输出了一条成功的连接消息。在 try/catch 块的catch部分中,我们只需回显触发的错误消息。

创建一个数据库表

我们现在将使用 SQL 查询创建一个表:

有关完整的代码片段,请参阅代码文件文件夹中的Lesson 4.php文件。

<?php
    $host = "DATABASE_HOST";
    $username = "DATABASE_USERNAME";
    $password = "DATABASE_PASSWORD";
......

    }
    catch(PDOException $e)
    {

        echo "Connection failed: " . $e->getMessage();

    }
    }
?>

为了创建一个表,我们使用CREATE TABLE命令,后跟表的名称。然后,在一对括号内,我们定义表的字段。我们在查询中创建的表将创建一个用户表,该表将保存用户 ID(该表的主键),并将自动增加类型为varchar,的用户名,最多 60 个字符。该表还将包含一个类型为varchar的电子邮件地址,最多 30 个字符。

在数据库中插入一条记录

现在我们的数据库中有一个表,我们可以向其中添加数据。我们使用insert查询添加数据。连接到数据库并设置错误模式后,我们可以定义查询。Insert查询以INSERT INTO命令开始,后跟我们要插入数据的表的名称。在一对括号中,我们定义了要写入的字段。在字段之后,我们定义要输入到表中的值:

有关完整的代码片段,请参阅代码文件文件夹中的Lesson 4.php文件。

<?php
    $host = "DATABASE_HOST";
    $username = "DATABASE_USERNAME";
    $password = "DATABASE_PASSWORD";
    $database = "DATABASE_NAME";

    try {
        $conn = new PDO("mysql:host=$host;dbname=$database", $username, $password);

    ......

    }
    catch(PDOException $e)
    {

        echo "Connection failed: " . $e->getMessage();

    }
?>

从数据库表中获取一行

如果要从数据库中获取用户,可以使用SELECT查询。在本例中,我们希望获得在上一个代码块中插入的新用户。我们将使用以下代码:

有关完整的代码片段,请参阅代码文件文件夹中的Lesson 4.php文件。

<?php
    $host = "DATABASE_HOST";
    $username = "DATABASE_USERNAME";
    $password = "DATABASE_PASSWORD";
    $database = "DATABASE_NAME";

    try {
        $conn = new PDO("mysql:host=$host;dbname=$database", $username, $password);
......

    }
    catch(PDOException $e)
    {

        echo "Connection failed: " . $e->getMessage();

    }
?>

使用$conn变量,我们准备了一个SELECT查询,表示我们想从 users 表中提取信息;然后,我们使用WHERE子句定义所需信息的条件。为了最终运行查询,我们执行准备好的语句,传递一个带有所需电子邮件地址的array。由于我们希望将关联数组返回给我们,因此我们将 fetch 模型设置为FETCH_ASSOC,使用 fetch 方法获取单个记录。

为了呈现用户数组,我们在打开和关闭pre tags之间使用PRINT命令。

pre tags美化已打印的阵列。这通常用于调试数组中包含的内容。

从数据库表中获取多行

如果我们想获取一个表中的所有用户,我们就不用准备语句,直接运行查询。这一次,我们删除了WHERE条款。我们不使用 fetch 函数,而是使用fetch_all函数:

有关完整的代码片段,请参阅代码文件文件夹中的Lesson 4.php文件。

<?php
    $host = "DATABASE_HOST";
    $username = "DATABASE_USERNAME";
    $password = "DATABASE_PASSWORD";
    $database = "DATABASE_NAME";

    try {
        $conn = new PDO("mysql:host=$host;dbname=$database", $username, $password);
......
        echo "</pre>";

    }
<?php
    $host = "DATABASE_HOST";
    $username = "DATABASE_USERNAME";
    $password = "DATABASE_PASSWORD";
    $database = "DATABASE_NAME";

    try {
        $conn = new PDO("mysql:host=$host;dbname=$database", $username, $password);
......
        echo "</pre>";

    }
    catch(PDOException $e)
    {

        echo "Connection failed: " . $e->getMessage();

    }
?>

更新数据库表中的记录

现在我们已经了解了如何从数据库表中添加和获取数据,可以开始编辑各个记录了。在 MySQL 中,我们使用UPDATE查询更新数据。要运行一个UPDATE查询,我们返回到我们准备好的语句,并使用命令UPDATE,和表名(在本例中为 users 表)启动查询。接下来,我们使用SET命令开始定义需要更新的字段和值的过程,然后我们添加WHERE子句来隔离我们想要有新值的特定记录。要为查询结果添加一些反馈,请通过 row count 函数回显计数。

让我们将用户的电子邮件地址更改为test123@email.com:

有关完整的代码片段,请参阅代码文件文件夹中的Lesson 4.php文件。

<?php
    $host = "DATABASE_HOST";
    $username = "DATABASE_USERNAME";
    $password = "DATABASE_PASSWORD";
    $database = "DATABASE_NAME";

    try {
        $conn = new PDO("mysql:host=$host;dbname=$database", $username, $password);
......
          echo $statement->rowCount() . "(s) rows affected.";
    }
    catch(PDOException $e)
    {

        echo "Connection failed: " . $e->getMessage();

    }
?>

删除数据库表中的记录

MySQL 的最后一部分将从数据库中删除数据。要删除数据,我们使用DELETE查询。DELETE查询以DELETE FROM,开头,后跟要从中删除数据的表的名称;使用WHERE子句完成查询,进一步指定要删除的记录。我们将此查询放在一个准备好的语句中,然后通过传递WHERE子句的值来执行它:

有关完整的代码片段,请参阅代码文件文件夹中的Lesson 4.php文件。

<?php
    $host = "DATABASE_HOST";
    $username = "DATABASE_USERNAME";
    $password = "DATABASE_PASSWORD";
    $database = "DATABASE_NAME";

    try {
        $conn = new PDO("mysql:host=$host;dbname=$database", $username, $password);
......
          echo $statement->rowCount() . "(s) rows deleted.";
    }
    catch(PDOException $e)
    {
        echo "Connection failed: " . $e->getMessage();

    }
?>

创建员工表

我们最后的项目将把我们从用户那里获得的输入存储在一个数据库表中。在编写代码将数据添加到数据库之前,我们需要创建一个数据库,如下所示:

  1. 打开终端。
  2. 使用以下命令连接到 MySQL:

    php mysql –u root –p

  3. 接下来,创建packt_database数据库:

    php create database packt_database;

  4. 告诉 MySQL 使用新创建的数据库:

    php use packt_database;

  5. 最后,创建用户表:

    php CREATE TABLE users ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(30) NOT NULL );

  6. 现在,我们可以关闭终端,开始完成我们的应用。

向数据库添加用户

在本节中,我们将使用 PHP 向数据库添加用户。然后,我们创建一个表单,接受用户的INSERT查询。

要执行此操作,请执行以下步骤:

  1. 在文本编辑器中重新打开users_list目录。
  2. Within the second if statement, connect to your database:

    有关完整的代码片段,请参阅代码文件文件夹中的Lesson 4.php文件。

    ```php <?php

    if($_POST){
        if(!$_POST['firstname'] || !$_POST['lastname'] || !$_POST['email']){
            exit("All fields are required.");
        }
    
        $host = "DATABASE_HOST";
        $username = "DATABASE_USERNAME";
        $password = "DATABASE_PASSWORD";
        $database = "packt_database";
    
        try {
            $conn = new PDO("mysql:host=$host;dbname=$database", $username, $password);
    

    ...... Save

```