PHP 简明教程

PHP MySQL 读取数据

1. 从 MySQL 数据库中读取数据

在 SQL 中,SELECT 命令主要用于从数据库的表中选取数据。

如果您想要从表中提取特定的列,可以使用如下的 SQL 语法:

SELECT column1, column2, column3 FROM table_name

如果您想要选取数据表中的所有列,请使用 * 字符:

SELECT * FROM table_name

2. 使用 MySQLi 读取数据

以下实例演示了如何从 "MyGuests" 表中选取 idfirstnamelastname 列,并将其结果输出展示在网页上:

2.1 MySQLi 面向对象 (Object-oriented)

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接
if ($conn->connect_error) {
  die("连接失败: " . $conn->connect_error);
}

$sql = "SELECT id, firstname, lastname FROM MyGuests";
// 执行 SQL 查询
$result = $conn->query($sql);

// 处理结果集
if ($result->num_rows > 0) {
  // 遍历并输出每行数据
  while($row = $result->fetch_assoc()) {
    echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
  }
} else {
  echo "0 结果";
}
$conn->close();
?>

2.2 核心代码解析

上面的代码在执行读取时完成了以下核心操作:

首先,我们设置了一个查询数据库的 SQL 语句,指令从 MyGuests 表中选择 idfirstnamelastname。代码的下一行 $result = $conn->query($sql); 负责向数据库发送并执行该查询,并将返回的数据结构分配给 $result 变量。

接下来,通过 $result->num_rows 函数来检查数据表是否返回了任何行。如果返回的数据行数大于 0,说明成功读取到了记录,接着使用 while 循环遍历所有的记录。

在循环体中,fetch_assoc() 函数将当前结果集转换为一个关联数组,并赋给 $row 变量。随后便可以通过对应的列名直接访问和输出数组项。如果没有查找到任何记录,程序则会直接输出 "0 结果"。

2.3 MySQLi 面向过程 (Procedural)

与面向对象类似,以下是采用面向过程方式实现同样读取功能的方法:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 检查连接
if (!$conn) {
  die("连接失败: " . mysqli_connect_error());
}

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
  // 遍历并输出每行数据
  while($row = mysqli_fetch_assoc($result)) {
    echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
  }
} else {
  echo "0 结果";
}

mysqli_close($conn);
?>

3. 使用 PDO 读取数据

PDO(PHP Data Objects)是另一种极其常用且支持多数据库环境的连接方式。以下实例展示了如何使用 PDO 结合预处理语句来选取数据,并通过 HTML 表格进行渲染:

<?php
echo "<table style='border: solid 1px black;'>";
echo "<tr><th>Id</th><th>Firstname</th><th>Lastname</th></tr>";

class TableRows extends RecursiveIteratorIterator {
  function __construct($it) {
    parent::__construct($it, self::LEAVES_ONLY);
  }

  function current() {
    return "<td style='width:150px;border:1px solid black;'>" . parent::current(). "</td>";
  }

  function beginChildren() {
    echo "<tr>";
  }

  function endChildren() {
    echo "</tr>" . "\n";
  }
}

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try {
  $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // 预处理 SQL 语句
  $stmt = $conn->prepare("SELECT id, firstname, lastname FROM MyGuests");
  $stmt->execute();

  // 将提取模式设置为关联数组
  $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
  
  foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
    echo $v;
  }
} catch(PDOException $e) {
  echo "Error: " . $e->getMessage();
}

$conn = null;
echo "</table>";
?>