Ruben Arslan: Finde Fehler nicht. Import von CSV in Datenbank

Hallo Forum!

Ich sitze seit einiger Zeit an einem Webvokabeltrainer, der inzwischen auch nutzbar genug für meinen Bedarf ist (Von Zeichensatzproblemen mal abgesehen, damit habe ich aber noch nicht genügend auseinandergesetzt).
Nun wollte ich dafür aber eine Import/Export-Funktion einbauen, auf dass man (bzw. ich) Vokabeln austauschen /zwischen zwei Accounts updaten kann.
Dabei habe ich mal wieder hinter meinem eigenen PHP-Horizont arbeiten müssen, nicht ganz ohne Erfolg allerdings. Ich habs soweit gebacken gekriegt. Dachte ich. Den nun führt die Funktion den Part nicht aus, den ich für den einfachsten gehalten habe. Und ich KOMM einfach auch nach mehreren Tagen Hirnmarterung und völliger Drogenabstinenz nicht drauf.
Kann mir jemand von euch aus der Patsche helfen? Ich weiß, dass ist kein generelles Problem, aber gebts zu, ihr helft doch gern..!
Ich komm leider nicht drumrum, den gesamten Code zu posten, da ich in meiner Verzweiflung keine Ahnung mehr habe, was den Fehler verursacht.
Ich hab ein wenig auskommentiert und ich hoffe die Tabulatoren bleiben beim Posten erhalten, sonst kann ich es auch irgendwie anders formatieren. Hab vergessen, wie das Forum mit Tabs umgeht.
Wenn jemand die Chose "live" sehen will: http://wookable.funpic.de
Habe euch einen Account test/test angelegt, könnt euch natürlich auch neu registrieren, das Programm ist sozusagen in der Betaphase oder Alpha 2 oder so.
Kann in den nächsten zwei Stunden leider nicht direkt antworten, danach stelle ich mich aber jedweder Kritik mutig entgegen.
Fallsjemand einen Kommentar zur Effektivierung des Codes anbringen möchte: Bitteschön, ich stümper immer bloß rum.

Aber zum Wesentlichen, danke fürs Durchhalten:

<?php
if(!$_GET['x'] OR !$_GET['y']) { // sehr billige userpruefung, lacht mich nicht aus. reicht um kiddies abzuschrecken
 echo "Pfusch nicht rum, hilft niemand."; exit;
 }
else {
 include("database.php");
 $que = mysql_query("SELECT * FROM users WHERE name IN ('".$_GET['x']."')");
 $test = mysql_fetch_object($que);
 if($test) {
  $jup = mysql_query("SELECT * FROM users WHERE name IN ('".$_GET['x']."')");
  while ($user = mysql_fetch_array($jup)) {
   $name = $_GET['x'];
   if($user['pass']==$_GET['y']) $string = "?x=".$name."&y=".$_GET['y'];
   else $errormsg = "Das Passwort ist falsch!";
   }
  }
 else $errormsg = "Der eingegebene Name ist nicht registriert.";
 }

if($errormsg) {
 echo $errormsg . '<br><a href="index.html">Zum Log In</a>'; exit;
 } // ende der pruefung. hat bisher nix am script kaputt gemacht

if($_POST['export']) { // tuts soweit. habs hier drun falls der hund da begraben liegt. bin ratlos.
 $spr = $_POST['sprachen'];
 if($spr[0]=="all") $que = "SELECT * FROM wookable WHERE user IN('".$name."')";
 else $que = "SELECT * FROM wookable WHERE user IN('".$name."') AND sprache IN ('".implode("','", $spr)."')";
 $query = mysql_query($que);
 $data = "";
 while($csv=mysql_fetch_array($query)) {
  $data .= '"'.addslashes($csv['sprache']).'";"'.addslashes($csv['bekannt']).'";"'. addslashes($csv['fremd']).'";"'.addslashes($csv['hinweis']).'";"'.$csv['phase'].'";"'.$csv['zeit'].'";""\n';
  }
 }
