Datei auslesen und Inhalt verarbeiten.

Das var_dump() ist nur ein Hilfsmittel um zu testen, was in Arrays drin steht.

Hier nun eine Funktion, mit der auch Codezeilen wie:

PlayerID=17e16a1c02d714a560bbb8cbxxxxxxxy (Last Login: 2006/05/1)Cool blablaserver;Bla;Blub;BlubbLubb;xxxx;yyyyyy;dddddd

erkennen müsste und eine Rückgabe als Semikolon getrennter String liefern sollte.

PHP:
function getNicks($splitNicks,$source)
{
    $removeFirst = explode($splitNicks, $source);
    return implode(";", array_slice($removeFirst, 1));
}

Zu deinem SQL Problem:

Im Moment läuft dein Script wie folgt ab (Logischer Ablauf!!):

WHILE ( irgendwas ist wahr)
{
... Code auseinander nehmen...
$query = SQL Anweisung;
}
DB::$query ausführen

Jetzt gibt es verschiedene Wege das zu lösen. Du könntest jede SQL Anweisung in ein Array schreiben und nach der While dieses Array durchlaufen und jede SQL Anweisung ausführen oder einfacher, das ausführen des SQL Querys mit in der While schleife aufnehmen. Also

WHILE ( irgendwas ist wahr)
{
... Code auseinander nehmen...
$query = SQL Anweisung;
DB::$query ausführen
}
 
Also deine Version von den ; trennern Funktioniert ;)
Vieln Dank.

Das mit dem Query in der While dachte ich mir wäre Logisch und hatte es Probiert aber da komtm sofort der or Die("Posten hat nicht funktioniert") und da dachte ich es wäre Falsch. Nun sagst du es auch ^^ Aber es geht immer noch nicht. Ich weiß nur nicht warum.
 
Oder muss ich es Unbedingt mit den arrays machen ?

Das umsetzen der Query müsste doch Theoretisch funktionieren oder ?
Habe ich einen Logischen fehler drin ?
 
Von deinem eigentlich mysql_query() sehen wir hier ja nichts.
In der While Schleife wird ja nur das Query gebildet.

Wenn du beim mysql_query() ungefährt sowas haben solltest:

mysql_query($query) or die ("Posten hat nicht funktioniert")

änder das mal ab in

mysql_query($query) or die (mysql_error())

mysql_error() zeigt dir den Fehler an, der MySQL zurückgibt, wenn ein SQL Query falsch ist (mysql Syntax zum beispiel falsch). Dann kann man schauen, ob der SQL Querystring falsch ist oder woanders sich der Fehler versteckt.

oder was auch geht: füge nachdem $query gebildet wurde (in der while schleife) dannach ein echo $query."<br>"; ein. Das liefert dir den Query String aus, den du kopieren und in phpMyAdmin testen kannst.

Es gibt hier wieder soviele wege den Fehler zu suchen, man muss nur wissen wie man debugged ;)

Das mit dem Array kann ich dir erklären, würde aber kaum einen unterschied machen, zu der version mit dem Query ausführen in der while schleife.
 
Ehm ja: der Fehler ist dieser.

Code:
;;You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('','','',,';;')' at line 1


und hier der Gesamte Quellcode.
PHP:
<?php
$startzeit = explode(" ", microtime());
$startzeit = $startzeit[0]+$startzeit[1];

//----------- Beispiel vom Inhalt der Shortlog.ini ---------------------
// PlayerID=17e16a1c02d714a560abb8cbxxxxxxxx (Last Login: 2006/05/1)Cool Paxytestserver;Paxy1;Paxy2

//MySQL-Verbindung herstellen.
mysql_connect('127.0.0.1','root','') or die('Verbindung konnte nicht hergestellt werden.');
//Datenbank auswählen
mysql_select_db("fakelist") or die ("Datenbankfehler");
//Datei Öffnen mit Fopen()
$nicks = fopen('shortlog.ini','r');
// Funktion getPlayerID
function getPlayerID($splitFirst,$splitSecond,$source){
    $removeFirst = explode($splitFirst, $source);
    $removeSecond = explode($splitSecond, $removeFirst[1]);
    return $removeSecond[0];
  }
  $splitFirst = '=';
  $splitSecond = ' ';

//-----------Funktionsende getPlayerID ----------------

//Funktion LastLogin
function getLastLogin($splitdatum,$splitdatumEnde,$source)
{
    $removeFirst = explode($splitdatum, $source);
    $removeSecond = explode($splitdatumEnde, $removeFirst[1]);
    return $removeSecond[0];
}
$splitdatum = ':';
$splitdatumEnde = ')';
//---------Funktionsende getLastLogin--------------------

