XML mit MySQL

huecky

Grünschnabel
Hallo,
also hier auch nocheinmal den tread wie im MYSQL Forum, weil ich nicht nicht ganz klar wo es hingehört, sry team ;-)
kann mir jemand helfen und mir sagen wie ich in einer XML Datei ein Feld aus einer MySQL-Datenbank einlesen kann?

also z.b. ich habe die Datenbank TEST1 mit den Feldern USERN und dazu die Spalten USERNAME und PASSWD

Nun möchte ich das z.b. in diese XML Datei mit einbinden:

<authentication>
<!-- Sources log in with username 'source' -->
<source-password>hackme</source-password>
<!-- Relays log in username 'relay' -->
<relay-password>hackme</relay-password>

<!-- Admin logs in with the username given below -->
<admin-user>admin</admin-user>
<admin-password>hackme</admin-password>
</authentication>


Kann mir jemand helfen, wie die Syntax aussehen müsste bzw ob überhaupt möglich?

Danke Chrissi
 

Andreas Gaisbauer

Erfahrenes Mitglied
Mit XML alleine wird das nicht möglich sein. Du brauchst schon eine Sprache mit der du die DB abfrägst - ob das PHP oder zB Perl ist, ist dann relativ egal...Wenn du das so willst, sag nochmal bescheid - das ist nicht schwer. Theoretisch kannst du das XML auch gleich in der Query zusammenbauen - was aber nicht schön ist ;)

Code:
SELECT
concat('<authentication><source-password>',
  concat(spwd,
    concat('</source-password><relay-password>',
      concat(rpwd,
        concat('</relay-password><admin-user>',
          concat(auser,
            concat('</admin-user><admin-password>',
              concat(apwd,'</admin-password></authentication>')))))))) 
FROM `table1` LIMIT 1

Wenn du das auf der shell absetzt solltest du alle Zeilenumbrüche aber rausmachen...

Wie gesagt - mit einer Skriptsprache geht das schöner ;)

ciao
 

Andreas Gaisbauer

Erfahrenes Mitglied
Weil ich grad dut drauf bin ;) Hier der Code in PHP

Code:
<?php
$db = "deine_db";
$connection = mysql_connect(DEINHOST, "username", "password");
$db = mysql_select_db($db);
$query = "SELECT * FROM DEINETABELLE LIMIT 1";
$result = mysql_query($query, $connection);
$num = mysql_num_rows($result);

if($num != 0){
  $file = fopen("dasFile.xml", "w");
  $xml ="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n";
  $xml .="<authentication>\r\n";
  while($row = mysql_fetch_array($result)){
    $xml .="\t<source-password>".$row["source-password"]."</source-password>\r\n";
    $xml .="\t<relay-password>".$row["relay-password"]."</relay-password>\r\n";
    $xml .="\t<admin-user>".$row["admin-user"]."</admin-user>\r\n";
    $xml .="\t<admin-password>".$row["admin-password"]."</admin-password>\r\n";
  } 
  $xml .="</authentication>";
  fwrite($file, $xml);
  fclose($file);
  
  echo "Fertig";
}else{
 echo "Nichts gefunden";
} 
?>
ciao
 

huecky

Grünschnabel
Ah, super ....
Super Danke Andreas... das hilft mir schon mal weiter...
hmmm php oder perl gute frage, hmmm ok vielleicht erkläre ich mal was ich als ganzen wollte und nicht nur den code block, vielleicht kannst du / ihr mir noch einmal einen rat geben:

Ich habe vor ein Webradio per Icecast zu realisieren. Als solches ja nicht schwer, solange man nicht z.b. das Passwort laufend ändern möchte. Realisiert wird es hier ja in der icecast.xml, wie ich oben schon bruchstücke draus gepostet habe:

Code:
<icecast>
    <limits>
        <clients>100</clients>
        <sources>2</sources>
        <threadpool>5</threadpool>
        <queue-size>102400</queue-size>
        <client-timeout>30</client-timeout>
        <header-timeout>15</header-timeout>
        <source-timeout>10</source-timeout>
    </limits>

    <authentication>
        <!-- Sources log in with username 'source' -->
        <source-password>hackme</source-password>
        <!-- Relays log in username 'relay' -->
        <relay-password>hackme</relay-password>

        <!-- Admin logs in with the username given below -->
        <admin-user>admin</admin-user>
        <admin-password>hackme</admin-password>
    </authentication>

    <!-- Uncomment this if you want directory listings -->
    <!--
    <directory>
        <yp-url-timeout>15</yp-url-timeout>
        <yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url>
    </directory>
    <directory>
        <yp-url-timeout>15</yp-url-timeout>
        <yp-url>http://www.oddsock.org/cgi-bin/yp-cgi</yp-url>
    </directory>
     -->

    <hostname>Mein.Server.de</hostname>

    <!-- You can use these two if you only want a single listener -->
    <!--<port>8000</port> -->
    <!--<bind-address>127.0.0.1</bind-address>-->

    <!-- You may have multiple <listener> elements -->
    <listen-socket>
        <port>8000</port>
        <bind-address>192.168.6.4</bind-address>
    </listen-socket>
    <!--
    <listen-socket>
        <port>8001</port>
    </listen-socket>
    -->

    <!--<master-server>127.0.0.1</master-server>-->
    <!--<master-server-port>8001</master-server-port>-->
    <!--<master-update-interval>120</master-update-interval>-->
    <!--<master-password>hackme</master-password>-->
    <!--
    <relay>
        <server>127.0.0.1</server>
        <port>8001</port>
        <mount>/example.ogg</mount>
        <local-mount>/different.ogg</local-mount>

        <relay-shoutcast-metadata>0</relay-shoutcast-metadata>
    </relay>
    -->

    <!-- Only define a <mount> section if you want to use advanced options,
         like alternative usernames or passwords
    <mount>
        <mount-name>/example-complex.ogg</mount-name>

        <username>othersource</username>
        <password>hackmemore</password>

        <max-listeners>1</max-listeners>
        <dump-file>/tmp/dump-example1.ogg</dump-file>
        <fallback-mount>/example2.ogg</fallback-mount>
    </mount>
    -->

    <fileserve>1</fileserve>

    <paths>
		<!-- basedir is only used if chroot is enabled -->
        <basedir>/usr/share/icecast</basedir>

        <!-- Note that if <chroot> is turned on below, these paths must both
             be relative to the new root, not the original root -->
        <logdir>/var/log/icecast</logdir>
        <webroot>/usr/share/icecast/web</webroot>
        <adminroot>/usr/share/icecast/admin</adminroot>
        <!-- <pidfile>/usr/share/icecast/icecast.pid</pidfile> -->

        <!-- Aliases: treat requests for 'source' path as being for 'dest' path
             May be made specific to a port or bound address using the "port"
             and "bind-address" attributes.
          -->
        <!--
        <alias source="/foo" dest="/bar"/>
          -->
    </paths>

    <logging>
        <accesslog>access.log</accesslog>
        <errorlog>error.log</errorlog>
      	<loglevel>4</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->
    </logging>

    <security>
        <chroot>0</chroot>
        
        <changeowner>
            <user>newuser</user>
            <group>newgroup</group>
        </changeowner>
        
    </security>
