gpt4 book ai didi

php - 为什么 XMLReader 重复 mysql insert function inside while 并且不能停止?

转载 作者:行者123 更新时间:2023-11-28 23:10:38 25 4
gpt4 key购买 nike

我正在使用 XMLReader 按元素将巨大的 xml 文件导入 MySQL 数据库。 Xml 包含 1 547 772 个名为“RECORD”的标签(元素)。

XML 示例

<?xml version="1.0" encoding="utf-8"?>
<RECORD><NAME>ДОШКІЛЬНИЙ НАВЧАЛЬНИЙ ЗАКЛАД №1 ЗАГАЛЬНОГО РОЗВИТКУ УЖГОРОДСЬКОЇ МІСЬКОЇ РАДИ ЗАКАРПАТСЬКОЇ ОБЛАСТІ</NAME><SHORT_NAME>ДНЗ №1</SHORT_NAME><EDRPOU>34888585</EDRPOU><ADDRESS>88000, Закарпатська обл., місто Ужгород, ВУЛИЦЯ М.ВОВЧКА, будинок 47, "А"</ADDRESS><BOSS>НАКОНЕЧНА ОЛЕНА АНАТОЛІЇВНА</BOSS><KVED>85.10 Дошкільна освіта</KVED><STAN>зареєстровано</STAN><FOUNDERS><FOUNDER>УПРАВЛІННЯ ОСВІТИ УЖГОРОДСЬКОЇ МІСЬКОЇ РАДИ, розмір внеску до статутного фонду - 0.00 грн.</FOUNDER>...</FOUNDERS></RECORD>...

MySQL连接使用

function connectBase(){

include __DIR__ . '/../../settings/sql.set.php';
$mysql = mysqli_connect($_sqlhost, $_sqluser, $_sqlpass, $_sqldb);
mysqli_query($mysql, "Set charset utf8");
mysqli_query($mysql, "Set character_set_client = utf8");
mysqli_query($mysql, "Set character_set_connection = utf8");
mysqli_query($mysql, "Set character_set_results = utf8");
mysqli_query($mysql, "Set collation_connection = utf8_general_ci");
return $mysql;
}

解析的主要函数

function XMLReaderToDB($setting = false)
{

$mysql = connectBase();
$dir = __DIR__ . '/../../tmp/';
$xmlURL = $dir . $setting['file'];
$xml = new XMLReader();
$xml->open($xmlURL);

$start_time = time();
$start = $setting['start'];
$limit = $setting['limit'];
$stop = $start + $limit;

$i = 0;
$count = 0;
$result = 1;

while($xml->read())
{
if ($xml->nodeType == XMLReader::ELEMENT && $xml->name == $setting['tag']) {

$item[] = "('items', '" . mysqli_real_escape_string($mysql, $xml->readOuterXML()) . "')";
}

if ($xml->nodeType == XMLReader::END_ELEMENT && $xml->name == $setting['tag']) {
$i++;
$count++;
if ($count >= 500) {
insertXMLtoDB($mysql, $item);
$item = array();
$count = 0;
}
}
if($i == $stop){
break;
}
}
$xml->close();
insertXMLtoDB($mysql, $item);

$mysql->close();

$end_time = time();
$time_elapsed_secs = $end_time - $start_time;
echo '<br/>Items: ' . $i . '<br/>';
echo 'Start: ' . date('H:i:s', $start_time) . '<br/>';
echo 'End: ' . date('H:i:s', $end_time) . '<br/>';
echo $time_elapsed_secs . ' sec. (' . ($time_elapsed_secs /60) . ' min.)';
die;
}

对于 MySQL 插入

function insertXMLtoDB($mysql, $data = false){
mysqli_query($mysql,"INSERT INTO _parse_tmp (parse_key, parse_value) VALUES " . implode(", ", $data));
$data = array();
// echo 'Success';
}

但是,MySQL 请求不会在 1 547 772 次插入后停止,并且“while”继续运行。我注意到是否取消注释 echo 'Success';在 insertXMLtoDB 函数中,“while”停止在 1 547 772 次插入并正确完成。我的功能有什么问题?

最佳答案

不过,我个人从未使用过 XMLReader,我假设您可以尝试在语句中添加另一个条件,例如 while($xml->read() && $i != $stop) 反对直接将它放在循环中。啊还刚刚注意到在你使用函数 insertXMLtoDB 之后你重新声明了 $data 虽然你会注意到你每次调用函数时都将它设置为 NULL,因此设置它到一个数组是没有意义的。

关于php - 为什么 XMLReader 重复 mysql insert function inside while 并且不能停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46140989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com