2016-05-15 36 views
0

我讀取並顯示了XML的內容,並且一切正常。比我把XML中的數據放到數據庫中。問題是除了元素'bericht'之外的所有行都是正確的。 'bericht'的文本與行中的其他文本不再匹配。換句話說,例如第5行的'bericht'在第9行寫入的數據庫中,第9行的'bericht'在第17行或任何地方。其他元素仍然是他們應該在的地方。 XML使用UTF-8編碼,不含BOM。在'bericht'的一些文本中有幾個wordwraps,我想還有一些其他的字符會搞亂mysql中的數據?將XML導入到Mysql錯誤行中的一個元素

有了這個代碼,我讀取XML到表:

<form action="insert.php" method="post" /> 
    <table id="Wagen"> 
     <thead> 
      <tr>   
      <th>Typ</th> 
      <th>Kennzeichen</th> 
      <th>Bericht</th> 
      <th>Fahrer</th> 
      </tr> 
     </thead> 

     <tbody> 

    <?php 
     $url = ('./cars.xml'); 
     $xml = simplexml_load_file(urlencode($url), null, true); 


     foreach ($xml->car as $cars) :?> 
    <tr>   
      <td><input type="hidden" name="name[]" value="<?php echo $cars->typ; ?>"><?php echo $cars->typ; ?></td> 
      <td><input type="hidden" name="kfz-nr[]" value="<?php echo $cars->plate; ?>"><?php echo $cars->plate; ?></td> 
      <td><input type="hidden" name="bericht[]" value="<?php echo $cars->message; ?>"><?php echo $cars->message; ?></td> 
      <td><input type="hidden" name="fahrer[]" value="<?php echo $cars->driver; ?>"><?php echo $cars->driver; ?></td> 
    </tr> 

<?php endforeach; ?> 

     </tbody> 
    </table> 
    <input type="submit" name="senden" value="XML speichern" /> 
</form> 

,並有了這個,我把它寫到數據庫:

<?php 

    error_reporting(E_ALL); 
     $MYSQL_HOST = 'localhost'; 
     $MYSQL_USER = 'username'; 
     $MYSQL_PASS = 'password'; 
     $MYSQL_DATA = 'database'; 

     $connid = @mysql_connect($MYSQL_HOST, $MYSQL_USER, $MYSQL_PASS) OR die("Error: ".mysql_error()); 
     mysql_select_db($MYSQL_DATA) OR die("Error: ".mysql_error()); 

     if (isset($_POST['senden'])) 
    { 
    $count = count($_POST['name']); 
     for($i=0;$i<$count;$i++){ 
     $sql = 
       "INSERT INTO myTable 
       (fahrzeug, 
       kennzeichen, 
       bericht, 
       fahrer 
      ) 
       VALUES 
       ('".mysql_real_escape_string(trim($_POST['name']))."', 
       '".mysql_real_escape_string(trim($_POST['kfz-nr']))."', 
       '".mysql_real_escape_string(trim($_POST['bericht']))."', 
       '".mysql_real_escape_string(trim($_POST['fahrer']))."'); 
       mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error()); 
       mysql_query("SET NAMES 'utf8'"); 
    } 
} 
echo "Daten eingetragen"; 
?> 

我也試過已經去掉一些specialChars中像等。 :

<td><input type="hidden" name="bericht[]" value="<?php echo str_replace(["\n", "\r", "\r\n", "\n\n", "\x20-\x7f", "\0", "\t", "\x0B"], '', $cars->message) ; ?>"><?php echo str_replace(["\n", "\r", "\r\n", "\n\n", "\x20-\x7f", "\0", "\t", "\x0B"], '', $cars->message); ?></td> 

