File problem
Posted: Sun Feb 09, 2003 2:35 pm
I've written a little guestbook script with PHP and XML, and everything was fine untill a few days ago... there are many articles now, but sometimes, words are deleted in in the first articles. It is not a problem of writing the file because the XML structure is still good, but the content of the tags change... Stange... i've put locks, but it doesn't change anything...
The Code (the essential part of it):
<?php
class xItem {
var $xDate;
var $xNom;
var $xEmail;
var $xTexte;
}
$arItems = array();
$itemCount = -1;
$uFile = "guestbook.xml";
function startElement($parser, $name, $attrs) {
global $curTag;
$curTag .= "^$name";
}
function endElement($parser, $name) {
global $curTag;
$caret_pos = strrpos($curTag,'^');
$curTag = substr($curTag,0,$caret_pos);
}
function characterData($parser, $data) {
global $curTag, $arItems, $itemCount;
$itemDate = "^MSGS^MSG^DATE";
$itemNom = "^MSGS^MSG^NOM";
$itemEmail = "^MSGS^MSG^EMAIL";
$itemTexte = "^MSGS^MSG^TEXTE";
if ($curTag == $itemDate) {
$itemCount++;
$arItems[$itemCount] = new xItem();
$arItems[$itemCount]->xDate = $data;
}
elseif ($curTag == $itemNom) {
$arItems[$itemCount]->xNom = $data;
}
elseif ($curTag == $itemEmail) {
$arItems[$itemCount]->xEmail = $data;
}
elseif ($curTag == $itemTexte) {
$arItems[$itemCount]->xTexte = $data;
}
}
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($uFile,"r"))) {
die ("could not open XML file to read");
}
flock($fp,1);
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
flock($fp,3);
fclose($fp);
if (!($fp = fopen($uFile,"w"))) {
die ("could not open XML file to write");
}
flock($fp,2);
fwrite($fp,"<msgs>\n");
fwrite($fp,"<msg>\n<date><![CDATA[".date ("d/m/y")."]]></date>\n<texte><![CDATA[");
fwrite($fp,$HTTP_GET_VARS["texte"]);
fwrite($fp,"]]></texte>\n");
if (strlen($HTTP_GET_VARS["nom"]) != 0) {
fwrite($fp,"<nom><![CDATA[");
fwrite($fp,$HTTP_GET_VARS["nom"]);
fwrite($fp,"]]></nom>\n");
}
if (strlen($HTTP_GET_VARS["email"]) != 0) {
fwrite($fp,"<email><![CDATA[");
fwrite($fp,$HTTP_GET_VARS["email"]);
fwrite($fp,"]]></email>\n");
}
fwrite($fp,"</msg>\n");
for ($i=0;$i<count($arItems);$i++) {
$txItem = $arItems[$i];
fwrite($fp,"<msg>\n<date><![CDATA[");
fwrite($fp,$txItem->xDate);
fwrite($fp,"]]></date>\n<texte><![CDATA[");
fwrite($fp,$txItem->xTexte);
fwrite($fp,"]]></texte>\n");
if (strlen($txItem->xNom) != 0) {
fwrite($fp,"<nom><![CDATA[");
fwrite($fp,$txItem->xNom);
fwrite($fp,"]]></nom>\n");
}
if (strlen($txItem->xEmail) != 0) {
fwrite($fp,"<email><![CDATA[");
fwrite($fp,$txItem->xEmail);
fwrite($fp,"]]></email>\n");
}
fwrite($fp,"</msg>\n");
}
fwrite($fp,"</msgs>");
flock($fp,3);
fclose($fp);
?>
The Code (the essential part of it):
<?php
class xItem {
var $xDate;
var $xNom;
var $xEmail;
var $xTexte;
}
$arItems = array();
$itemCount = -1;
$uFile = "guestbook.xml";
function startElement($parser, $name, $attrs) {
global $curTag;
$curTag .= "^$name";
}
function endElement($parser, $name) {
global $curTag;
$caret_pos = strrpos($curTag,'^');
$curTag = substr($curTag,0,$caret_pos);
}
function characterData($parser, $data) {
global $curTag, $arItems, $itemCount;
$itemDate = "^MSGS^MSG^DATE";
$itemNom = "^MSGS^MSG^NOM";
$itemEmail = "^MSGS^MSG^EMAIL";
$itemTexte = "^MSGS^MSG^TEXTE";
if ($curTag == $itemDate) {
$itemCount++;
$arItems[$itemCount] = new xItem();
$arItems[$itemCount]->xDate = $data;
}
elseif ($curTag == $itemNom) {
$arItems[$itemCount]->xNom = $data;
}
elseif ($curTag == $itemEmail) {
$arItems[$itemCount]->xEmail = $data;
}
elseif ($curTag == $itemTexte) {
$arItems[$itemCount]->xTexte = $data;
}
}
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($uFile,"r"))) {
die ("could not open XML file to read");
}
flock($fp,1);
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
flock($fp,3);
fclose($fp);
if (!($fp = fopen($uFile,"w"))) {
die ("could not open XML file to write");
}
flock($fp,2);
fwrite($fp,"<msgs>\n");
fwrite($fp,"<msg>\n<date><![CDATA[".date ("d/m/y")."]]></date>\n<texte><![CDATA[");
fwrite($fp,$HTTP_GET_VARS["texte"]);
fwrite($fp,"]]></texte>\n");
if (strlen($HTTP_GET_VARS["nom"]) != 0) {
fwrite($fp,"<nom><![CDATA[");
fwrite($fp,$HTTP_GET_VARS["nom"]);
fwrite($fp,"]]></nom>\n");
}
if (strlen($HTTP_GET_VARS["email"]) != 0) {
fwrite($fp,"<email><![CDATA[");
fwrite($fp,$HTTP_GET_VARS["email"]);
fwrite($fp,"]]></email>\n");
}
fwrite($fp,"</msg>\n");
for ($i=0;$i<count($arItems);$i++) {
$txItem = $arItems[$i];
fwrite($fp,"<msg>\n<date><![CDATA[");
fwrite($fp,$txItem->xDate);
fwrite($fp,"]]></date>\n<texte><![CDATA[");
fwrite($fp,$txItem->xTexte);
fwrite($fp,"]]></texte>\n");
if (strlen($txItem->xNom) != 0) {
fwrite($fp,"<nom><![CDATA[");
fwrite($fp,$txItem->xNom);
fwrite($fp,"]]></nom>\n");
}
if (strlen($txItem->xEmail) != 0) {
fwrite($fp,"<email><![CDATA[");
fwrite($fp,$txItem->xEmail);
fwrite($fp,"]]></email>\n");
}
fwrite($fp,"</msg>\n");
}
fwrite($fp,"</msgs>");
flock($fp,3);
fclose($fp);
?>