3 Variablen aus 3 Schleifen in ein INSERT ?

Pestilence

Mitglied
So nun habe ich soweit die Daten aus meiner *.scp bearbeitungsbereit.
Nur habe ich nun 3 Variablen die füe jedendatensatz im Array
in einen mySQL Insert Befehl haben möchte.

Leider klappte das bissher nicht wirklich weil ich die Ausgaben von print_r()
nur in der jeweiligen Schleife gebrauchen kann.
Und wenn Ich das z.B. so anstelle:

PHP:
 $Name = print_r()

Dann bekommt ich leider nur eine "1" als ausgabe.

Das Script sieht momentan so aus:

PHP:
<?php
include 'dbcon_u.php'; 
mysql_select_db("U300607AA");
		
echo "<hr>";
$x=file('sphereaccu.scp'); // hier dann die *.scp Datei 
for($i=0;$i<sizeof($x);$i++) // zeilenweise durchgehen 
{ 
$j=explode("[",$x[$i]); // nach [ trennen 
$k=explode("]",$j[1]); // die rechte hälfte davon nach ] trennen 
$l=explode("=",$x[$i]); // für email nach = trennen 
$m=explode("=",$x[$i]); // Onlinezeit nach = trennen 

if($k[0]>"") //echo $k[0].'<br>'; // wenn was zwischen den [] stand ausgeben 
{
print_r($k[0]);
echo '<br>';

}

if($l[0]=="Email") // wenn links neben dem = ein 'Email' stand 
{ 
  $l[1]=ereg_replace("\"","",$l[1]); // die "" wegkürzen 
  //echo $l[1].'<br>'; // ausgeben

print_r($l[1]);
echo '<br>';
 
}
if($m[0]=="TotalConnectTime") // wenn links neben dem = ein 'TotalConnectTime' stand 
{ 
  $m[1]=ereg_replace("\"","",$m[1]); // die "" wegkürzen 
  //echo $m[1].'<br>'; // ausgeben
  
print_r($m[1]);  
echo '<br>';
 
}

}
echo "<hr>";
echo $Name;
//$eintrag = "INSERT INTO `UO3player` (`pAccname`) VALUES ('$Name')";
//$eintragen = mysql_query($eintrag) OR die (mysql_error());
?>

Hat da jemand eine Idee wie ich die 3 Variablen pro Arrayschrit in einen Insert bekommen kann?

Vielen dank schonmal soweit.
 
Ich verstehe dein Problem nicht so ganz.
Also mit print_r() bekommst du alle werte angezeigt, die du in die Tabelle schreiben willst?
Wenn ja, dann hat doch jede value in deinem Array einen bestimmten key bzw sind die Daten in einer bestimmten Reihenfolge in einem Array

PHP:
// assoziatives Array
$array = array('vorname' => 'Hanz', 'nachname' => 'Wurst', );
$vorname= $array['vorname'];
$nachname= $array['nachname'];

// normales array mit fest definierter Reihenfolge
$array = array('Hanz', 'Wurst');
$vorname= $array[0];
$nachname= $array[1];
 
1. Du wirst halt für jeden "Datensatz" ein Insert machenmüssen.
2. Wie wärs mit einrücken? Dieses Ding was deinen Code wesentlich besser lesbar macht.
3. Wie wärs wenn du die Werte nicht mit print_r ausgibts sondern temporär in ne Variable speicherst, bis dir alle Werte vom Datensatz bekannt sind?
 
Sicaine hat gesagt.:
1. Du wirst halt für jeden "Datensatz" ein Insert machenmüssen.

Da habe ich auch nichts dagegen, nur bekomme ich sobald ich das in eine Variable speichere z.B. $Name = print_r()... eine 1 aus dem aktuellen Wert.

Das Script ist momentan hier zur Einsicht online.
>>Hier<<
 
Ja, das geht ja so auch nicht! Du kannst mit print_r() keiner Variable einen Wert aus einem Array zuweisen.

print_r() ist eine Funktion mit der man sich alle Werte eines Arrays ansehen kann.
Der eigentliche Sinn dieser Variable(zumindest für mich) dient zu debugging zwecken.

