dom不能使用变量将数据存储在xml中


dom cant use variables to store data in xml

我在尝试将用户输入数据从html发布到php并保存到xml文件时出错。它给了我这个错误可捕获的致命错误:传递给DOMNode::appendChild()的参数1必须是DOMNode的实例,给定null。这是代码

register.htm

<!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>

register.php的相关部分(整个代码太长)

$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!';
        }

正如错误所示,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!';
}

您正在重新使用$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