Announcement

Collapse
No announcement yet.

externe Datenbank

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • externe Datenbank

    Hallo Com

    Ich hab mal ne Frage, die ihr mir vieleicht beantworten könnt.
    Ich habe zwei Portale auf unterschiedlichen Servern zu laufen, die im Groben einige Funktionen gleich anbieten.
    So zum Beispiel haben alle angemeldeten User auf beiden Protalen die Möglichkeit Artikel und Preise einzutragen.

    Nun kann es sein, das der User auf beiden Protalen angemeldet ist und einige Artikel und Preise auf beiden Portalen gleich sein sollen.
    Der User hat aber keine Lust die Daten in beide Portale einzutragen.
    Somit obliegt mir diese Aufgabe (um die User nicht zu verärgern).

    Um jetzt mir ein wenig Arbeit zu ersparen,möchte ich nun beide Tabellen miteinander abgleichen, also die Preise aus der einen Tabelle auslesen und falls in der anderen Tabelle nicht vorhanden, dort eintragen.

    Dieser Vorgang soll auch nur in eine Richtung passieren (also immer nur das Server 1, Server 2 abfragt).

    Leider habe ich keinen Root Zugriff auf beide SQLServer, so das ich mit der Freigabe eines Users o.ä. der externen DB nicht sagen kann das ich Daten abrufen möchte.
    Allerdings liegen mir die Zugangsdaten beider DB's vor, so das ich auf beide einen Connect ausführen kann.

    Meine Frage ist nun, kann ich dies auch anders regeln ??

    Ich hoffe mich verständlich ausgedrückt zu haben und das ihr mir helfen könnt.

  • #2
    Meine Frage ist nun, kann ich dies auch anders regeln ??
    Beide Sites benutzen eine DB
    Christian

    Comment


    • #3
      Originally posted by Christian Marquardt View Post
      Beide Sites benutzen eine DB
      Da jede Seite bereits eine eigene DB benutzt, recht schwierig und selbst dann stellt sich die Frage wie greife ich auf die eine DB von beiden (zumindestens dem einen entfernten) Servern darauf zu.

      Comment


      • #4
        Im SQL-Server den/die anderen als linked server einrichten, dann kann man über diesen Server auch auf die anderen zugreifen.

        bye,
        Helmut

        Comment


        • #5
          Originally posted by hwoess View Post
          Im SQL-Server den/die anderen als linked server einrichten, dann kann man über diesen Server auch auf die anderen zugreifen.

          bye,
          Helmut
          Ich vergass zu erwähnen, das es sich bei den SQL-Servern um MySQL(vieleicht war meine Wortwahl hier etwas verwirrend) handelt, also nicht Windows basiert.

          Comment


          • #6
            Hallo,
            Originally posted by madmix View Post
            ...Allerdings liegen mir die Zugangsdaten beider DB's vor, so das ich auf beide einen Connect ausführen kann.
            wenn du dich von ServerA auf die DBs von ServerA und ServerB connecten kannst, dann sollte es kein Problem sein ein kleines Script zu schreiben, was sich auf beide DBs verbindet und den Abgleich vornimmt.

            Allerdings bezweifle ich, dass der Connect von ServerA auf die DB von ServerB tatsächlich funktioniert. Im Shared Hosting-Bereich ist dies meist - wenn überhaupt - nur über einen SSH-Tunnel möglich.

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Originally posted by Falk Prüfer View Post
              Hallo,


              wenn du dich von ServerA auf die DBs von ServerA und ServerB connecten kannst, dann sollte es kein Problem sein ein kleines Script zu schreiben, was sich auf beide DBs verbindet und den Abgleich vornimmt.

              Allerdings bezweifle ich, dass der Connect von ServerA auf die DB von ServerB tatsächlich funktioniert. Im Shared Hosting-Bereich ist dies meist - wenn überhaupt - nur über einen SSH-Tunnel möglich.

              Gruß Falk
              Da hast du leider recht.
              Der Connect von Server A auf Server B klappt so leider nicht (habs schon probiert).

              Mein zweiter Ansatz war nun auf Server B den Datenabruf zu realisieren und auf Anfrage von Server A diesem die Daten dann zur Verfügung zu stellen.

              Allerdings klappt auch das nicht so ganz....

              Script Server B:

              PHP Code:
              require_once($_SERVER['DOCUMENT_ROOT'] . "/inc/connect.php");
                  
              function 
              getData() {
                  
              $qry "SELECT 
                              id,
                              name,
                              price
                          FROM
                              article
                  "
              ;
                  
              $res mysql_query($qry);
                  
              $result = array();
                  while(
              $row mysql_fetch_array($res)) {
                      
              $result[] = array(
                                  
              "id" => $row["id"],
                                  
              "name" => $row["name"],
                                  
              "price" => $row["price"]
                      );
                  }
                  return 
              $result;

              Script Server A:

              PHP Code:
              include("HOST und String zur Datei auf Server B");

              $result getData();
              foreach(
              $result as $key => $var) {
                  echo 
              $var["id"].", ".$var["name"].", ".$var["price"]."\n";

              Leider gibt die Funktion nur die Daten HTML Codiert zurück was eine weitere Verarbeitung unmöglich macht.

              Die nächste Überlegung war nun die Daten urlencodet abzusetzen, daran experimentiere ich gerade.

              Vieleicht wäe es aber auch von Erfolg gekrönt die Funktion innerhalb einer Klasse zu Verfügung zu stellen und diese extern abzufragen ???

              Comment


              • #8
                Originally posted by madmix View Post
                ...Leider gibt die Funktion nur die Daten HTML Codiert zurück was eine weitere Verarbeitung unmöglich macht.
                Warum? Wenn du die Daten z.B. als XML ausgibst, dann kannst du diese ganz einfach auf dem anderen Server verarbeiten.
                Allerdings solltest du dann Vorkehrungen treffen, damit nicht jeder der die URL kennt deine Daten einfach als XML auslesen kann.

                Gruß Falk
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment


                • #9
                  Man XML, das ich da nich selbst drauf gekommen bin....
                  Danke für den Tritt in den H....

                  Script auf Server B:

                  PHP Code:
                      <?php 
                          header
                  ("Content-type: text/xml");
                          echo 
                  '<'.'?xml version="1.0" encoding="ISO-8859-1"?'.'>';
                      
                  ?>
                      <br />
                      <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
                       
                      <channel>
                          <title>Title meines RSS Feeds</title>
                          <language>de</language> 
                          <link>http://meine.Domain</link>
                          <description>Artikel und Preise</description>
                          <copyright>Copyright <?php date("Y"); ?> bei mich</copyright>
                       
                  <?php 

                      
                  require_once($_SERVER['DOCUMENT_ROOT'] . "/inc/connect.php3");
                      
                  $qry "SELECT 
                                  id,
                                  name,
                                  price
                              FROM
                                  article
                      "
                  ;
                      
                  $res mysql_query($qry);
                      while(
                  $row mysql_fetch_array($res)) {

                  ?>
                      <article>
                          <articleId><?php echo $row["id"]; ?></articleId>
                          <name><?php echo $row["name"]; ?> </name>
                          <price><?php echo $row["price"]; ?></price>
                      </article>
                  <?php
                  }
                  ?>
                   
                  </channel>
                  </rss>
                  Auf der anderen Seite sieht es noch so aus:

                  Code:
                  <link rel="alternate" type="application/rss+xml" title="Titel des RSS Feeds" href="URL zur Datei auf Server B" />
                  Muss jetzt nur noch die Daten abfangen und zerlegen, damit ich die DB auf Server A abgleichen kann.

                  Das Poste ich dann (für alle die es Interessiert, oder das gleiche Problem haben wie ich) wenn ich's hab.

                  Comment


                  • #10
                    So mach ich es nun...

                    PHP Code:
                    function updateTable() {
                        
                    $result file_get_contents("Datei mit dem RSS-Feed"); 
                        
                    // Suche Elternknoten
                        
                    $result explode("<article>",$result);
                        
                    $count count($result);
                        
                    $array = array();
                        for(
                    $i=1;$i<=$count;$i++) {
                            
                    // Filtere alle Zahlen
                            
                    $id explode("</article>",$result[$i]);
                            
                    $id explode("<articleId>",$id[0]);
                            
                    $id explode("</articleId>",$id[1]);
                            
                            
                    $name explode("</article>",$result[$i]);
                            
                    $name explode("<name>",$name[0]);
                            
                    $name explode("</name>",$name[1]);
                            
                            
                    $price explode("</article>",$result[$i]);
                            
                    $price explode("<price>",$price[0]);
                            
                    $price explode("</price>",$price[1]);

                            
                    $array[] = array("articleId" => $id[0],"name" => $name[0],"price" => $price[0]);
                        }

                        
                    $zaehler 0;
                        foreach(
                    $array as $k => $v) {
                            
                    $qry mysql_query("SELECT id FROM article WHERE id = '" $v["articleId"] . "'");
                            
                    $row mysql_fetch_array($qry);

                            
                    // Update
                            
                    if($row["id"] == $v["id"]) {
                                if(
                    $row["name"] != $v["name"] || $row["price"] != $v["price"]) {
                                    
                    $qry mysql_query("UPDATE
                                                            article
                                                        SET
                                                            name = '" 
                    $v["name"] . "',
                                                            price = '" 
                    $v["price"] . "'
                                                        WHERE
                                                            id = '" 
                    $v["articleId"] . "'
                                    "
                    );
                                    
                    $zaehler $zaehler 1;
                                }
                            }
                            
                    // Zusätzliche Einträge
                            
                    if(empty($row["id"])) {
                                
                    $qry mysql_query("INSERT INTO 
                                                            article
                                                            (
                                                                id,
                                                                name,
                                                                price
                                                            )
                                                            VALUES
                                                            (
                                                                '" 
                    $v["articleId"] . "',
                                                                '" 
                    $v["name"] . "',
                                                                '" 
                    $v["price"] . "'
                                                            )
                                "
                    );
                                
                    $zaehler $zaehler 1;
                            }
                        }    
                        
                    // Anzahl geänderter oder neu 
                        // hinzugefügter Datensätze zurückgeben    
                        
                    return $zaehler;
                    }

                    echo 
                    updateTable() . " Datensätze kopiert oder neu Eingetragen!"
                    Leider verfüge ich nicht über PHP 5 sonst wäre es mit simpleXML einfacher gewesen....

                    Ist vieleicht von der Performance etwas umständlich (wg der ganzen explodes) und lässt sich bestimmt noch performanter coden, aber mir reicht das erstmal so.

                    Da ich ja weiß welche Eltern und Kindknoten mein RSS-Feed besitzt, kann ich diese durch die Explodefunktionen bequem auslesen und die Daten dann in ein Array schreiben was in einem weiteren Schritt für diverse Aktionen (hier dem Abgleich oder besser Neuschreiben der Daten in eine Tabelle) genutzt werden kann.

                    Wie gesagt, das ist nicht der Weisheit letzter Schluß, aber wenn man wie ich schnell ne Lösung braucht und die Tabelle nicht 1000 MB groß ist/wird reicht das glaube ich vollkommen.
                    Zuletzt editiert von madmix; 11.11.2010, 17:04.

                    Comment

                    Working...
                    X