PHP mysqli连接MySQL,完整示例代码
前言
PHP连MySQL用mysqli扩展,比mysql扩展好用,支持预处理、事务等。本文写个完整的连接和增删改查示例。
一、连接数据库
面向过程写法
<?php
$host = '127.0.0.1';
$user = 'root';
$pass = '123456';
$dbname = 'test';
$port = 3306;
// 连接
$conn = mysqli_connect($host, $user, $pass, $dbname, $port);
// 检查连接
if (!$conn) {
die('连接失败: ' . mysqli_connect_error());
}
echo '连接成功';
面向对象写法
<?php
$conn = new mysqli('127.0.0.1', 'root', '123456', 'test', 3306);
if ($conn->connect_error) {
die('连接失败: ' . $conn->connect_error);
}
echo '连接成功';
二、设置字符集
mysqli_set_charset($conn, 'utf8mb4');
// 或者
$conn->set_charset('utf8mb4');
注意: 一定要设utf8mb4,不然中文表情存不进去。
三、查询数据(SELECT)
面向过程
$sql = "SELECT id, name, age FROM users WHERE status = 1";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row['id'] . " 姓名: " . $row['name'] . "<br>";
}
} else {
echo "没有数据";
}
面向对象
$sql = "SELECT id, name, age FROM users WHERE status = 1";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row['id'] . " 姓名: " . $row['name'] . "<br>";
}
}
取所有数据为数组
$list = [];
while ($row = mysqli_fetch_assoc($result)) {
$list[] = $row;
}
print_r($list);
四、插入数据(INSERT)
直接写SQL
$name = '张三';
$age = 20;
$sql = "INSERT INTO users (name, age) VALUES ('$name', $age)";
if (mysqli_query($conn, $sql)) {
echo "插入成功,ID: " . mysqli_insert_id($conn);
} else {
echo "插入失败: " . mysqli_error($conn);
}
预处理(防SQL注入,推荐)
$stmt = mysqli_prepare($conn, "INSERT INTO users (name, age) VALUES (?, ?)");
mysqli_stmt_bind_param($stmt, 'si', $name, $age);
// 'si' 表示:string, int
$name = '李四';
$age = 25;
if (mysqli_stmt_execute($stmt)) {
echo "插入成功,ID: " . mysqli_insert_id($conn);
} else {
echo "失败: " . mysqli_error($conn);
}
五、更新数据(UPDATE)
$id = 1;
$name = '王五';
$sql = "UPDATE users SET name = '$name' WHERE id = $id";
if (mysqli_query($conn, $sql)) {
echo "更新成功,影响行数: " . mysqli_affected_rows($conn);
}
六、删除数据(DELETE)
$id = 1;
$sql = "DELETE FROM users WHERE id = $id";
if (mysqli_query($conn, $sql)) {
echo "删除成功";
}
七、关闭连接
mysqli_close($conn);
// 或者
$conn->close();
八、完整示例封装
<?php
class DB
{
private $conn;
public function __construct()
{
$this->conn = new mysqli('127.0.0.1', 'root', '123456', 'test', 3306);
if ($this->conn->connect_error) {
die('连接失败');
}
$this->conn->set_charset('utf8mb4');
}
// 查询多行
public function queryAll($sql)
{
$result = $this->conn->query($sql);
$list = [];
while ($row = $result->fetch_assoc()) {
$list[] = $row;
}
return $list;
}
// 查询单行
public function queryOne($sql)
{
$result = $this->conn->query($sql);
return $result->fetch_assoc();
}
// 关闭
public function __destruct()
{
$this->conn->close();
}
}
// 使用
$db = new DB();
$users = $db->queryAll("SELECT * FROM users");
print_r($users);
九、常见坑
坑1:SQL注入
直接拼接变量到SQL里,有注入风险。
解决: 用预处理语句(?占位符)。
坑2:中文乱码
忘了设字符集。
解决: 连接后立刻 set_charset('utf8mb4')。
坑3:只取一行
用 mysqli_fetch_assoc 循环多次才取完。
注意: 这个函数每次只取一行,要循环。
坑4:连接失败没报错
生产环境关了错误显示。
解决: 手动检查 mysqli_connect_error()。
坑5:忘了关连接
频繁连接不关,占资源。
解决: 用完就关,或者用单例。
总结
记住:
mysqli_connect连接数据库set_charset('utf8mb4')设字符集mysqli_query执行SQLmysqli_fetch_assoc取数据- 防注入用预处理(?占位符)
- 用完
mysqli_close关连接
最常用:
$conn = mysqli_connect('127.0.0.1', 'root', '123456', 'test', 3306);
mysqli_set_charset($conn, 'utf8mb4');
遇到问题加QQ23979811 协助处理