Hast du mal das versucht was ich dir geschrieben habe? Das gleiche hat dir der Sicaine auch noch einmal geschrieben, lesen muss man schon ;)
3. Wie wärs wenn du die Werte nicht mit print_r ausgibts sondern temporär in ne Variable speicherst, bis dir alle Werte vom Datensatz bekannt sind?
Und genau das, habe ich gemacht in meinem 1 Posting(siehe oben)
 
Also nochmal Klartext (Weil sich nun auch das Problem etwas geändert hat) :D

Ich möchte aus einer Textbasierten Datei alle Charaktere raus ziehen.
Was ich daraus benötige sind:

[Adrim]
Email="greensan@web.de"
TotalConnectTime=193

Die Datei sieht im gesammtbild so aus:

Code:
\\ Sphere Terra Novalis accounts file
\\ NOTE: This file cannot be edited while the server is running.
\\ Any file changes must be made to sphereaccu.scp. This is read in at save time.

[Adrim]
Password=+++
Email="greensan@web.de"
Lang=DEU
PrivFlag_EMailValid=1
TotalConnectTime=193
LastConnectTime=26
LastCharUID=07D1
CharUID=07D1
FirstConnectDate="2005/01/29 19:05:13"
FirstIP="213.23.41.25"
LastConnectDate="2005/01/30 21:42:48"
LastIP="213.23.45.215"

[Aegir]
Password=+++
Email="michael_kreps@web.de"
Lang=DEU
PrivFlag_EMailValid=1
TotalConnectTime=46
LastConnectTime=25
LastCharUID=06C39
CharUID=06C39
FirstConnectDate="2005/01/30 18:13:54"
FirstIP="217.233.150.118"
LastConnectDate="2005/01/30 22:40:09"
LastIP="217.233.128.79"

[Aphadriel]
Password=+++
Email="aphadriel@gmx.de"
Lang=DEU
PrivFlag_EMailValid=1
TotalConnectTime=389
LastConnectTime=12
LastCharUID=05773
CharUID=05773
FirstConnectDate="2005/01/26 12:22:05"
FirstIP="83.129.78.247"
LastConnectDate="2005/01/30 23:14:00"
LastIP="83.129.50.196"

[... usw.]

Dazu benutze ich folgendes Script um das nun herraus zu filtern.

PHP:
<?php
include 'dbcon_u.php'; 
mysql_select_db("U300607AA");
		
echo "<hr>";

	$x=file('sphereaccu.scp'); // hier dann die *.scp Datei 
	for($i=0;$i<sizeof($x);$i++) // zeilenweise durchgehen 
	{ 
		$j=explode("[",$x[$i]); // nach [ trennen 
		$k=explode("]",$j[1]); // die rechte hälfte davon nach ] trennen 
		$l=explode("=",$x[$i]); // für email nach = trennen 
		$m=explode("=",$x[$i]); // Onlinezeit nach = trennen 

			if($k[0]>"")  
				echo $k[0].'<br>'; // wenn was zwischen den [] stand ausgeben
				{
				$Name = $k[0];
				}

			if($l[0]=="Email") // wenn links neben dem = ein 'Email' stand 
			{
 				$l[1]=ereg_replace("\"","",$l[1]); // die "" wegkürzen 
  				echo $l[1].'<br>'; // ausgeben

				$EMail = $l[1];
			}


			if($m[0]=="TotalConnectTime") // wenn links neben dem = ein 'TotalConnectTime' stand 
			{
 				$m[1]=ereg_replace("\"","",$m[1]); // die "" wegkürzen 
  				echo $m[1].'<br>'; // ausgeben

				$Online = $m[1];
			}

	if ($Name>"" and $EMail>"")
	{
		$eintrag = "INSERT INTO `UO3player` (`pAccname`) VALUES ('$Name')";
		$eintragen = mysql_query($eintrag) OR die (mysql_error());
		
		$eintrag2 = "UPDATE `UO3player` SET `pEmail` = '".$EMail."' WHERE `pAccname` = '".$Name."'";
		$eintragen2 = mysql_query($eintrag2) OR die (mysql_error());

		$eintrag3 = "UPDATE `UO3player` SET `pOnline` = '".$Online."' WHERE `pAccname` = '".$Name."'";
		$eintragen3 = mysql_query($eintrag3) OR die (mysql_error());	
	}


}
echo "<hr>";
?>


