PDO连接中dbname与=之间加空格会产生什么差异?
为什么PDO连接时dbname后加空格就没有错误输出?
这是个很容易踩坑的细节,我来给你捋清楚背后的原因:
核心问题:PDO对DSN的解析规则
PDO的MySQL连接DSN格式要求每个选项必须是key=value的形式,选项名和等号之间不能有空格。当你写成dbname =ehrp时,PDO会把dbname (注意后面带空格)当成一个完整的选项名——而这个选项名是MySQL驱动不识别的,所以它会直接忽略这个无效选项。
两种场景的差异
正常写法(
dbname=ehrp):
PDO正确识别dbname选项,尝试连接名为ehrp的数据库,但这个数据库不存在,MySQL返回1049 Unknown database错误,PDO捕获到这个异常并输出错误信息。带空格的写法(
dbname =ehrp):
PDO忽略了无效的dbname选项,连接时没有指定要连接的数据库。而MySQL允许在不指定数据库的情况下建立连接(只要用户名和密码正确),这次连接实际上是成功的——既然连接没出错,自然不会进入catch块,页面也就没有任何错误输出。
验证方法
你可以在第二种写法的代码里加一行验证,看看当前连接的数据库是什么:
<?php try { $pdo = new PDO('mysql:host=localhost;dbname =ehrp', 'root', ''); // 输出当前连接的数据库 echo "当前数据库:" . $pdo->query('SELECT DATABASE()')->fetchColumn(); } catch (PDOException $e) { echo $e->getMessage(); } ?>
运行后会发现输出是空的,这就证明连接确实没有指向任何数据库,自然不会触发“未知数据库”的错误。
总结
PDO的DSN解析对空格很敏感,选项名和等号之间绝对不能加空格,否则会被当成无效选项忽略,导致连接行为不符合预期。
内容的提问来源于stack exchange,提问作者Rahul Ranjan
相关产品推荐
相关产品推荐