else if($_POST['import'] AND $_POST['csvdata']!="") { // hiermit will ich die eingegeben daten auffisseln und eingeben (updaten/neu einsetzen)
 $csv = str_replace("\r\n","\n",$_POST['csvdata']);
 $length = count($csv)-1;
 if($_POST['format']=="csv") {
  $csv = explode('";""\n"',$csv);
  // hier hoere ich auf zu verstehen was ablaeuft hier funktionierts nicht mehr obwohl es sollte. oder?
  for($i=0;$i<$length;$i++) { // need reg.exp
     echo "muh";exit;

$help = explode('";"',$csv[$i],6);
   $data['sprache'][$i] = stripslashes($help[0]);
   $data['bekannt'][$i] = stripslashes($help[1]);
   $data['fremd'][$i] = stripslashes($help[2]);
   $data['hinweis'][$i] = stripslashes($help[3]);
   $data['phase'][$i] = $help[4];
   $data['zeit'][$i] = $help[5];
   }
  }
 else if($_POST['format']=="txt")  {
  $csv = explode("\n",$csv);
  for($i=0;$i<$length;$i++) {
   $help = explode(";",$csv[$i],3);
   $data['sprache'][$i] = "default";
   $data['bekannt'][$i] = $help[0];
   $data['fremd'][$i] = $help[1];
   if(!$help[2]) $help[2] = "";
   $data['hinweis'][$i] = $help[2];
   $data['phase'][$i] = 0;
   $data['zeit'][$i] = 0;
   }
  }
 // mehr formate werden hier noch auftauchen
 $olddata = mysql_query("SELECT * FROM wookable WHERE user IN('".$name."')");
while ($old = mysql_fetch_array($olddata)) {
  $woinbekannt = array_search(trim($old['bekannt']),trim($data['bekannt']));
//heilloses kuddelmuddel: das soll es sein: doubles werden gefunden, im array geupdatet, keys werden gespeichert und nachher abgearbeitet. aber hier bin ich ja noch gar nicht.
  if($woinbekannt AND  $old['fremd']==$data['fremd'][$woinbekannt]) { //double
   if($data['sprache'][$woinbekannt]=="default") $data['sprache'][$woinbekannt] = $old['sprache'];
   if($data['hinweis'][$woinbekannt]=="") $data['hinweis'][$woinbekannt] = $old['hinweis'];
   if($data['phase'][$woinbekannt]=="0" AND $data['zeit'][$woinbekannt]=="0") {
    $data['phase'][$woinbekannt]=$old['phase'];
    $data['zeit'][$woinbekannt]=$old['zeit'];
    } // ich weiss nicht ob es funktioniert, weil mein script schon vorher versagt. oder kann es hieran liegen?
   $doubles[] = $woinbekannt;
   $data['id'][$woinbekannt] = $old['id'];
   }

}
 // now for the doubletrouble. sollte funktionieren, wenn denn daten übergeben worden waeren.
 foreach($double AS $dbl) {
   $freshdouble = mysql_query("UPDATE wookable Set sprache = '".$data['sprache'][$dbl]."', phase = ".$data['phase'][$dbl].",bekannt = '".$data['bekannt'][$dbl]."',fremd = '".$data['fremd'][$dbl]."',hinweis = '".$data['hinweis'][$dbl]."',zeit = '".$data['zeit'][$dbl]."' WHERE user IN ('".$name."') AND id = ".$data['id'][$dbl]);
   unset($data['sprache'][$dbl],$data['bekannt'][$dbl],$data['fremd'][$dbl],$data['hinweis'][$dbl],$data['phase'][$dbl],$data['zeit'][$dbl],$data['id'][$dbl]);
   }
 for($i=0;$i<$length;$i++) { // nun noch den rest arbeiten bitteschoen.
  if($data['bekannt'][$i]) $fresh = mysql_query('INSERT INTO wookable (id, user, sprache, bekannt, fremd, hinweis, phase, zeit) VALUES ('', ''.$name.'', ''.$data['sprache'][$i].'', ''.$data['bekannt'][$i].'', ''.$data['fremd'][$i].'', ''.$data['hinweis'][$i].'', ''.$data['phase'][$i].'', ''.$data['zeit'][$i].'')');
 }
 $feedback = "Es wurden ".count($double)." Vokabeln aktualisiert und ".count($data['bekannt'])." Vokabeln neu eingefügt";
 }