</icecast>

wie ihr seht wird das SOURCE Password, das ist das DJ Passwort, hier eingetragen, sprich es wäre immer gleich.
Um einen Wechsel DJ betrieb zu machen, ist das natürlich schlecht, sprich jede Sendung sollte sein eingenes Passwort erhalten. Wie das zu realisieren ist , habe ich mir theoratisch zwei unterschiedliche Wege ausgedacht. Bei icecast weiss ich das der nur beim starten die XML datei einliest, sprich einfach das Passwort ändern reicht nicht, weil er dieses in Cache behält. Ob es ein RELOAD CONFIG gibt, habe ich noch nicht rausgefunden, aber es geht ja sonst ein restart per init.d script.

Ähnlich wie bei anderen Radios sollten die DJ´s ihre sendung per Auswahlboxen der Uhrzeit und des Datumes ( immer max 14 Tage im Voraus ), sowie Freifelder für Thema der sendung eintragen. Diese ganzen angaben sollen in einer Datenbank gespeichert werden und dem DJ ein automatisch kreiertes 6 stelliges Passwort angezeigt werden, welches einmalig ist, in der Datenbank abgelegt wird und nur für eine sendung gilt das ganze sollte per php erfolgen.

Wo wir wieder bei dem Passwort wären.
Dazu muss ein script geschrieben werden selches ein passwort abfragt, sprich sich eine Variable eines Datenbankfeldes in die XML liest. Woher soll das script nun wissen wann welches passwort gültig ist, weil es ja bestimmt mehrere Passwörter in der Datenbank, durch mehrere eingetragenen Sendungen, liegen.
Ich kann mir vorstellen, das durch eine Bedingungsabfrage in dem Bashscript, also z.b. ist $SENDEZEIT == SYSTIME dann lese aus dieser zeile $PASS in schreibe es in der variable $PASS in die XML. Oder die zweite möglichkeit ist, das es in der Datenbank ein zweites fald gibt z.b. $CURRENTPASS welches ein bashscript dann da einträgt, welches es vorher ebenfals durch eine abfrage ermittelt hat, also wieder vergleich der systemzeit. Eigentlich ist die letzte lösung schwachsinnig, weil zwei passwort felder dann wären, das müsste auch anders gehen, nur wie weiss ich noch nicht . ( try and error ). Zuguterletzt müssten die scripte dann den Server ( bzw den Daemon) entweder neustarten, rebooten oder wie sonst auch imma dazu veranlassen, das er die XML, mit dem neuen Passwort, neu einliest.
Wie gesagt das ist hier alles noch theoretisch gedacht...

Hmmm also ok Andreas wie du siehst einen Kopf habe ich mir schon gemacht, nur sieht es halt dann in der umsetzung doch ein bissl Komplizierter aus....

Realisiert wird das ganze auf einem Gentoo Linux Server.

Ich wäre für Tips und/oder Hilfe , diemal aus den jetzt genaueren Infos für euch sehr dankbar

Gruss Chrissi
 
Zuletzt bearbeitet:

Andreas Gaisbauer

Erfahrenes Mitglied
Hallo,

grundsätzlich denke ich müsste es so schon klappen wie du dir das gedacht hast. Wenn die DB in etwa so aussieht:

Code:
Sendung     Passwort    Start           Ende
   1	     123456     20041010120000  20041010140000
   2	     234561     20041110120000  20041110150000
   3	     345612     20041210120000  20041210170000
   4	     456123     20041310090000  20041310140000

dann kannst du in dem SQL Statement einen Vergleich machen - der Umweg über die Bash entfällt dann. Start und Ende haben den Typ Timestamp und das Format YYYY-MM-DD-HH-MM-SS

Code:
SELECT Passwort    
FROM tabelle
WHERE now( )
BETWEEN START
AND END

diese Stamement besorgt dir das Passwort für den Zeitraum zwischen Start + Ende verglichen mit der aktuellen Zeit. Man könnte noch einen Parameter einbauen, um eine gewisse Tolleranz zu erreichen (zb. 30 minuten vor Sendebeginn kann er sich einloggen),,,

ok... der rest wäre dann so wie im ersten Posting... Bei weiteren Fragen, einfach fragen ;)

ciao
 

Neue Beiträge