PHP连MySQL,数据说白了就三步:建连接、库代查数据、数据关连接。库代但新手常在这第一步就卡住——旧教程让你用mysql_connect,数据新教程让你用PDO,库代中间还夹着个mysqli,数据选哪个?库代我的建议是:别纠结,直接上PDO。数据理由后面说。库代
先看最基础的数据写法。假设你本地装了XAMPP,库代MySQL账号root,数据密码空着,库代数据库名叫test_db。数据代码长这样:
<?php $dsn = 'mysql:host=localhost;dbname=test_db;charset=utf8'; $user = 'root'; $pass = ''; try { $pdo = new PDO($dsn, $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo '连上了,兄弟。'; } catch (PDOException $e) { die('连接炸了:' . $e->getMessage()); } ?> 注意那个charset=utf8,很多人漏掉这个,结果中文全变问号。这不是玄学,是编码没对齐。MySQL默认的utf8其实不是真正的UTF-8,只支持到三个字节的字符,emoji那种四个字节的会报错。要真支持,得写成utf8mb4。我一般直接用utf8mb4,省得以后换。
连接成功后,查询才是重头戏。用PDO的好处是预处理语句贼方便,防SQL注入是顺手的事。看这个例子:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?'); $stmt->execute([$_POST['email']]); $user = $stmt->fetch(PDO::FETCH_ASSOC); 问号占位符,execute传数组,干净利落。你手动拼字符串试试?上次我见一同事把用户输入直接怼进SQL,结果删库跑路,第二天就被开了。别学他。
插入数据也类似,但有个细节容易踩坑。用lastInsertId()拿自增主键时,必须在同一连接里调用,中间不能断。还有,事务处理——比如转账操作,得用beginTransaction()包起来。别嫌麻烦,真出问题了回滚一下,比哭都强。
关连接?其实不用管。PHP脚本跑完,连接自动断。但长驻进程(比如用Swoole)就得手动置null。普通网页开发,你写不写都行,写了反而显得专业。
最后说点实在的。你可能会遇到一个坑:MySQL 8.0默认用了caching_sha2_password插件,老版PHP的mysqli连不上。这时候PDO反而稳,因为它的驱动会处理。或者你干脆把MySQL用户改成mysql_native_password,但治标不治本。版本兼容这破事,PDO是最省心的选择。
还有,别在生产环境把错误信息直接print出来。上面代码里die显示错误,那是给本地调试用的。线上应该记日志,然后给用户一个中性的提示。我见过把数据库密码打在页面上的,那酸爽,第二天公司服务器就被挖矿了。
写代码这事,没有银弹。但PDO+预处理,基本能覆盖你90%的需求。剩下的10%,等真遇到了再Google也不迟。
