2014-10-18 107 views
1

当试图将用户输入数据从html发布到php并保存到xml文件时出现错误。它给了我这个错误可捕获的致命错误:传递给DOMNode :: appendChild()的参数1必须是DOMNode的一个实例,null给出。下面是代码dom不能使用变量将数据存储在xml中

register.htm register.php的

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<title>test</title> 
</head> 
<body> 
<form id="regform" method="post" action="register.php"> 
<fieldset id="person"> 
<legend>Your details:</legend> 
<p><label for="fname">First Name:</label><input type="text" name="fname"/></p> 
<p><label for="lname">Last Name:</label><input type="text" name="lname"/></p> 
<p><label for="password">Password:</label><input type="password" name="password"/></p> 
<p><label for="cpassword">Confirm Password:</label><input type="password" name="cpassword"/></p>    
<p><label for="email">Email:</label><input type="email" id="email" name="email"/></p> 
<p><label for="phone">Phone:</label><input type="text" name="phone"/></p> 
<input type="submit" value="Register"/> 
</fieldset> 
</form> 
</body> 
</html> 

相关部分(整个代码过长)

$fname = @trim($_POST["fname"]); 
$lname = @trim($_POST["lname"]); 
$password = @trim($_POST["password"]); 
$cpassword = @trim($_POST["cpassword"]); 
$phone = @trim($_POST["phone"]); 
$email = @trim($_POST["email"]); 
if(file_exists('../../customer.xml')) 
{ 
    $xml2 = file_get_contents('../../data/customer.xml'); 
} 

if(!file_exists('../../customer.xml')) 
     { 
      $dir = "../../data"; 
      $f = fopen("$dir/customer.xml", "w"); 
      $doc = new DOMDocument('1.0'); 
      $doc->formatOutput = true; 
      $root = $doc->createElement('customer'); 
      $doc->appendChild($root); 
      $user = $doc->createElement('user'); 
      $root->appendChild($user); 
      $fname = $doc->createElement('fname'); 
      @override - if I change this to 'brian' then it works, doesnt work with $variable 
      $fnameValue = $doc->createTextNode($fname); 
      $fname->appendChild($fnameValue); 
      $user->appendChild($fname); 
      $lname = $doc->createElement('lname'); 
      $lnameValue = $doc->createTextNode($lname); 
      $lname->appendChild($lnameValue); 
      $user->appendChild($lname); 
      echo $doc->save('../../data/customer.xml'); 
      //$doc->load('customer.xml'); 
      echo ' Registration Successful!'; 
     } 

回答

1

就像错误提示,appendChild需要的DOMNode。只需创建该元素,然后使用用户输入中的第二个参数。例如:

$fname = @trim($_POST["fname"]); 
$lname = @trim($_POST["lname"]); 
$password = @trim($_POST["password"]); 
$cpassword = @trim($_POST["cpassword"]); 
$phone = @trim($_POST["phone"]); 
$email = @trim($_POST["email"]); 

if(file_exists('../../customer.xml')) { 
    $xml2 = file_get_contents('../../data/customer.xml'); 
} 

if(!file_exists('../../customer.xml')) { 
    $dir = "../../data"; 
    $f = fopen("$dir/customer.xml", "w"); 
    $doc = new DOMDocument('1.0'); 
    $doc->formatOutput = true; 

    $root = $doc->createElement('customer'); 
    $doc->appendChild($root); 

    $user = $doc->createElement('user'); 
    $root->appendChild($user); 

    $fname_node = $doc->createElement('fname', $fname); 
    $user->appendChild($fname_node); 

    $lname_node = $doc->createElement('lname', $lname); 
    $user->appendChild($lname_node); 

    echo $doc->save('../../data/customer.xml'); 
    //$doc->load('customer.xml'); 
    echo ' Registration Successful!'; 
} 
1

您正在重新使用$fname变量。这就是你得到错误的原因。这是一个简单的印刷错误。你可以做的一件事是在输入变量前加上input,例如, $input_fname所以很明显,你从那里获得它们。或者甚至创建一个类似$input = new stdClass;的stdclass,然后将$_POST变量赋值给它:$input->fname = @trim($_POST["fname"]); - 这样就可以清楚它代表什么,也可以更容易地传递输入。

实施例:

$input = new stdClass; 

$input->fname  = @trim($_POST["fname"]); 
$input->lname  = @trim($_POST["lname"]); 
$input->password = @trim($_POST["password"]); 
$input->cpassword = @trim($_POST["cpassword"]); 
$input->phone  = @trim($_POST["phone"]); 
$input->email  = @trim($_POST["email"]); 

$doc = new DOMDocument('1.0'); 
$doc->formatOutput = true; 

$root = $doc->createElement('customer'); 
$root = $doc->appendChild($root); 
foreach ($input as $key => $value) { 
    $element = $doc->createElement($key, $value); 
    $root->appendChild($element); 
} 

$doc->save('php://output'); 

示例性输出:

<?xml version="1.0"?> 
<customer> 
    <fname>Waltraud</fname> 
    <lname>Van H&#xC3;&#xB6;mpenstetten</lname> 
    <password></password> 
    <cpassword></cpassword> 
    <phone></phone> 
    <email></email> 
</customer> 

在线演示:https://eval.in/private/29c08d9fafec22