PHP连接MySQL数据库基础:循环结构与表单提交实战

周予安
周予安
发布时间:2026-10-13 | 5人浏览过
原创

本文详解PHP如何连接MySQL数据库,涵盖使用while和do-while循环遍历结果集的方法,以及如何通过HTML表单将数据发送至服务器存入数据库。

连接数据库与基础列表显示

在开始编写PHP脚本之前,确保已创建好名为 mydb 的数据库及包含员工信息的 employees 表。以下代码展示了如何通过PHP连接到本地MySQL服务器,选择数据库,并执行查询以获取所有员工记录。

<html>
<body>
<?php
// 1. 连接数据库
$db = mysql_connect("localhost", "root");
// 2. 选择特定数据库
mysql_select_db("mydb", $db);
// 3. 执行查询语句
$result = mysql_query("SELECT * FROM employees", $db);

// 开始构建表格HTML
echo "<table border=1>n";
echo "<tr><td>姓名</td><td>职位</td></tr>n";

// 4. 使用while循环遍历结果集
// mysql_fetch_row 返回索引数组
while ($myrow = mysql_fetch_row($result)) {
    // $myrow[0]通常是ID, [1]是first name, [2]是last name, [3]是position等
    printf("<tr><td>%s %s</td><td>%s</td></tr>n", $myrow[1], $myrow[2], $myrow[3]);
}
echo "</table>n";
?
>
</body>
</html>

代码解析:

  • mysql_connect 和 mysql_select_db 用于建立与数据库服务器的连接。
  • while ($myrow = mysql_fetch_row($result)):这是核心逻辑。mysql_fetch_row() 每次从结果集中取出一行作为索引数组。只要还有数据,条件为真,循环继续;数据取完后,函数返回 false,循环结束。
  • 优势:如果数据库中没有任何记录,mysql_fetch_row 立即返回 false,循环体不会执行,程序直接输出表格头和内容(虽然此时可能为空),不会产生错误报错。

处理无记录情况与改进循环方式

上述简单 `while` 循环虽然安全,但如果数据库没有记录,用户看到的只是一张空表格,体验不佳。我们需要在程序开始前检查是否有数据。此外,索引数组访问(如 `$myrow[1]`)不如字段名清晰,这里引入 mysql_fetch_array 配合 if-else 和 do-while 结构。

<html>
<body>
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb", $db);
$result = mysql_query("SELECT * FROM employees", $db);

// 尝试获取第一行记录
if ($myrow = mysql_fetch_array($result)) {
    echo "<table border=1>n";
    echo "<tr><td>姓名</td><td>住址</td></tr>n";
    
    // do-while 至少执行一次循环体,然后判断条件
    do {
        // 使用关联数组,通过字段名访问更直观
        printf("<tr><td>%s %s</td><td>%s</td></tr>n", 
               $myrow["first"], $myrow["last"], $myrow["address"]);
    } while ($myrow = mysql_fetch_array($result));
    
    echo "</table>n";
} else {
    echo "对不起,没有找到记录!";
}
?
>
</body>
</html>

关键变化说明:

  1. mysql_fetch_array($result):相比 _row,它同时返回索引数组和关联数组(字段名)。例如可以使用 $myrow["first"] 而不是猜测下标。
  2. if ( $myrow = ... ):首先尝试取一条记录。如果成功(有数据),进入 if 块生成表格;如果失败(无数据),进入 else 块提示用户。
  3. do { ... } while (...):为什么要用 do-while?因为在 if 判断时我们已经消耗了第一条记录并赋给了 $myrow。如果使用普通 while 循环并在条件中再次 fetch,会跳过第一条数据。do-while 确保先打印当前已有的第一条数据,再去 fetch 下一条,避免数据丢失。

实现分页链接与单条记录查看

为了增强实用性,我们让列表中的名字变成超链接,点击后跳转到同一页面并携带 ID 参数,从而显示该员工的详细信息。

<html>
<body>
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb", $db);

// 假设通过 GET 请求传递了 id 参数
if (isset($id)) {
    // --- 模式A: 显示单条记录 ---
    $result = mysql_query("SELECT * FROM employees WHERE id=$id", $db);
    $myrow = mysql_fetch_array($result);
    if ($myrow) {
        printf("<b>名:</b> %s<br>", $myrow["first"]);
        printf("<b>姓:</b> %s<br>", $myrow["last"]);
        printf("<b>住址:</b> %s<br>", $myrow["address"]);
        printf("<b>职位:</b> %s<br>", $myrow["position"]);
    }
} else {
    // --- 模式B: 显示员工列表 ---
    $result = mysql_query("SELECT * FROM employees", $db);
    if ($myrow = mysql_fetch_array($result)) {
        do {
            // 使用 $PATH_INFO 或脚本路径构造链接,带上 id 参数
            // 注意引号转义
            printf("<a href='%s?id=%s'>%s %s</a><br>n", 
                   $_SERVER['PHP_SELF'], $myrow["id"], 
                   $myrow["first"], $myrow["last"]);
        } while ($myrow = mysql_fetch_array($result));
    } else {
        echo "对不起,没有找到记录!";
    }
}
?
>
</body>
</html>

逻辑说明:

  • isset($id):检测 URL 参数中是否包含 id。如果有,说明用户点击了链接,进入详细查看模式;否则,显示列表模式。
  • $_SERVER['PHP_SELF']:获取当前脚本的文件名,用于构建设置回跳链接(原文使用的 $PATH_INFO 变量已过时或需特定配置,现代 PHP 推荐使用 $_SERVER['PHP_SELF'])。

向数据库发送数据(HTML表单与POST方法)

学会了读取,接下来学习如何插入数据。这主要通过 HTML Form 和 PHP 的 $_POST 超级全局变量来实现。

  1. 创建表单页面 (insert.php):
<form method="post" action="">
    名:<input type="Text" name="first"><br>
    姓:<input type="Text" name="last"><br>
    住址:<input type="Text" name="address"><br>
    职位:<input type="Text" name="position"><br>
    <input type="Submit" name="submit" value="输入信息">
</form>
    处理表单提交 (process.php 或在同一文件中判断):
<?php
if ($_POST['submit']) {
    $db = mysql_connect("localhost", "root");
    mysql_select_db("mydb", $db);
    
    // 接收表单数据
    $first = addslashes($_POST['first']);
    $last = addslashes($_POST['last']);
    $address = addslashes($_POST['address']);
    $position = addslashes($_POST['position']);
    
    // 执行插入语句
    $query = "INSERT INTO employees (first, last, address, position) 
              VALUES ('$first', '$last', '$address', '$position')";
    $result = mysql_query($query, $db);
    
    if ($result) {
        echo "数据添加成功!";
    } else {
        echo "数据添加失败: " . mysql_error();
    }
}
?
>

注意事项:

  • method="post":数据将通过 HTTP POST 方式发送,不会出现在 URL 中,适合提交敏感或长文本数据。
  • addslashes():简单的字符串转义,防止特殊字符破坏 SQL 语句(生产环境中建议使用预处理语句 Prepared Statements 以防止 SQL 注入)。
  • INSERT INTO:标准的 SQL 插入语法,需指定列名和对应的值。

简要总结

以上就是PHP连接MySQL数据库的基础详细内容,涵盖了连接建立、使用while/do-while循环读取记录、基于URL参数的页面状态切换以及使用HTML表单POST方法插入数据的完整流程。更多关于PHP数据库操作的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表