mysql_close(); // und finito
?>

  1. hi,

    von was für einem Fehler redest du denn überhaupt?

    Wenn jemand die Chose "live" sehen will: http://wookable.funpic.de

    Meinst du etwa das dort, wenn man nach dem Login auf Ex-/Import klickt erscheinende

    "Parse error: parse error, unexpected '}' in /usr/export/www/vhosts/funnetwork/hosting/wookable/eximport.php on line 126"

    ?

    Wenn ja, dann überprüfe Anzahl und Platzierung deiner öffnenden und schließenden geschweiften Klammern.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hello Wahsaga,

      von was für einem Fehler redest du denn überhaupt?

      Wieso hast Du überhaupt geantwortet?
      Es wird im OP von einem Problem beim Import gesprochen, und dann kommt hier ein Chaos von Script...

      Keine Fehlerbehandlung, keine Fehlerbeschreibung, kein  nix...

      Harzliche Grüße vom Berg
      esst mehr http://www.harte-harzer.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Hallo Tom,

        danke für dein negatives Feedback. Aber was verlangst du, dass Script läuft ja so durch, ich bin wie gesagt noch im Aufbau. Der Fehler besteht, wie gesagt darin, dass die Daten an der Stelle der for-Schleife verlorengeht. Der Code mag chaotisch für einen Profi sein, aber er ist definitiv logisch und auch korrekt getabbt, mehr kann ich als Amateur, fürchte ich, nicht leisten. Wenn du die Chaosbeseitigung irgendwie anders im Sinne hattest, sag's mir bitte.

        Gruß,
        Ruben

    2. Hallo,

      ich weiß nicht, was den Fehler verursacht, der darin besteht, dass an der im Code gekennzeichneten Stelle (forschleifen) keine Daten übernommen werden. Sorry für die Klammer, die hatte aber gar nichts mit dem Code zu tun, nur ein Ausgabeschnipsel am Ende, an dem ich noch gebastelt hatte. Lasse es jetzt aber mal so wie es ist.

      Herzlichen Gruß & Vielen Dank,
      Ruben

  2. Ok, ist ja dann doch peinlich, wenn man den Bug findet. Wage, zu betonen, dass ich tatsächlich lange gesucht habe.
    Hab aber immer noch ein Problem...
    Diesmal kann ichs allerdings sogar generell darstellen:
    Zwei Arrays: Einen habe ich soeben aus meiner Datenbank gelutscht, der ist so aufgebaut $foo['bar'][$i] wobei es sechs feststehende Werte für bar gibt und halt ne Menge $i's und am Ende des ganzen den Wert.
    Der andere Array ist eine CSV-Eingabe mit der ich so ziemlich alles machen kann. Im Moment ist sie, weil das zu meiner Scriptidee passte, so aufgebaut $foo[$i][bar].
    Ich habe: ein nichtfunktionierendes und ineffektives Script, dass so schlecht ist, dass es sich nicht lohnt, den Fehler auszumerzen (so siehts für mich aus, aber ich habe keine Ahnung von Arrays und PHP.

    // hier vorrausgeht der quer¥ an die datenbank.
    while ($old = mysql_fetch_array($olddata)) {
      $woinbekannt = array_search(trim($old['bekannt']),$data['bekannt']);
    // hier soll folgendes passieren: doubles werden gefunden, die keys werden gespeichert und die infos im ursprungsarray $data geupdatet.
      if($woinbekannt AND  $old['fremd']==$data['fremd'][$woinbekannt]) { //double
       if($data['sprache'][$woinbekannt]=="default") $data['sprache'][$woinbekannt] = $old['sprache'];
       if($data['hinweis'][$woinbekannt]=="") $data['hinweis'][$woinbekannt] = $old['hinweis'];
       if($data['phase'][$woinbekannt]=="0" AND $data['zeit'][$woinbekannt]=="0") {
        $data['phase'][$woinbekannt]=$old['phase'];
        $data['zeit'][$woinbekannt]=$old['zeit'];
        }
       $doubles[] = $woinbekannt;
       $data['id'][$woinbekannt] = $old['id']; // damit ich die vokabel anhand ihrer ID updaten kann
       }

    }
     // now for the doubletrouble... hier also die doubles updaten + löschen
    if($doubles) {
     foreach($doubles AS $dbl) {
       $freshdouble = mysql_query("UPDATE wookable Set sprache = '".$data['sprache'][$dbl]."', phase = ".$data['phase'][$dbl].",bekannt = '".$data['bekannt'][$dbl]."',fremd = '".$data['fremd'][$dbl]."',hinweis = '".$data['hinweis'][$dbl]."',zeit = '".$data['zeit'][$dbl]."' WHERE user IN ('".$name."') AND id = ".$data['id'][$dbl]);
       unset($data['sprache'][$dbl],$data['bekannt'][$dbl],$data['fremd'][$dbl],$data['hinweis'][$dbl],$data['phase'][$dbl],$data['zeit'][$dbl],$data['id'][$dbl]);
       }
      }
    // und die völlig neuen neu einfügen.
     for($i=0;$i<$length;$i++) {
      if($data['bekannt'][$i]) $fresh = mysql_query('INSERT INTO wookable (id, user, sprache, bekannt, fremd, hinweis, phase, zeit) VALUES ('', ''.$name.'', ''.$data['sprache'][$i].'', ''.$data['bekannt'][$i].'', ''.$data['fremd'][$i].'', ''.$data['hinweis'][$i].'', ''.$data['phase'][$i].'', ''.$data['zeit'][$i].'')');
     }

    Ich suche jetzt: Ggf. eine Meinung: Gibt es hierfür eine bessere Lösung (BITTE!) oder was kann ich hierdran verbessern. Dann müsst ich noch den Bug tracen, aber ich hoffe noch auf eine resourcenschonendere Lösung.