Win2019 IIS10环境PHP连接MySQL报500错误及语法解析错误问题
问题根因
你遇到的两个报错分别对应不同的问题:
- 500错误+语法报错
unexpected '$pdo' (T_VARIABLE):你复制的代码中,try {、各个catch {的大括号后面隐藏了Unicode零宽不可见字符,PHP解析器无法识别这类字符,会将其判定为无效语法,导致紧跟在后面的$pdo被识别为意外的Token,直接触发致命错误返回500。这也是为什么你觉得代码结构没问题但跑不起来的核心原因,这类不可见字符通常是从带格式的文档(Word、富文本网页、PDF等)复制代码时夹带的。 allow_url_include弃用警告:PHP 7.2及以上版本已经废弃该配置项,你当前php.ini中开启了该配置,会触发废弃警告,不属于致命错误但建议修改。
修复步骤
- 第一步:清理代码中的不可见字符
不要直接复制现有代码,手动重新敲一遍连接逻辑,或者用编辑器的「显示所有字符」功能删除大括号旁的不可见字符,规范参考代码如下:
<?php define("DB_HOST", "xxxx"); define("DB_PORT", 3306); define("DB_NAME", "xxxx"); define("DB_USER", "xxxxx"); define("DB_PASS", "xxxxxxx"); define("DB_CHARSET", "utf8mb4"); try { $dsn = sprintf('mysql:host=%s;port=%d;dbname=%s;charset=%s', DB_HOST, DB_PORT, DB_NAME, DB_CHARSET); $pdo = new PDO($dsn, DB_USER, DB_PASS); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // 建议开启PDO异常模式,方便后续排查连接以外的错误 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { echo "数据库连接失败(100): " . $e->getMessage(); die(); } catch (Exception $e) { echo "数据库连接失败(200): " . $e->getMessage(); die(); } ?>
注意原代码中将端口写在host值里的写法不符合PDO DSN规范,单独拆分port参数兼容性更好。
- 第二步:修改php.ini配置消除警告
打开当前PHP版本对应的php.ini文件,找到allow_url_include配置项,将值修改为Off,修改后重启IIS的PHP FastCGI服务即可生效。 - 第三步:验证扩展状态
新建phpinfo.php文件写入<?php phpinfo(); ?>,访问后确认pdo_mysql、mysqli扩展处于启用状态即可。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

