PDO连接与mysqli函数混用报错:期望类型mysqli,实际传入PDO
解决PDO连接与mysqli函数混用导致的类型不匹配错误
报错信息
Uncaught TypeError: mysqli_query(): Argument #1 ($conn) must be of type mysqli, PDO given
类型提示:Expected type 'mysqli'. Found 'PDO'
问题根源
你用PDO扩展创建了数据库连接对象$conn,但在查询数据时错误调用了mysqli系列函数(mysqli_query、mysqli_fetch_array)。PDO和mysqli是PHP中两个独立的数据库扩展,它们的API不能交叉混用,必须统一使用其中一种的语法。
修复步骤
1. 修正数据库连接配置
首先检查connection.php中的数据库名,把占位符dbname=///替换为你实际的数据库名称,比如:
<?php $servername = "localhost"; $username = "root"; $password = ""; // 替换dbname为真实数据库名 $conn = new PDO("mysql:host=$servername;dbname=your_database_name", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); ?>
2. 重构view.php的查询逻辑
把原有的mysqli语法全部替换为PDO语法,同时修复代码中的变量不一致问题,并且加入SQL注入防护:
<?php include("../config/connection.php"); // 先验证参数是否合法 if (isset($_GET['name_surname']) && trim($_GET['name_surname']) !== '') { $name_surname = $_GET['name_surname']; // 使用PDO预处理语句,避免SQL注入 $sql = "SELECT * FROM problems_water WHERE name_surname = :name_surname"; $stmt = $conn->prepare($sql); $stmt->bindParam(':name_surname', $name_surname, PDO::PARAM_STR); $stmt->execute(); // 遍历结果集,获取关联数组 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { ?> <h3>姓名:</h3> <p><?php echo htmlspecialchars($row["name_surname"]); ?></p> <h3>手机号:</h3> <p><?php echo htmlspecialchars($row["phone_number"]); ?></p> <h3>地址:</h3> <p><?php echo htmlspecialchars($row["address"]); ?></p> <h3>区域:</h3> <p><?php echo htmlspecialchars($row["area"]); ?></p> <h3>创建时间:</h3> <p><?php echo htmlspecialchars($row["created_at"]); ?></p> <?php } } ?>
关键改动说明
- 替换
mysqli_query为PDO的预处理流程(prepare()+bindParam()+execute()),彻底避免SQL注入风险 - 用
$stmt->fetch(PDO::FETCH_ASSOC)替代mysqli_fetch_array(),获取关联数组格式的查询结果 - 修正原代码中循环变量
$problems_water与输出变量$row不一致的问题 - 输出内容时用
htmlspecialchars()转义,防止XSS攻击 - 增加参数合法性校验,避免未定义索引的警告
内容的提问来源于stack exchange,提问作者KHL kh
相关产品推荐
相关产品推荐

