Avatar billede fozzyc Nybegynder
23. november 2008 - 14:36 Der er 20 kommentarer

XML fra MySQL via PHP

Hej

Jeg har rodet lidt med et script der gerne skulle kunne hente mine data ud fra en mysql database og omforme det til php. Jeg er ikke selv den store haj til php så jeg har fundet et script og modificeret det, dog kommer der en fejl på bunden af denne side:

http://www.zingarticles.com/xml.php
semikolon var ventet. Der opstod en fejl under behandling af ressourcen 'http://www.zingarticles.com/xml.php'. Linje 13

Mit umiddelbare gæt er at artiklen har et kolon i titlen som måske driller.?!

Her er mit script:

<?
header("Content-type: text/xml");

$host = "localhost";
$user = "user";
$pass = "pass";
$database = "db_name";

$linkID = mysql_connect($host, $user, $pass) or die("Could not connect to host.");
mysql_select_db($database, $linkID) or die("Could not find database.");

$query = "SELECT * FROM tblarticles ORDER BY ttSubmitDate";
$result = mysql_query($query, $linkID) or die("Data not found.");


$xml_output = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";
    $xml_output .= "<entries>\n";
   
for ($x = 0; $x < mysql_num_rows($result) ; $x++){
$row = mysql_fetch_assoc($result);
$xml_output .= "\t<tblarticles>\n";
$xml_output .= "\t\t<varArticleTitle>" . $row['varArticleTitle'] . "</varArticleTitle>\n";
// Escaping illegal charecters
$row['text'] = str_replace("&", "&#38;", $row['text']);
$row['text'] = str_replace("<", "<", $row['text']);
$row['text'] = str_replace(">", "&gt;", $row['text']);
$row['text'] = str_replace("\"", "&quot;", $row['text']);

           
$xml_output .= "\t\t<text>" . $row['text'] . "</text>\n";
    $xml_output .= "\t</tblarticles>\n";
}
$xml_output .= "</entries>";
echo $xml_output;
?>

-------------

Håber nogen kan hjælpe. På forhånd tak.
Avatar billede showsource Seniormester
23. november 2008 - 17:00 #1
Skulle vel ikke være fordi short_open_tag er on?
Avatar billede showsource Seniormester
23. november 2008 - 17:02 #2
Men det var da godt nok en del kode du vil outputte der.
Jeg stoppede browseren inden siden var færdiglæst.
Avatar billede fozzyc Nybegynder
23. november 2008 - 17:11 #3
Det ved jeg ikke, tror du det er det? Hvordan sætter jeg den til off i stedet.
Ja der er rigtig meget :)
Avatar billede olebole Juniormester
23. november 2008 - 17:29 #4
<ole>

Jamen, fortæller fejlmeddelelsen i IE ikke alt?  =)

Der er ikke noget, der hedder '&amp'. Det hedder '&amp;':

    <tblarticles>
        <varArticleTitle>Map Measurers: Customized Map Measurers Electronic &amp  Digital Scales</varArticleTitle>
        <text></text>
    </tblarticles>

/mvh
</bole>
Avatar billede fozzyc Nybegynder
23. november 2008 - 17:37 #5
Jo faktisk, men havde ellers søgt overalt synes jeg uden held, men jeg prøver lige det der.
Avatar billede olebole Juniormester
23. november 2008 - 17:50 #6
Det undrer mig dog, at FF udskriver dokumentet, som det gør. Sådan plejer FF ikke at udskrive XML dokumenter. Hvis jeg åbner en socket mod dokumentet, modtager jeg følgende Content-Type header: 'Content-Type: text/html'.
Avatar billede fozzyc Nybegynder
23. november 2008 - 17:50 #7
Kan man erstatte '&amp' så det bliver skrevet korrekt på siden. Jeg har prøvet med:
$row['text'] = str_replace("&amp", "&amp;", $row['text']);
dog uden held
Avatar billede olebole Juniormester
23. november 2008 - 17:51 #8
Hmmmm ... nu har jeg lige testet igen - og får 'Content-Type: text/xml'. Har du ændret din header fra 'Content-type' til det korrekte 'Content-Type'?  =)
Avatar billede olebole Juniormester
23. november 2008 - 17:53 #9
Nej, det er noget skod. Du bør helt klart skifte det i DB'en. Det nytter ikke at have invalide data liggende i en DB.
Avatar billede olebole Juniormester
23. november 2008 - 17:55 #10
Der bør vel bare stå '&' i databasen. Det kan du skifte ud med '&amp;', inden det ryger ud som XML ... men der er vel ingen steder, du har brug for, der står '&amp'  =)
Avatar billede fozzyc Nybegynder
23. november 2008 - 18:05 #11
Content-type er nu 'Content-Type: text/html'
jeg må prøve at rode videre med det
Avatar billede olebole Juniormester
23. november 2008 - 18:08 #12
Nej, det var, hvad jeg modtog først - og det er forkert. Det skal være 'Content-Type: text/xml' - men læg mærke til, at feltnavne i HTTP-headers er case sensitive (stort 'C' og 'T')  ;o)
Avatar billede fozzyc Nybegynder
23. november 2008 - 18:18 #13
der står header("Content-Type: text/xml");  nu
Avatar billede olebole Juniormester
23. november 2008 - 21:23 #14
Yups - og alt virker nu som forventet i både IE og FF  ;o)

