php和mysqlweb开发
用 PHP 连 MySQL,十行代码就能把数据塞进数据库,这是它最实在的地方。我见过不少新手卡在配置环境上,XAMPP 装完,phpMyAdmin 打不开,折腾半天发现是 3306 端口被占。这种事没人替你踩坑,只能自己遇到一次记一次。 PHP 和 MySQL 的组合,本质上是一套“请求—查询—渲染”的流水线。浏览器发来一个 URL,Apache 把请求交给 PHP 脚本,脚本用 mysqli 或 PDO 连上 MySQL,执行 SQL,拿到结果集,再拼成 HTML 吐回去。整个过程没有魔法,出问题的地方无非三个:连接失败、SQL 写错、数据没取到。调试的时候把 连接数据库这件事,PDO 比 mysqli 更值得用。mysqli 的预处理语法有点别扭,参数绑定和结果获取混在一起。PDO 的写法更干净: 注意 SQL 注入不是吓唬人的。早年我接手过一个老项目,登录逻辑是 查询性能这块,索引是绕不开的。一个 分页查询有个经典陷阱: 事务在电商场景里躲不掉。用户下单要同时写 orders 表和 order_items 表,还得扣库存。任何一步失败,整个操作都得回滚。InnoDB 支持事务,MyISAM 不支持——这也是为什么现在基本没人用 MyISAM 了。用 PDO 开事务: 有个细节:MySQL 的默认隔离级别是 REPEATABLE READ,意味着同一个事务里两次相同的 SELECT 结果一致。这会导致“幻读”问题——你以为查到的就是最新的,其实别的会话已经插入了新数据。大多数 Web 应用感知不到,但秒杀场景下要特别小心。 最后说一句,别用 var_dump() 和 error_reporting(E_ALL) 打开,比任何教程都管用。$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'root', ''); $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?'); $stmt->execute([$id]); $user = $stmt->fetch(PDO::FETCH_ASSOC); charset=utf8mb4 这个参数。很多人只写 charset=utf8,存 emoji 的时候直接报错或者变成问号。MySQL 的 utf8 其实是阉割版,最多三个字节,utf8mb4 才是完整的四字节 UTF-8。这个坑我在一个评论系统里踩过,用户发了带 emoji 的留言,数据库里全是乱码,查了半天才定位到字符集。SELECT * FROM users WHERE username = '$name' AND password = '$pass'。在用户名框里输入 ' OR '1'='1,密码随便填,直接进后台。这种代码现在看很蠢,但当年到处都是。预处理语句能解决这个问题,原理是 SQL 结构和数据分两次发给 MySQL,数据永远不会被当成指令解析。SELECT * FROM orders WHERE user_id = 5,如果 user_id 没索引,MySQL 会全表扫描。数据量小的时候没感觉,十万行以上就开始卡。用 EXPLAIN 看执行计划,type 列出现 ALL 就要警惕了。加索引不是越多越好,写入频繁的表加太多索引反而拖慢 INSERT 和 UPDATE。我一般只在 WHERE、JOIN、ORDER BY 用到的列上建索引,复合索引注意最左前缀原则。LIMIT 100000, 10。MySQL 会先读 100010 行再扔掉前 100000 行,越翻到后面越慢。优化方式是用游标分页,记住上一页最后一条的 id,下一页查 WHERE id > 100000 LIMIT 10。前提是 id 连续且有序,不满足就得另想办法。$pdo->beginTransaction(); try { // 一系列写操作 $pdo->commit(); } catch (Exception $e) { $pdo->rollBack(); } mysql_* 函数了。PHP 7 已经移除,PHP 5 里也是废弃状态。看到老教程里写 mysql_connect(),直接关掉换一篇。PDO 或 mysqli 才是现在该用的东西。
-
上一篇
-
下一篇
- 最近发表
- 随机阅读
- 搜索
-
- 友情链接
-