当前位置:首页 > 问答 > 正文

php怎么连数据库查数据然后拿结果,简单点教你一步步操作

准备好你的数据库信息

你得先有个数据库,就像你要去朋友家,总得知道人家住哪儿对吧,把这些信息记下来:

  • 数据库地址: 通常是 localhost,因为数据库和你的网站代码经常放在同一台服务器上,如果不是,就问你的服务器提供商。
  • 数据库名: 你自己创建的数据库叫什么名字,my_shop
  • 用户名: 登录这个数据库的账号,root
  • 密码: 对应这个账号的密码。

第二步:创建连接

用PHP去敲门,建立连接,我们会用 try...catch 来抓错,万一连不上,好歹知道是为什么连不上。

<?php
// 你的数据库信息,换成你自己的
$servername = "localhost";
$username = "你的数据库用户名";
$password = "你的数据库密码";
$dbname = "你的数据库名";
try {
    // 关键的一步:创建PDO连接对象
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 设置一个错误模式,让PDO在出错时抛出异常,这样好排查
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "恭喜,数据库连接成功!<br>";
} catch(PDOException $e) {
    // 如果try里面的代码出错了,就会跳到这里执行
    echo "连接失败: " . $e->getMessage();
}
?>

把上面代码里的 你的数据库用户名 那些替换成你自己的信息,然后运行一下,如果看到“恭喜,数据库连接成功!”,那第一步就妥了。

第三步:写个SQL查询语句

连接上了,我们得告诉数据库我们要什么,这就需要写SQL语句,假设我们有一个叫 users 的表,里面存着用户信息(id, name, email)。

我们想查出所有用户的名字和邮箱。

// ... 接在刚才的连接代码后面,在 try{ 的大括号里面 ...
// 定义我们的SQL查询命令
$sql = "SELECT name, email FROM users";
// 告诉连接对象去准备执行这个SQL命令
$stmt = $conn->prepare($sql);
// 真正地执行它
$stmt->execute();
echo "查询成功!<br>";

这时候,查询结果已经悄悄地放在 $stmt 这个变量里了。

php怎么连数据库查数据然后拿结果,简单点教你一步步操作

第四步:把结果拿出来并显示

查询结果可能有多条数据,我们需要把它们一条一条地取出来,有几种方法,这里说两种最常用的。

用 fetchAll() 一把全拿出来 这个方法适合结果数据量不大的情况,它会把所有结果变成一个数组。

// ... 接在执行成功的代码后面 ...
// 把结果集中的所有行取出来,放到一个叫$result的数组里
// PDO::FETCH_ASSOC 的意思是,让数组的键是字段名('name', 'email'),而不是数字索引。
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 检查一下是不是有结果
if (count($result) > 0) {
    // 用foreach循环来遍历数组里的每一行数据
    foreach($result as $row) {
        // 每一行$row也是一个数组,里面装着这一条记录的数据
        echo "姓名: " . $row['name'] . " - 邮箱: " . $row['email'] . "<br>";
    }
} else {
    echo "没有找到任何记录。";
}

用 fetch() 一行一行地拿 这个方法更节省内存,适合数据量很大的时候。

// ... 接在执行成功的代码后面 ...
// 设置结果集的获取模式为关联数组(和上面一样)
$stmt->setFetchMode(PDO::FETCH_ASSOC);
// 然后用while循环,每次fetch()取一行,取不到的时候就停止
while($row = $stmt->fetch()) {
    echo "姓名: " . $row['name'] . " - 邮箱: " . $row['email'] . "<br>";
}

第五步:关掉连接

php怎么连数据库查数据然后拿结果,简单点教你一步步操作

虽然PHP脚本执行完会自动关闭连接,但养成好习惯,手动关掉它。

// ... 在所有操作的最后 ...
// 直接把连接对象设为null,连接就关闭了
$conn = null;
echo "<br>连接已关闭。";

完整代码合体

把上面的步骤拼在一起,就是一个完整的脚本了:

<?php
$servername = "localhost";
$username = "你的数据库用户名";
$password = "你的数据库密码";
$dbname = "你的数据库名";
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "连接成功!<br>";
    $sql = "SELECT name, email FROM users";
    $stmt = $conn->prepare($sql);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    if (count($result) > 0) {
        foreach($result as $row) {
            echo "姓名: " . $row['name'] . " - 邮箱: " . $row['email'] . "<br>";
        }
    } else {
        echo "没数据";
    }
    $conn = null;
    echo "<br>连接关闭。";
} catch(PDOException $e) {
    echo "出错啦: " . $e->getMessage();
}
?>

最后提醒一个超级重要的事:安全!

上面的例子是直接写了SQL语句,但如果你的查询条件是从用户那里来的(比如搜索框),千万不要直接把用户输入拼到SQL语句里,否则会有“SQL注入”攻击的风险,非常危险!

正确的方法是使用 参数绑定,像这样:

// 假设用户通过$_GET['user_id']传递了一个id过来
$user_id = $_GET['user_id'];
// SQL语句里用 :占位符 来代替变量
$sql = "SELECT name, email FROM users WHERE id = :user_id";
$stmt = $conn->prepare($sql);
// 把变量绑定到占位符上,PDO会自动处理安全问题
$stmt->bindParam(':user_id', $user_id);
$stmt->execute();
// ... 后面取数据的操作一样 ...

好了,以上就是从连接数据库到查询显示结果的全部基础操作,你只要把数据库信息和表名换成你自己的,就能跑起来了,多试几次,就熟悉了。