2016-10-05 1 views
1

이것은 아래의 XML 파일과 PHP 코드입니다. 나는 firstname으로 학생을 검색 할 입력 유형을 넣었다. 그러면 특정 학생에 대한 정보가 나타나고 다른 버튼 업데이트가 나타납니다.PHP 폼을 통해 my xml 파일을 수정하십시오.

문제는 이후의 정보를 수정하고 싶다는 것입니다. 특정 학생의 정보를 수정할 수 있도록 태그 이름으로 요소를 가져올 수 있습니까?

<students> 
    <student> 
    <firstname>John</firstname> 
    <lasttname>Snow</lasttname> 
    <student_id>160600</student_id> 
    <gender>male</gender> 
    <dob>23-06-95</dob> 
    <email>[email protected]</email> 
    <mobilenumber>57675060</mobilenumber> 
    <address>albatros, portlouis</address> 
    <cohort>BSE15PT</cohort> 
    <programme>Software Engineering</programme> 
    <mode>PT</mode> 
    </student> 
    <student> 
    <firstname>Jey</firstname> 
    <lastname>Lacroix</lastname> 
    <student_id>150501</student_id> 
    <gender>M</gender> 
    <dob>1990-02-22</dob> 
    <email>[email protected]</email> 
    <mobilenumber>57553536</mobilenumber> 
    <address>Curepipe</address> 
    <cohort>BSE15AFT</cohort> 
    <programme>software engineering</programme> 
    <mode>FT</mode> 
    </student> 
</students> 
<?php 
    if(isset($_POST['search'])) 
{ 
    $xml=simplexml_load_file("studentInstance.xml") or die("Error: Cannot Create Object"); 

    //query the document 
    $name = $_POST['studentname']; 

    //$xml = simplexml_load_string($xml); 
    $query = $xml->xpath("/students/student[firstname = '$name']"); 
    $array=$query; 
    //echo "<pre>"; 
    //rint_r($array); 
    //echo "</pre>"; 

    $count=0; 
    $size=count($array); 
    //echo $count; 
    echo "<center>"; 
    while($count!=count($array)){ 
    foreach ($array[$count]->children() as $child) {//stores values in child 
     $getElementTag=$child->getName();//get tag so nom 
     echo '<label>'.$getElementTag.'</label>'." "; 
     echo '<input type="text" value= " '.$child.' " size="30"></intput>'; 
     echo "<br>"; 
     echo "<br>"; 
    } 
     $count++; 
    } 

    echo '<input type="submit" name="modify" value="Update Record">'.'<br>'; 



echo "***************************"; 
echo "</center>"; 
    } 

?> 
<!DOCTYPE html> 
<html> 
    <head> 
     <title>Searching</title> 

    </head> 
    <body> 
<center> 
    <form method="POST" action="searchtest.php"> 
     <label>Enter Student Name</label> 
     <input type="text" name="studentname" pattern="[A-Z][a-z]+" title="Must start with capital letters!" required><br> 
     <br> 
     <input type="submit" name="search" value="search"> 
     </form> 
    </center> 


    </body> 
</html> 

답변

2

형태로 값이 XSLT 스크립트에 전달되는 동적 XSLT (XML 문서를 수정하는 데 사용되는 변환 언어)를 고려한다. 그러나, 몇 가지 항목은 현재 스크립트에서 변경해야합니다

  1. 당신은 $_POST 배열을 시작하고 서버 측에 값을 보낼 <form> 태그가 필요합니다. 아래에 액션을 추가하십시오.
  2. <input>에 이미 가지고있는 고유 한 이름을 $ getElementTag으로 지정해야합니다. 서버 쪽 $_POST 값을 새 니타 이징하는 것이 좋습니다.
  3. 사용자가이 값을 변경하는 경우 이전 첫 번째 이름을 유지하려면 숨겨진 입력 필드가 필요합니다. 이 필드는 업데이트 할 노드 <student>을 적절하게 선택하기 위해 XSLT에서 사용되므로 중요합니다. 스크립트 아래

PHP 스크립트