//Funktion getServer
function getServer($splitServer,$splitServerEnde,$source)
{
    $removeFirst = explode($splitServer, $source);
    $removeSecond = explode($splitServerEnde, $removeFirst[1]);
    return $removeSecond[0];
}
$splitServer = ')';
$splitServerEnde = ';';
//---------Funktionsende getServer--------------------

//Funktion getNicks
function getNicks($splitNicks,$splitNicksEnde,$source)
{
    $removeFirst = explode($splitNicks, $source);
    // Code zu entfernen
    // var_dump($removeFirst);    // Siehe Punkt 1)
    $removeSecond = explode($splitNicksEnde, $removeFirst[1]);
    // Code zu entfernen
    //var_dump($removeSecond);    // Siehe Punkt 2)
    //return $removeSecond[0];

        return trim($removeFirst[1]).";".trim($removeFirst[2]).";".trim($removeFirst[3]);


}
$splitNicks = ';';
$splitNicksEnde = ' ';


//---------Funktionsende getNicks--------------------

// Inhalt der Datei Zeilenweise Einlesen und Verarbeiten.
while (!feof($nicks))
{
     $zeile = fgets($nicks,filesize('shortlog.ini'));
          $source = $zeile;
          $playerID = getPlayerID($splitFirst,$splitSecond,$source);
     $playerlogin = getLastLogin($splitdatum,$splitdatumEnde,$source);
          $Server = getServer($splitServer,$splitServerEnde,$source);
          $Nicks = getNicks($splitNicks,$splitNicksEnde,$source);
          if($zeile='\n')
          {
               if($playerID == $data['guid'])
              {
                $query="Update gamers SET('','','$playerlogin',$Server,'$Nicks')";

              }
              else
              {
              $query="Insert into gamers values('','$playerID','$playerlogin','$Server','$Nicks')";
                 //echo "Neueintrag";
              }
          }

       echo "<br>".$playerID,$playerlogin,$Server,$Nicks;


 //Query ausführen - Posten der Daten
   mysql_query($query) or die (mysql_error());
// ------------Ende der WHILE-Schleife
          }

$size=filesize("shortlog.ini");
$size=$size/1000;
echo "<br><br>".$size."kb";


   $ip = $_SERVER['REMOTE_ADDR'];
   $host = gethostbyaddr($ip);
   echo "<br>IP-Adresse: $ip<br>";
   echo "Hostname: $host";

// verbindung Schließen um Serverlast zu Reduzieren
fclose($nicks);

 $endzeit=explode(" ", microtime());
$endzeit=$endzeit[0]+$endzeit[1];
echo "<br><br><br>Diese Seite wurde in ".round($endzeit - $startzeit,6)." Sekunden geladen";



?>

Liegt es an dem Return bei Getnicks ?
 
Hmm, also ganz ehrlich: Ich verstehe gerade nicht so ganz was du machst.
Dein Script funktioniert so:
- eine Zeile lesen
- diese Zeile "durchsuchen" nach player, server nicks, usw
- wenn die zeile aus \n besteht (was im übrigen "\n" besser wäre) dann trage die zeile in die DB ein

so jetzt nochmal logisch rangegangen:
wenn du deine daten in die db schreiben willst, muss die $zeile Werte enthalten
du fragst ab, ob $zeile eine Zeilenumbruch enthält (keine daten) und wenn es einen Zeilenumbruch gibt, dann trage die Werte in die DB. Aber bei einem Zeilenumbruch gibt es keine Werte wie nicks, server usw... verstehst du was ich meine?

Ich würde abfragen, ob die Vars mit den Daten gesetzt sind, z.B. so:

PHP:
while (!feof($nicks))
{
    $zeile = fgets($nicks,filesize('shortlog.ini'));
    $source = $zeile;
    $playerID = getPlayerID($splitFirst,$splitSecond,$source);
    $playerlogin = getLastLogin($splitdatum,$splitdatumEnde,$source);
    $Server = getServer($splitServer,$splitServerEnde,$source);
    $Nicks = getNicks($splitNicks,$splitNicksEnde,$source);
    if(isset($playerID) AND isset($playerlogin) AND isset($Server) AND isset($nicks))
    {
        if($playerID == $data['guid'])
        {
            $query="Update gamers SET('','','$playerlogin',$Server,'$Nicks')";
        }
        else
        {
            $query="Insert into gamers values('','$playerID','$playerlogin','$Server','$Nicks')";
            //echo "Neueintrag";
        }
        //Query ausführen - Posten der Daten
        mysql_query($query) or die (mysql_error());
    }
    
    echo "<br>".$playerID,$playerlogin,$Server,$Nicks;
    // ------------Ende der WHILE-Schleife
}

