mysqli_query()执行无条件查询返回的是mysqli_result对象而非数组,必须用mysqli_fetch_assoc()等函数提取数据;PDO中可用query()直接查询,无需prepare(),再用fetch()获取结果。

PHP 中用 mysqli_query() 执行单表无条件查询最简写法
直接用 mysqli_query() 发送 SELECT * FROM 表名 就能拿到结果集,但必须配合 mysqli_fetch_assoc() 或类似函数才能转成 PHP 数组。不处理返回值的话,你看到的只是个资源(resource)或对象,不是数据。
-
mysqli_query()返回的是结果集(mysqli_result对象),不是数组 - 必须用
mysqli_fetch_assoc()、mysqli_fetch_array()或循环配合才能取出行数据 - 没加
WHERE就是无条件,但别漏了分号和引号——常见错误是写成"SELECT * FROM users"却忘了前面的连接句柄
mysql_connect('localhost', 'root', '123');
mysqli_select_db($conn, 'test');
$result = mysqli_query($conn, "SELECT * FROM users");
while ($row = mysqli_fetch_assoc($result)) {
echo $row['name'] . "\n";
}PDO 方式查单表:prepare() 不是必须的,query() 更直接
无条件查询不需要参数绑定,用 PDO::query() 比 prepare() + execute() 更轻量。很多人一上来就套 prepare,反而多写两行还容易忘记调 execute()。
-
query()直接返回PDOStatement,可直接fetch()或fetchAll() - 若用
prepare(),必须调execute(),否则查不到数据 - 默认 fetch 模式是
PDO::FETCH_BOTH,推荐显式设为PDO::FETCH_ASSOC避免下标混淆
$pdo = new PDO("mysql:host=localhost;dbname=test", "root", "123");
$stmt = $pdo->query("SELECT * FROM users");
$stmt->setFetchMode(PDO::FETCH_ASSOC);
while ($row = $stmt->fetch()) {
echo $row['id'] . ': ' . $row['email'] . "\n";
}查出来是空数组?先确认这三件事
执行完查询却得不到数据,90% 不是 SQL 写错,而是连接、选择库或结果读取环节断在中间。
- 检查
mysqli_connect()或PDO构造是否成功,失败时要var_dump($conn)看是不是false或抛异常 - 确认当前连接已选中目标数据库,
mysqli_select_db()返回true才算生效 - 用
mysqli_num_rows($result)或$stmt->rowCount()先看有没有记录,再决定进不进 while 循环
为什么不要用 mysql_* 函数(已废弃)
mysql_connect()、mysql_query() 在 PHP 7.0+ 已被彻底移除,不是“不推荐”,是运行就报 Fatal error: Uncaught Error: Call to undefined function mysql_connect()。现在只有两条路:mysqli 或 PDO。
立即学习“PHP免费学习笔记(深入)”;
- mysqli 支持面向过程和面向对象两种风格,新手用过程式更直观
- PDO 统一接口,换数据库只需改 DSN,适合后期可能迁移场景
- 二者都支持预处理防注入,但无条件查询时不用硬套,别为安全牺牲可读性
实际写的时候,先连上、再查、再取,三步缺一不可。最容易卡住的是以为 mysqli_query() 返回的就是数组——它只是个句柄,得靠 fetch 系列函数“掰开”才行。











