PHP导入XML数据至数据库字段为空问题求助
核心问题1:XML遍历逻辑完全错误
从你提供的var_dump结果能看出,XML结构是根节点直接包含item、product_category_code、SKU三个元素,但你用了foreach ($xml->children() as $row)——这里的$row会依次指向每个子元素(比如第一个是<item>,第二个是<product_category_code>),此时循环里取$row->item、$row->product_category_code都是不存在的,这三个变量实际是空值。
你循环内echo $xml->item能输出内容,是因为直接从根节点取值,和循环变量无关,这会误导你以为变量取值正确。
修复:不需要foreach循环,直接从根节点提取值即可:
$item = $xml->item; $product_category_code = $xml->product_category_code; $SKU = $xml->SKU;
如果你的XML是根节点下有多个重复的行节点(比如<note><row>...</row><row>...</row></note>),foreach才适用,但当前结构不符合这个场景。
核心问题2:SQL预处理语句写法错误
你的INSERT语句里VALUES部分写的是字段名而非占位符:
$sql = $con->prepare("INSERT INTO Producten (product_category_code, SKU, item) VALUES (product_category_code, item , SKU)");
这会让数据库把product_category_code当成表字段来取值(而非你传入的变量),如果这些字段默认是空,就会插入空值。正确写法必须用预处理占位符?:
$sql = $con->prepare("INSERT INTO Producten (product_category_code, SKU, item) VALUES (?, ?, ?)");
问题3:变量未初始化导致无提示
$affectedRow没有初始化为0,第一次执行$affectedRow ++时会因变量未定义报错,直接打断后续提示逻辑的执行。需要在循环前初始化:
$affectedRow = 0; $error_message = '';
问题4:SimpleXMLElement对象绑定隐患
直接绑定SimpleXMLElement对象到SQL参数时,部分PHP版本可能出现隐式转换异常,建议强制转成字符串:
$item = (string)$xml->item; $product_category_code = (string)$xml->product_category_code; $SKU = (string)$xml->SKU;
修复后的完整代码示例
// 检查XML文件存在性 if (file_exists('note.xml')) { $xml = simplexml_load_file('note.xml'); var_dump($xml); } else { exit('无法打开XML文件'); } // 初始化统计变量 $affectedRow = 0; $error_message = ''; // 直接从XML根节点提取值 $item = (string)$xml->item; $product_category_code = (string)$xml->product_category_code; $SKU = (string)$xml->SKU; // 验证变量值 echo $item . $product_category_code . $SKU . "waarden\n"; // 预处理SQL语句 $sql = $con->prepare("INSERT INTO Producten (product_category_code, SKU, item) VALUES (?, ?, ?)"); // 绑定参数(顺序需和占位符对应) $sql->bind_param("sss", $product_category_code, $SKU, $item); // 执行并检查结果 if ($sql->execute()) { if ($sql->affected_rows > 0) { $affectedRow++; } } else { $error_message = $con->error . "\n"; } // 输出最终提示 if ($affectedRow > 0) { echo $affectedRow . " 条记录已插入"; } else { echo "无记录插入"; if (!empty($error_message)) { echo " | 错误信息:" . $error_message; } }
额外排查建议
开启PHP错误提示,方便定位隐藏问题:
error_reporting(E_ALL); ini_set('display_errors', 1);
内容的提问来源于stack exchange,提问作者Erik