oder deine Zeile mit dem '\n' könnte man ändern in IF($zeile != "\n")..
 
Ohh man, jetzt verstehe ich den logischen Fehler. Hast Recht wenn ich prüfe ob die Zeile \n ist kann ja nichts drinne stehen ^^.
Irgendwie hatte ich angenommen das er den Inhalt Speichert und ich dann prüfen kann wenn bei dem Inhalt \n vorkommt, füre es mit dem Rest aus ;)


So ich habe erstmal das das '\n' zu "\n" gemacht und als 2. auch deine Methode probiert, welche zwar mehr Schreibarbeit aber dafür Übersichtlicher ist.

Bei beiden sachen kommt der Fehler.
Code:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('','','',,';;')' at line 1

Was aber Höchstwahrscheinlich an meier Update funktion liegt ^^.

Außerdem funktioniert die
PHP:
if($playerID == $data['guid'])
        {
nicht richtig. Aber ich denke das bekomme ich hin ^^


Vielen Dank auf jeden Fall. Wenn es nicht klappt Melde ich mich sowieso wieder :P

Ich sollte mir doch hin und wieder Struktogramme machen oder wenigstens bisschen Pseudocode um nicht die Übersicht zu verlieren.
 
OK, ich habs geschafft das die Datensätze nun in die Datenbank geschrieben werden.
Aber:

PHP:
if($playerID == $data['guid'])
               {
             echo "Updaten";
               }
               else
               {
               
                echo "Neueintrag";
               }

Funktioniert irgendwie nicht. Ich glaube ich komme gar nicht richtig an $data[
'guid'] ran.

um zu vergleichen. Und bei der Ausgabe stehen vor dem gesammten Text immer 2 ;

Die dann auch in die Datenbank eingetragen werden.
 
Schau dir die Fehlermeldung mal genau an:
Der Fehler soll in der Nähe von ('', ....usw liegen, mal schauen wo es das gibt

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('','','',,';;')' at line 1$query="Update gamers SET('','','$playerlogin',$Server,'$Nicks')";
und
$query="Insert into gamers values('','$playerID','$playerlogin','$Server','$Nicks')";

in beiden deiner Querys könnte der Fehler passen.
Es scheint so, als wären die Variablen leer und was sehr seltsam ist, das bei $Nicks ein ";;" steht. Das könnte auf eine seltsame Zeile in dem Logfile schliessen oder das dein Script mit dem zerpflügen der einzelnen Zeilen aus der Log mit einer Zeile ein Problem hat und deshalb nichts richtiges rauskommt.

Edit:
$data['guid'], keine ahnung was das ist. In deinem Script konnte ich kein array $data finden. Dann ist $data[guid] automatisch == NULL und damit ist die IF Abfrage ungültig.

Die zwei ";;" müsstest du theorethisch sehen, bei einer Ausgabe
echo "<br>".$playerID."__".$playerlogin."__".$Server."__".$Nicks;
innerhalb der Schleife sehen. Wenn sie "vor" allem stehen, müssten sie in der Variablen $playerID sthen.
Schaut man sich aber die SQL Fehlermeldung an, sieht man die ";;" auch beim letzten Element des Querys, also eher bei $nicks.

Musste mal schauen, wo genau die beiden Semikolons herkommen.
 
So sieht ja die Quelle aus.
Code:
[TOCShortplayerlog.ini]
PlayerID=17e16a1c02d714a560abb8cbxxxxxxxx (Last Login: 2006/05/1)Cool Testserver;Nick1;Nick2
PlayerID=17e16a1c02d714a560bbb8cbxxxxxxxy (Last Login: 2006/05/1)Cool blablaserver;Bla;Blub;BlubbLubb 
PlayerID=57ad568af5062fb47e54325c651ce65b (Last Login: 2007/05/20)Gamers_server;Gamer_name;thsdjshdhs

Das Ergebniss:
Code:
;;
17e16a1c02d714a560abb8cbxxxxxxxx 2006/05/1Cool TestserverNick1;Nick2;
17e16a1c02d714a560bbb8cbxxxxxxxy 2006/05/1Cool blablaserverBla;Blub;BlubbLubb
57ad568af5062fb47e54325c651ce65b 2007/05/20Gamers_serverGamer_name;thsdjshdhs;

Da kommen also die beiden ;; ganz am Anfang.
Ich nehme an es liegt an der ersten Zeile [TOCShortplayerlog.ini] die keines von den Zeichen enthält nach denen gesucht wird, oder ?
 
Zurück