만이 if (isset(...) 조건문이 포함되어 있습니다. 전체 스크립트에 통합하고 에코가 <html><head> 위에 나타나지 않는지 확인하십시오. 또한 포함 된 XSLT 문자열이 포함됩니다. .ini 파일에서 XSLTProcessor 확장자 (php_xsl.dll 또는 php_xsl.so)를 사용하도록 설정해야합니다.

<?php 

$xml=simplexml_load_file($cd."/FormInput.xml") or die("Error: Cannot Create Object"); 

if (isset($_POST['modify'])) {  

    $oldfirstname=($_POST['oldfirstname']);  
    $firstname=($_POST['firstname']); 
    $lastname=($_POST['lastname']); 
    $student_id=($_POST['student_id']); 
    $gender=($_POST['gender']); 
    $dob=($_POST['dob']); 
    $email=($_POST['email']); 
    $mobilenumber=($_POST['mobilenumber']); 
    $address=($_POST['address']); 
    $cohort=($_POST['cohort']); 
    $programme=($_POST['programme']); 
    $mode=($_POST['mode']); 

    $xslstr = '<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
       <xsl:output version="1.0" encoding="UTF-8" indent="yes" /> 
       <xsl:strip-space elements="*"/> 

        <xsl:template match="@*|node()"> 
         <xsl:copy> 
         <xsl:apply-templates select="@*|node()"/> 
         </xsl:copy> 
        </xsl:template> 

        <xsl:template match="student[firstname=\''.$oldfirstname.'\']"> 
         <xsl:copy> 
          <firstname>'.$firstname.'</firstname> 
          <lasttname>'.$lastname.'</lasttname> 
          <student_id>'.$student_id.'</student_id> 
          <gender>'.$gender.'</gender> 
          <dob>'.$dob.'</dob> 
          <email>'.$email.'</email> 
          <mobilenumber>'.$mobilenumber.'</mobilenumber> 
          <address>'.$address.'</address> 
          <cohort>'.$cohort.'</cohort> 
          <programme>'.$programme.'</programme> 
          <mode>'.$mode.'</mode> 
         </xsl:copy> 
        </xsl:template> 

       </xsl:transform>'; 

    $xsl = new DOMDocument; 
    $xsl->loadXML($xslstr); 

    // Configure the transformer 
    $proc = new XSLTProcessor; 
    $proc->importStyleSheet($xsl); 

    // Transform XML source 
    $newXml = $proc->transformToXML($xml); 

    // Save into new file 
    file_put_contents($cd."/FormInput_php.xml", $newXml); 
} 

if(isset($_POST['search'])) { 
    //query the document 
    $name = $_POST['studentname']; 

    $query = $xml->xpath("/students/student[firstname = '$name']"); 
    $array=$query; 

    $count=0; 
    $size=count($array); 

    echo "<center>"; 
    echo '<form id="contactform" name="contactform" method="post">';  
    while($count!=count($array)){ 
     foreach ($array[$count]->children() as $child) { 
      $getElementTag=$child->getName(); 
      echo '<label>'.$getElementTag.'</label>'." "; 
      echo '<input type="text" name="'. $getElementTag .'" value= "'.$child.'" size="30"></intput>'; 
      echo "<br>"; 
      echo "<br>"; 
     } 
     $count++; 
    } 
    echo '<input type="hidden" name="oldfirstname" value="'.$name.'"></input>'; 
    echo '<input type="submit" name="modify" value="Update Record">'.'<br>'; 


echo "</form>"; 
echo "***************************"; 
echo "</center>"; 
} 

?> 

HTML 입력

HTML Form Input

XML 출력

를 (새 파일은 제스 StackOverflow의 이전 존 스노을 대체하는 방법을 참조 기존 덮어 쓰지 않습니다)
<?xml version="1.0" encoding="UTF-8"?> 
<students> 
    <student> 
    <firstname>Jess</firstname> 
    <lasttname>Stackoverflow</lasttname> 
    <student_id>999999</student_id> 
    <gender>female</gender> 
    <dob>10-05-16</dob> 
    <email>[email protected]</email> 
    <mobilenumber>7777777</mobilenumber> 
    <address>Example, Place</address> 
    <cohort>HGJD13D</cohort> 
    <programme>Web development</programme> 
    <mode>FT</mode> 
    </student> 
    <student> 
    <firstname>Jey</firstname> 
    <lastname>Lacroix</lastname> 
    <student_id>150501</student_id> 
    <gender>M</gender> 
    <dob>1990-02-22</dob> 
    <email>[email protected]</email> 
    <mobilenumber>57553536</mobilenumber> 
    <address>Curepipe</address> 
    <cohort>BSE15AFT</cohort> 
    <programme>software engineering</programme> 
    <mode>FT</mode> 
    </student> 
</students> 
관련 문제