PHP生成XML文件问题排查:数据库取数存数组出错
问题排查与修正方案
我帮你梳理了代码里的几个关键问题,一个个来解决:
1. SQL语法错误
你的SELECT语句里表名的反引号没闭合,这会直接导致查询失败:
// 错误写法:`employee`缺少闭合反引号 $query = mysql_query("SELECT `employee_id`, `employee_fname`, `employee_lname`, `employee_department`, `employee_dateOfBirth`, `car_status` FROM `employee");
修正后:
$query = mysql_query("SELECT `employee_id`, `employee_fname`, `employee_lname`, `employee_department`, `employee_dateOfBirth`, `car_status` FROM `employee`");
2. 废弃的mysql扩展问题
你已经实例化了$DB = new Database();,却混用了PHP早已废弃的mysql_*函数(mysql_query、mysql_fetch_array)——这些函数在PHP 5.5+就被弃用,PHP 7+直接移除了。
如果你的Database类是基于mysqli/PDO实现的,应该用类内的方法执行查询,比如假设类里有query方法:
$result = $DB->query("SELECT `employee_id`, `employee_fname`, `employee_lname`, `employee_department`, `employee_dateOfBirth`, `car_status` FROM `employee`"); while ($row = $result->fetch_assoc()) { // 赋值逻辑 }
如果非要用旧扩展(非常不推荐),得确保PHP版本支持,且已经通过mysql_connect建立连接,但强烈建议迁移到mysqli或PDO。
3. 数组与XML的映射顺序错误
你把数组按id, fname, lname, department, dateOfBirth, car_status的顺序存储,但生成XML时搞反了department和dateOfBirth的索引:
// 错误:$employeeINF[3]是department,却赋值给了dateOfBirth $dateOfBirth_= $doc->createElement("dateOfBirth",$employeeINF[3]); $department_= $doc->createElement("department",$employeeINF[4]);
修正后:
$department_= $doc->createElement("department",$employeeINF[3]); $dateOfBirth_= $doc->createElement("dateOfBirth",$employeeINF[4]);
4. XML结构逻辑错误
当前代码只创建了一个<employeeInfo>元素,把所有员工的字段都塞进去,生成的XML会混乱(所有员工的id/name等堆在一起)。正确的做法是每个员工对应一个独立的<employeeInfo>,把创建该元素的逻辑放到循环里:
foreach ($employeesArray as $employee_id => $employeeINF) { // 每个员工创建专属的employeeInfo元素 $employeeInfo = $doc->createElement("employeeInfo"); $employeeList->appendChild($employeeInfo); // 再添加各个子字段 }
5. 未初始化数组的潜在报错
如果数据库查询无结果,$employeesArray会未定义,导致foreach循环报错。建议先初始化数组:
$employeesArray = [];
修正后的完整代码示例(适配mysqli扩展)
<?php include_once 'dbh.inc.php'; $DB = new Database(); // 提前初始化数组,避免无数据时报错 $employeesArray = []; // 修正SQL语句,用mysqli方式查询(假设Database类的query返回mysqli_result) $query = "SELECT `employee_id`, `employee_fname`, `employee_lname`, `employee_department`, `employee_dateOfBirth`, `car_status` FROM `employee`"; $result = $DB->query($query); // 用fetch_assoc获取关联数组,可读性更强 while ($row = $result->fetch_assoc()) { $employeesArray[$row['employee_id']] = [ $row['employee_id'], $row['employee_fname'], $row['employee_lname'], $row['employee_department'], $row['employee_dateOfBirth'], $row['car_status'] ]; } // 生成XML $doc = new DOMDocument('1.0'); $employeeList = $doc->createElement("employeeList"); $doc->appendChild($employeeList); foreach ($employeesArray as $employee_id => $employeeINF) { // 每个员工创建独立的employeeInfo节点 $employeeInfo = $doc->createElement("employeeInfo"); $employeeList->appendChild($employeeInfo); $id_ = $doc->createElement("id", $employeeINF[0]); $employeeInfo->appendChild($id_); $name_ = $doc->createElement("name", $employeeINF[1]); $employeeInfo->appendChild($name_); $lname_= $doc->createElement("lastname", $employeeINF[2]); $employeeInfo->appendChild($lname_); // 修正字段映射顺序 $department_= $doc->createElement("department", $employeeINF[3]); $employeeInfo->appendChild($department_); $dateOfBirth_= $doc->createElement("dateOfBirth", $employeeINF[4]); $employeeInfo->appendChild($dateOfBirth_); $car_= $doc->createElement("car", $employeeINF[5]); $employeeInfo->appendChild($car_); } header('content-type: text/xml'); echo $doc->saveXML(); ?>
补充:用DOMDocument创建XML时,特殊字符(如&、<、>)会自动转义,这部分不需要额外处理。
内容的提问来源于stack exchange,提问作者pflove
相关产品推荐
相关产品推荐