Kan du ikke lave et script, der updater din tabel og udryder de der '&amp'? Og så skal du også nok lige sørge for at rette kilden til de indsættelser  ;o)

Jeg er ikke ekspert i komplekse MySQL-udtryk, så jeg kan ikke give dig en sexy og effektiv løsning. Da der er tale om et opdaterings script, som skal køre én gang, er effektiviteten dog ikke en så væsentlig faktor. Jeg ville selv være nødt til at lave en løsning noget à la:

set_time_limit(180); // Scriptet kan køre i max 3 minutter
$sql = "SELECT `id`, `varArticleTitle` FROM `tblarticles`";
$res = mysql_query() or die ("SQL: ".$sql."<hr>".mysql_error());
while ($row=mysql_fetch_assoc($res)) {
    $sTitle = $row["varArticleTitle"];
    if (strpos($sTitle, "&amp")!==false) {
        $sTitle = preg_replace("/\&amp([^;])/", "&amp;$1", $sTitle);
        $sql = "UPDATE `tblarticles` SET `varArticleTitle`='".$sTitle."' WHERE `id`='".$row["id"]."' LIMIT 1";
        $res = mysql_query() or die ("SQL: ".$sql."<hr>".mysql_error());
    }
}
Avatar billede olebole Juniormester
23. november 2008 - 21:24 #15
Njaahh ... der var vist en overflødig backslash:
    $sTitle = preg_replace("/&amp([^;])/", "&amp;$1", $sTitle);
Avatar billede olebole Juniormester
23. november 2008 - 21:28 #16
- og så skal der naturligvis begge steder stå:
    $res = mysql_query($sql) or die ("SQL: ".$sql."<hr>".mysql_error());
Avatar billede fozzyc Nybegynder
24. november 2008 - 12:37 #17
Hej
Jeg har rettet dit script lidt til, jeg får denne fejl:

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/sejler/public_html/update.php on line 13

Her er scriptet:

<?
$host = "localhost";
$user = "xxxxx";
$pass = "xxxxxx";
$database = "xxxxx";

$linkID = mysql_connect($host, $user, $pass) or die("Could not connect to host.");
mysql_select_db($database, $linkID) or die("Could not find database.");

set_time_limit(180); // Scriptet kan køre i max 3 minutter
$sql = "SELECT `intId`, `varArticleTitle` FROM `tblarticles`";
$res = mysql_query($sql) or die ("SQL: ".$sql."<hr>".mysql_error());
while ($row=mysql_fetch_assoc($res)) {
    $sTitle = $row["varArticleTitle"];
    if (strpos($sTitle, "&amp")!==false) {
        $sTitle = preg_replace("/&amp([^;])/", "&amp;$1", $sTitle);
        $sql = "UPDATE `tblarticles` SET `varArticleTitle`='".$sTitle."' WHERE `intId`='".$row["intId"]."' LIMIT 1";
        $res = mysql_query($sql) or die ("SQL: ".$sql."<hr>".mysql_error());
    }
}
?>
Avatar billede olebole Juniormester
24. november 2008 - 15:49 #18
Det forstår jeg ikke. Så burde du vel få en fejl fra linjen før(?) Jeg har ingen bud  :o|
Avatar billede dkfire Nybegynder
24. november 2008 - 17:41 #19
Den fejl er nu meget nem at spotte.

Du bruger $res to gange, både inde- og udenfor din while-løkke, og det er bestemt ikke særlig smart. 

Denne linje returnere ikke nogen ressource:
$res = mysql_query($sql) or die ("SQL: ".$sql."<hr>".mysql_error());
og derfor vil den brokke sig ved
while ($row=mysql_fetch_assoc($res)) {

Du kunne prøve:
<?php
$host = "localhost";
$user = "xxxxx";
$pass = "xxxxxx";
$database = "xxxxx";

$linkID = mysql_connect($host, $user, $pass) or die("Could not connect to host.");
mysql_select_db($database, $linkID) or die("Could not find database.");

set_time_limit(180); // Scriptet kan køre i max 3 minutter
$sql = "SELECT `intId`, `varArticleTitle` FROM `tblarticles`";
$res = mysql_query($sql) or die ("SQL: ".$sql."<hr>".mysql_error());
while ($row=mysql_fetch_assoc($res)) {
    $sTitle = $row['varArticleTitle'];
    if (strpos($sTitle, "&amp")!==false) {
        $sTitle = preg_replace("/&amp([^;])/", "&amp;$1", $sTitle);
        $sql = "UPDATE `tblarticles` SET `varArticleTitle`='".$sTitle."' WHERE `intId`='".$row["intId"]."' LIMIT 1";
        $res1 = mysql_query($sql) or die ("SQL: ".$sql."<hr>".mysql_error());
    }
}
?>
Avatar billede fozzyc Nybegynder
24. november 2008 - 20:03 #20
Det hjalp på det, mange tak.

Kan man dele point mellem olebole og dkfire?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester