将xml上传到mysql php - 在表中插入无值

时间:2013-08-29 18:58:25

标签: php mysql xml

这是.xml格式:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><!--File Created By Call Logs Backup & Restore v3.21 on 29/08/2013 19:53:23--><?xml-stylesheet type="xsl" href="calls.xsl"?>
<calls count="500">
<call number="+919257035805" duration="0" date="1377691732581" type="3" readable_date="28/08/2013 17:38:52" contact_name="(Unknown)" />
<call number="+919257035805" duration="38" date="1377691747866" type="2" readable_date="28/08/2013 17:39:07" contact_name="(Unknown)" />
</calls>

这是.php脚本

if ($_FILES[xml][size] > 0) { 
$file = $_FILES[xml][tmp_name]; 
$xml = simplexml_load_file($file);
    $count = 0;
foreach ($xml->call as $call) {
$number = mysql_real_escape_string($call->number);
$duration = mysql_real_escape_string($call->duration);
$type = mysql_real_escape_string($call->type);
$readable_date = mysql_real_escape_string($call->readable_date);
$contact_name = mysql_real_escape_string($call->contact_name);


mysql_query("INSERT INTO call_log (number, duration, type, readable_date, contact_name ) VALUES ('$number', '$duration', '$type', '$readable_date', '$contact_name')") or die ("Error in query: $insert. ".mysql_error());

    }

//redirect 
    header('Location: upload_sql.php?success=1?inserts=' . $count . ''); die; 

}

但是这个脚本没有给表添加任何值......完全空白

1 个答案:

答案 0 :(得分:0)

您试图以错误的方式读取属性值。你需要使用数组调用:

$number = mysql_real_escape_string($call['number']);
$duration = mysql_real_escape_string($call['duration']);
$type = mysql_real_escape_string($call['type']);
$readable_date = mysql_real_escape_string($call['readable_date']);
$contact_name = mysql_real_escape_string($call['contact_name']);

使用$call->number时,SimpleXMLElement对象尝试获取<number>中不存在的子节点<call>

另一件事,DB中readable_date的字段类型是什么? 如果是VARCHAR那么没问题,但如果插入mysql期间TIMESTAMPDATETIME将转换为0000-00-00 00:00:00这是错误的,那么您应该首先将其转换为正确的DB日期时间格式:
使用$call['date']函数转换已存在的UNIX时间戳date()比转换$call['readable_date']

更容易
$readable_date = date('Y-m-d H:i:s', (int) $call['date']);

但是,由于我认为datereadable_date与您的日期不一致,您可能需要正确转换它:

$readable_date = convertDate($call['readable_date']);

转换功能:

function convertDate($in)
{
   preg_match('#^(\d{2})/(\d{2})/(\d{4}) (\d{2}):(\d{2}):(\d{2})$#', $in, $matches);
   return $matches[3] . '-' . $matches[2] . '-' . $matches[1] . ' ' . 
        $matches[4] . ':' . $matches[5] . ':' . $matches[6];
}