PHP mysqli 实用开发指南

发布时间:2026/5/18 0:39:51

PHP mysqli 实用开发指南 PHP mysqli 实用开发指南在 PHP 开发中与 MySQL 数据库交互是最常见的需求之一。mysqli是 PHP 官方推荐的 MySQL 扩展它提供了面向对象和过程化两种风格支持预处理语句防 SQL 注入、事务处理等高级特性完全替代了早已废弃的mysql扩展。一、连接与关闭数据库面向对象风格推荐?php// 数据库配置$hostlocalhost;$userroot;$passwordyour_password;$databaseyour_database;$port3306;// 创建连接$mysqlinewmysqli($host,$user,$password,$database,$port);// 检查连接错误if($mysqli-connect_error){die(连接失败: .$mysqli-connect_error);}// 设置字符集非常重要防止乱码$mysqli-set_charset(utf8mb4);echo连接成功;// 关闭连接可选脚本结束时会自动关闭$mysqli-close();?过程化风格?php$hostlocalhost;$userroot;$passwordyour_password;$databaseyour_database;// 创建连接$mysqlimysqli_connect($host,$user,$password,$database);// 检查连接错误if(!$mysqli){die(连接失败: .mysqli_connect_error());}// 设置字符集mysqli_set_charset($mysqli,utf8mb4);echo连接成功;// 关闭连接mysqli_close($mysqli);?二、查询数据方法说明返回数据类型fetch_assoc()返回关联数组键名为字段名arrayfetch_row()返回索引数组键名为数字索引arrayfetch_array()返回关联 索引数组默认arrayfetch_object()返回对象属性名为字段名object?php$mysqlinewmysqli(localhost,root,pwd,test_db);$mysqli-set_charset(utf8mb4);// 执行查询$sqlSELECT id, username, email FROM users WHERE age 18;$result$mysqli-query($sql);// 检查是否有结果if($result$result-num_rows0){// 1. 使用 fetch_assoc()推荐最直观echoh3关联数组方式/h3;while($row$result-fetch_assoc()){echoID: .$row[id]. - 用户名: .$row[username]. - 邮箱: .$row[email].br;}// 2. 使用 fetch_object()如果你喜欢对象风格// 注意需要先将结果集指针重置到开头如果已经遍历过一次$result-data_seek(0);echoh3对象方式/h3;while($row$result-fetch_object()){echoID: .$row-id. - 用户名: .$row-username.br;}}else{echo没有找到数据;}// 释放结果集$result-free();$mysqli-close();?三、插入、更新、删除插入数据INSERT?php$mysqlinewmysqli(localhost,root,pwd,test_db);$mysqli-set_charset(utf8mb4);$sqlINSERT INTO users (username, email, age) VALUES (张三, zhangsanexample.com, 25);if($mysqli-query($sql)TRUE){// 获取插入的自增 ID非常常用$new_id$mysqli-insert_id;echo数据插入成功新记录 ID 为: .$new_id;}else{echo插入错误: .$mysqli-error;}$mysqli-close();?更新数据UPDATE?php$mysqlinewmysqli(localhost,root,pwd,test_db);$mysqli-set_charset(utf8mb4);$sqlUPDATE users SET age 26 WHERE username 张三;if($mysqli-query($sql)TRUE){// 获取受影响的行数echo数据更新成功受影响行数: .$mysqli-affected_rows;}else{echo更新错误: .$mysqli-error;}$mysqli-close();?删除数据DELETE?php$mysqlinewmysqli(localhost,root,pwd,test_db);$mysqli-set_charset(utf8mb4);$sqlDELETE FROM users WHERE id 10;if($mysqli-query($sql)TRUE){echo数据删除成功受影响行数: .$mysqli-affected_rows;}else{echo删除错误: .$mysqli-error;}$mysqli-close();?四、核心重点预处理语句防 SQL 注入SQL 注入是最常见的安全漏洞预处理语句是解决这个问题的最佳方案。它的原理是先发送 SQL 模板再发送参数数据与逻辑分离绝对安全。这样就不怕11 --攻击了方法说明prepare($sql)准备 SQL 语句返回 statement 对象bind_param()绑定参数给占位符赋值execute()执行预处理语句get_result()获取结果集仅 SELECT需要 mysqlnd 驱动bind_result()绑定结果变量用于获取 SELECT 数据close()关闭 statement 对象bind_param()第一个参数是类型字符串每个字符对应一个参数的类型字符类型iintegerddoublesstringbblob使用预处理查询数据SELECT?php$mysqlinewmysqli(localhost,root,pwd,test_db);$mysqli-set_charset(utf8mb4);// SQL 模板使用 ? 作为占位符$sqlSELECT id, username, email FROM users WHERE age ? AND city ?;// 1. 准备语句$stmt$mysqli-prepare($sql);// 2. 绑定参数 (i int, s string)$age18;$city北京;$stmt-bind_param(is,$age,$city);// 注意变量必须在 bind_param 之前定义// 3. 执行$stmt-execute();// 4. 获取结果推荐使用 get_result需要 mysqlnd 驱动$result$stmt-get_result();if($result-num_rows0){while($row$result-fetch_assoc()){echoID: .$row[id]. - 用户名: .$row[username].br;}}else{echo没有数据;}// 5. 关闭$stmt-close();$mysqli-close();?使用预处理插入数据INSERT?php$mysqlinewmysqli(localhost,root,pwd,test_db);$mysqli-set_charset(utf8mb4);$sqlINSERT INTO users (username, email, age) VALUES (?, ?, ?);$stmt$mysqli-prepare($sql);// 绑定参数$username李四;$emaillisiexample.com;$age30;$stmt-bind_param(ssi,$username,$email,$age);if($stmt-execute()){echo插入成功新 ID: .$stmt-insert_id;// 注意这里是 $stmt-insert_id}else{echo插入失败: .$stmt-error;}$stmt-close();$mysqli-close();?五、事务处理保证数据一致性事务用于确保一组 SQL 操作要么全部成功要么全部失败例如转账操作A 扣钱和 B 加钱必须同时成功。?php$mysqlinewmysqli(localhost,root,pwd,test_db);$mysqli-set_charset(utf8mb4);// 关闭自动提交开启事务$mysqli-autocommit(FALSE);try{// 操作 1A 账户扣 100 元$sql1UPDATE accounts SET balance balance - 100 WHERE id 1;$mysqli-query($sql1);if($mysqli-affected_rows0){thrownewException(A 账户扣款失败);}// 操作 2B 账户加 100 元$sql2UPDATE accounts SET balance balance 100 WHERE id 2;$mysqli-query($sql2);if($mysqli-affected_rows0){thrownewException(B 账户加款失败);}// 提交事务$mysqli-commit();echo转账成功;}catch(Exception$e){// 回滚事务$mysqli-rollback();echo转账失败: .$e-getMessage();}// 重新开启自动提交$mysqli-autocommit(TRUE);$mysqli-close();?六、最佳实践总结永远使用面向对象风格代码更现代易维护。永远使用预处理语句杜绝 SQL 注入这是底线。永远设置字符集使用utf8mb4支持 emoji防止乱码。做好错误处理不要直接输出$mysqli-error到生产环境应记录日志。关闭连接是好习惯虽然脚本结束会自动关闭但显式关闭更规范。掌握以上内容足以应对 95% 的 PHP 数据库开发场景。如果需要更复杂的功能如批量插入、多结果集可以查阅 PHP 官方手册进一步深入。

相关新闻