但我仍然沒有正確的'bericht'它所屬的行。 :(

這裏是XML的一小部分,我希望這已經足夠了,我不知道它出錯的地方,但是整個XML大概有30MB。寫了錯誤的排。在這種情況下可能會從海科H.了「bericht」將被寫入弗蘭克·P的排

 <?xml version="1.0" encoding="UTF-8"?> 
    <car> 
     <cars> 
     <typ>personal</typ> 
     <plate>4528-58</plate> 
     <message>gestern wurde genau 2mal etwas entnommen.</message> 
     <driver>Heiko H.</driver> 
     </cars> 
     <cars> 
     <typ>personal</typ> 
     <plate>4528-59</plate> 
     <message>Die Fahrt war kurz. einige Sachen wurdne mitgebracht! 

    Inhalt: 
    2 Flaschen Öl 
    Schraubendreher 
    Etui aus Metall mit Schlüssel 

    Tasche aus Polyester, Polyurethan und nickelfreiem Metall.</message> 
      <driver>Frank P.</driver> 
     </cars> 
    </car> 
+0

我們可以看到一個XML文件的片段的可重現的例子嗎? – Parfait

+0

我編輯了我的psot並添加了一點XML。 – speeddrive

回答

0

目前,您的for循環不會索引$_POST變量數組與$i迭代器。每個變量應該被編號索引以便與相同的XML兄弟/數據庫行正確對齊:

... 
$sql = "INSERT INTO myTable (fahrzeug, kennzeichen, bericht, fahrer) 
     VALUES 
     ('".mysql_real_escape_string(trim($_POST['name'][$i]))."', 
     '".mysql_real_escape_string(trim($_POST['kfz-nr'][$i]))."', 
     '".mysql_real_escape_string(trim($_POST['bericht'][$i]))."', 
     '".mysql_real_escape_string(trim($_POST['fahrer'][$i]))."')"; 
... 

此外,請勿使用已宣佈爲deprecated in PHP 5.5且最終爲removed in PHP 7的陳舊mysql_*函數。使用mysqli,PDO或其他當前數據庫API。最後,使用參數化查詢,特別是如果數據來自Web(避免使用引號包裝值)。以下是mysqli,綁定參數化和try/catch異常處理腳本的示例重新工作。還注意到預計空的XML元素與if/else

try { 
    // OPEN DB CONNECTION 
    $connid = new mysqli($MYSQL_HOST, $MYSQL_USER, $MYSQL_PASS, $MYSQL_DATA); 
    $connid->set_charset("utf8"); 
    mysqli_report(MYSQLI_REPORT_ALL); 

    // PREPARE STATEMENT 
    $sql = "INSERT INTO myTable (fahrzeug, kennzeichen, bericht, fahrer) 
      VALUES (?, ?, ?, ?)"; 
    $stmt = $connid->prepare($sql); 

    if (isset($_POST['senden'])){   
     $count = count($_POST['name']); 

     for($i=0; $i<$count; $i++){   

      // CONDITIONALLY HANDLE POST ARRAY ELEMENTS 
      if(!empty($_POST['name'][$i])) { $name = 
        mysqli_real_escape_string($connid, trim($_POST['name'][$i])); } 
       else { $name = null; } 
      if(!empty($_POST['kfz-nr'][$i])) { $kfznr = 
        mysqli_real_escape_string($connid, trim($_POST['kfz-nr'][$i])); } 
       else { $kfznr = null; } 
      if(!empty($_POST['bericht'][$i])) { $bericht = 
        mysqli_real_escape_string($connid, trim($_POST['bericht'][$i])); } 
       else { $bericht = null; } 
      if(!empty($_POST['fahrer'][$i])) { $fahrer = 
        mysqli_real_escape_string($connid, trim($_POST['fahrer'][$i])); } 
       else { $fahrer = null; } 

      // BIND PARAMETERS     
      $stmt->bind_param('ssss', $name, $kfznr, $bericht, $fahrer); 

      // EXECUTE QUERY 
      $stmt->execute(); 
     } 
    } 
} catch(Exception $e) { 
    echo $e->getMessage(); 
    exit; 
} 

# CLOSE DB CONNECTION 
$connid->close(); 
$connid = null; 
+0

謝謝,我試過你的代碼,但現在我總是得到一個_Column'fahrzeug'不能爲null_。如果我完全刪除並嘗試插入其他3個值比我得到_Column'kennzeichen'不能爲null_。等 但沒有單個條目寫入我的數據庫。 – speeddrive

+0

嗯......哪個代碼版本?你的舊mysql或mysqli重新寫入?另外,消息的原因是你在MySQL中將這些字段設置爲* not null *。但是,如果嘗試插入null,似乎索引'[$ i]'不起作用。嘗試在循環中回顯:'echo「。$ _ POST ['name'] [$ i]。」 「。$ _ POST ['kfz-nr'] [$ i]。」「。$ _ POST ['bericht'] [$ i]」。 「。$ _ POST ['fahrer'] [$ i];'..是否返回值? – Parfait

+0

對不起,我遲來了 我只得到第一行的值,最後_Column'fahrzeug'不能爲null_ 在PHPmyAdmin所有列都標有'NULL - NO'但是如果我將它設置爲是,我只能得到NULL而不是任何數據。 – speeddrive