php查询mysql数据库
用PHP查MySQL,数据最核心的数据就一件事:把SQL语句交给数据库,再把返回的数据结果变成你能用的东西。别想复杂了,数据就这么简单。数据
我见过太多新手死磕各种框架和ORM,数据最后连原生查询都写不利索。数据其实原生方式也就三步:连库、数据执行、数据取数据。数据拿mysqli扩展来说,数据代码长这样:
$conn = new mysqli('localhost',数据 'user', 'pass', 'dbname'); if ($conn->connect_error) { die('连接失败: ' . $conn->connect_error); } $result = $conn->query("SELECT * FROM users WHERE age > 18"); while ($row = $result->fetch_assoc()) { echo $row['name'] . ' - ' . $row['email'] . '<br>'; } $conn->close(); 这段代码能跑,但直接扔到生产环境会出事——SQL注入。数据我见过某小网站被脱库,数据就是数据因为在查询里直接拼接了用户输入。所以记住:凡是涉及变量的查询,必须用预处理语句。
预处理写法也不难,就是把参数绑定进去:
$stmt = $conn->prepare("SELECT * FROM users WHERE email = ?"); $stmt->bind_param("s", $email); $stmt->execute(); $result = $stmt->get_result(); while ($user = $result->fetch_assoc()) { // 处理每一行数据 } 注意那个"s",意思是参数类型是字符串。如果传整数就写"i",浮点数写"d"。这个细节坑过不少人——类型写错,查询结果就莫名其妙不对了。
取数据的方式也有讲究。fetch_assoc()返回关联数组,键名是字段名,适合大多数场景。fetch_row()返回索引数组,节省内存但可读性差。fetch_object()返回对象,用$row->name这种形式访问,我个人觉得最顺手。
真正麻烦的是处理大量数据。比如查十万条记录,用while循环一条条取没问题,但如果你用fetch_all()一次性全取出来,内存直接爆掉。我做过一个导出功能,刚开始用fetch_all,几万条数据就把服务器搞宕机了,后来改成循环分批处理,问题解决。
还有字符集的问题。数据库是UTF-8,PHP页面也是UTF-8,但查出来中文就是乱码?八成是连接没设置字符集。在查询前加一句$conn->set_charset('utf8mb4'),保你平安。utf8mb4比utf8多支持一些特殊字符,比如emoji,建议直接用它。
另一个容易被忽略的是连接资源释放。虽然PHP脚本结束会自动关闭连接,但长驻进程(比如用Swoole或Workerman)不释放就等着连接数耗尽吧。养成好习惯:查完就close,用完就释放。
最后说个真实案例。之前帮朋友改一个老系统,页面加载要8秒,查了下发现SQL里有个子查询,每次执行都全表扫描。改成JOIN之后,速度提升到0.1秒。所以PHP代码写得再花哨,SQL语句烂一切都白搭。先优化SQL,再优化PHP代码,顺序不能反。
写PHP查询MySQL,本质上就是跟数据库对话。把对话方式搞对,性能和安全都兼顾了,剩下的就是业务逻辑的事。别怕写原生SQL,它比任何封装都透明——出问题你能一眼看出来。