Funktioniert nun so weit wunderbar, die Ausgabe von dem php sieht nun so aus.

Code:
Adrim
greensan@web.de 
193 
Aegir
michael_kreps@web.de 
46 
Aphadriel
aphadriel@gmx.de 
389 
Chomper
chris.whitie@gmx.net 
403 
connerreeves
connerreeves@aol.com 
341 
darius
esu.sicki@web.de 
4 
Drake
Drake_@web.de 
798 

[... usw.]

Doch nun beginnt es wirklich komisch zu werden.

Die SQL Datenbank zeigt mir bei den aufgenommenen Datensätzen
folgendes Bild.

tabelle1.jpg


Nun das Problem: Irgendwie lässt er nur den ersten ersten Namen aus
(obwohl er in der Ausgabe angezeigt wird) der Datenbank raus. Jedoch hängt er die Emailaddy zu dem Account "Adrim" an den nächsten Account.
Und dies macht er bis zum [EOF].
Ich habe schon einige Varianten ausprobiert, aber irgendwie lässt er immer den ersten namen verschwinden =(.
Hat da wer ne Idee was ich da falsch gemacht habe ?
 
Hast du denn schon einmal versucht das ganze zu debuggen? Dann wäre dir der Fehler auch aufgefallen.

Du willst ja den Insert nur dann machen, wenn $name und $email gesetzt ist.
Wir gehen mal eben ein Szenario durch.

Name 1:

Durchlauf 1: $name wird gesetzt;
Durchlauf 2: hier passiert nix wegen der Zeile mit dem PW dazwischen
Durchlauf 3: $email wird hinzugefügt und es wird der erste Eintrag gemacht in die Datenbank
Durchlauf 5-6: es wird bei jedem durchlauf die Tabelle upgedatet, da ja $name und $email immernoch gesetzt sind, ansonsten passiert nix weiter
Durchlauf 7 : $connect wird hinzugefügt und erneut alles wieder upgedatet
Durchlauf 8-13 : bei jedem Durchlauf wird upgedatet

Name 2:
Durchlauf 1: $name wird neu gesetzt UND DIE $EMAIL ist immernoch gesetzt von den ersten 1-13 Durchläufen(Name 1). Da diese nun gesetzt ist, wird es als $name und $email erkannt und dementsprechend upgedatet.

Und das passiert bis die Datei zu ende ist. Abhilfe kannst du schaffen, indem du unten noch in den if zweig(bei den mysql kram) folgendes addest.
unset($Name), unset($EMail)...

Desweiteren frage ich mich, was du da überhaupt machst mit den ganzen updates, warum packst du das nicht in 1 Query? Ich hab das auch gleich mal bissel ordentlich gebastelt wom restlichem code her

PHP:
		$x=file('xyz.scp'); // hier dann die *.scp Datei 
    for($i=0;$i<sizeof($x);$i++){ 
      
      if(preg_match('/^\[/', $x[$i] , $regs)){
      	$x[$i]=str_replace('[','',str_replace(']','',$x[$i]));
      	$Name = $x[$i];
      }
      
      if(preg_match('/^Email=/', $x[$i] , $regs)){
      	$tmp 		= explode('=', $x[$i]);
      	$EMail	= str_replace('"','', $tmp[1]);
      	
      }
      
      if(preg_match('/^TotalConnectTime=/', $x[$i] , $regs)){
      	$tmp 		 = explode('=', $x[$i]);
      	$Online = $tmp[1];
      }

    // Diese Schleife geht auch bei deinem altem Code
    if (isset($Name) and isset($EMail) and isset($Online)) { 
        $eintrag = 'INSERT INTO `UO3player` (`pAccname`, `pEmail`, `pOnline`) VALUES ("'.$Name.'", "'.$EMail.'", "'.$Online.'")'; 
        $eintragen = mysql_query($eintrag) OR die (mysql_error()); 
        unset($Name);
        unset($EMail);
        unset($Online);
     }
 
Zuletzt bearbeitet:
Allerbesten Dank
Das hilft mir einen riesigen Sprung weiter.
Ich hatte vorhher noch nie Solche Datein ausgelesen und dementsprechend
war mir der Befehl str_replace nicht geläufig.

Aber damit ist das ja deutlich leichter und zuverlässiger.
Vielen vielen Dank
 
Zurück