Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在MySQL数据库中插入XML,同时确保它是UTF8且仅为纯文本(无符号-é;等)_Php_Mysql_Xml - Fatal编程技术网

Php 在MySQL数据库中插入XML,同时确保它是UTF8且仅为纯文本(无符号-é;等)

Php 在MySQL数据库中插入XML,同时确保它是UTF8且仅为纯文本(无符号-é;等),php,mysql,xml,Php,Mysql,Xml,我正在学习PHP,或者试图通过搞乱这个小项目来学习PHP 我每周都会收到一份需要放入mysql数据库的XML,下面是一个小样本,它看起来是什么样子(通常每个报价文件有35个孩子) 10073482 随机品牌 Loerm ipsum…100-3000个字符 5191181 29.99 10073482 随机品牌 Loerm ipsum…100-3000个字符 5191181 大的 29.99 我想理想情况下我想: 导入XML并确保其所有Web安全 让它成为UTF-8 去除所有符号,例如 查找

我正在学习PHP,或者试图通过搞乱这个小项目来学习PHP

我每周都会收到一份需要放入mysql数据库的XML,下面是一个小样本,它看起来是什么样子(通常每个报价文件有35个孩子)


10073482
随机品牌
Loerm ipsum…100-3000个字符
5191181
29.99
10073482
随机品牌
Loerm ipsum…100-3000个字符
5191181
大的
29.99
我想理想情况下我想:

  • 导入XML并确保其所有Web安全
  • 让它成为UTF-8
  • 去除所有符号,例如
  • 查找每个产品使用的所有字段
  • 用这些信息做一张桌子
  • 强制将大量XML放入表中
导入后,我应该有48000个项目,但玩不同的编码,如urlencode,有时我得到26000,另一次52000

以下是我目前得到的:(温柔一点)

children()->children()作为$child){
$currentAttrib=$child->getName();
//创建查询以创建mysql表
$tableCreateQuery.=“`currentAttrib`TEXT'”;
}
$tableCreateQuery=rtrim($tableCreateQuery,“,”);
$tableCreateQuery.=”)字符集utf8”;
//创建mysql表
mysql\u查询($tableCreateQuery);
//循环向新的mysql表添加XML
$pCount=0;
foreach($xml->children()作为$child){
$pCount++;
$theColumnsArr=array();
$theColumnsStr=“”;
$theDataArr=array();
$theDataStr=“”;
$i=0;
foreach($child->children()作为$attrib){
$attrName=$attrib->getName();
$theColumnsArr[$i]=$attrName;
$theDataArr[$i]=urlencode(utf8_encode($attrib));
$i++;
}
$k=0;
foreach($columnsar作为$value){
$colname=$theColumnsArr[$k];
$coldata=$theDataArr[$k];
$theColumnsStr.=“`colname`,”;
$theDataStr.=“$coldata',”;
$k++;
}
$thecolumnssstr=rtrim($thecolumnssstr,“,”);
$theDataStr=rtrim($theDataStr,“,”);
$theRow=“插入$name($theColumnsStr)值($theDataStr)”;
mysql_query($theRow)或die(mysql_error());
}
echo$pCount。“添加到数据库的产品”;
}否则{
退出(“打开$filename失败”);
}
mysql_close($con2);
?>

如果要将非utf8数据转换为utf8数据,
$utf8\u data=utf8\u encode($data)
应该这样做。我假设您已经尝试更改
$theDataArr[$I]=urlencode(utf8_encode($attrib))
$theDataArr[$i]=utf8\u编码($attrib)?是的,我刚刚使用了
utf8\u encode
,但它似乎仍然无法导入很多产品,大多数时候它会返回26000个ish产品。我确实使用了
mysql\u查询(“将XML本地填充“$filename”加载到由“;”标识的表$name行中”)
之前导入了全部报价,但我无法首先使用它来处理XML。您是否尝试过打印SQL语句,然后直接在SQL server上执行它?通过phpmyadmin或其他途径?例如,
echo$theRow
而不是
mysql\u query($theRow)或die(mysql\u error())只是为了让你的查询都正确吗?是的,查询看起来不错,我认为这是一种查询的数据部分存在无效字符的情况,我尝试了
htmlentities
,甚至
urlencode
,结果都是一样的。
<?xml version="1.0" encoding="iso-8859-1"?>
<Offers>
    <Offer>
        <ProductName>10073482</ProductName>
        <Manufacturer>Random Brand</Manufacturer>
        <Description>Loerm ipsum....100-3000characters</Description>
        <ModelNumber>5191181</ModelNumber>
        <Price>29.99</Price>
    </Offer>
    <Offer>
        <ProductName>10073482</ProductName>
        <Manufacturer>Random Brand</Manufacturer>
        <Description>Loerm ipsum....100-3000characters</Description>
        <ModelNumber>5191181</ModelNumber>
        <Size>Large</Size>
        <Price>29.99</Price>
    </Offer>
</Offers>
<?php
    ini_set('display_errors','On');
    ini_set('max_execution_time', 300);

    // Establish connection to database
    $con2 = mysql_connect("localhost","root","root");
    if (!$con2)  {  
        die('Could not connect: ' . mysql_error());  
    }
    $selectdb = mysql_select_db("f1", $con2);
    if (!$selectdb)  { 
        die('Database not used: ; ' . mysql_error());  
    }

    // Vars
    $name = $_GET['name'];
    $filename = $name . ".xml";
    $tableCreateQuery = "CREATE TABLE $name ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,";

    // Load XML
    if (file_exists($filename)) {
        $xml = simplexml_load_file($filename);

        foreach ($xml->children()->children() as $child){
            $currentAttrib = $child->getName();
            // Create query to create mysql table
            $tableCreateQuery .= " `$currentAttrib` TEXT,";
        }
        $tableCreateQuery = rtrim($tableCreateQuery, ",");
        $tableCreateQuery .= ") CHARACTER SET utf8";
        // Create mysql table
        mysql_query($tableCreateQuery);

        // Loop through adding XML to new mysql table
        $pCount = 0;
        foreach ($xml->children() as $child){
            $pCount++;

            $theColumnsArr = array();
            $theColumnsStr = "";

            $theDataArr = array();
            $theDataStr = "";

            $i = 0;
            foreach ($child->children() as $attrib){
                $attrName = $attrib->getName();

                $theColumnsArr[$i] = $attrName;
                $theDataArr[$i] = urlencode(utf8_encode($attrib));

                $i++;
            }

            $k = 0;
            foreach ($theColumnsArr as $value) {
                $colname = $theColumnsArr[$k];
                $coldata = $theDataArr[$k];

                $theColumnsStr .= "`$colname`,";
                $theDataStr .= "'$coldata',";

                $k++;
            }

            $theColumnsStr = rtrim($theColumnsStr, ",");
            $theDataStr = rtrim($theDataStr, ",");

            $theRow = "INSERT INTO $name ($theColumnsStr) VALUES ($theDataStr)";

            mysql_query($theRow) or die(mysql_error());

        }
        echo $pCount . " products added to database";

    } else {
        exit("Failed to open $filename");
    }

    mysql_close($con2);
?>