[MYSQL/PHP]Datei die einträge in datenbank ändern soll



  • Hallo leute,

    Mir fiel gerade keine bessere Überschrift ein.

    zum Problem:

    Ich bin gerade dabei eine Datei zuschreiben die einmal täglich aufgerufen wird (crownjob) in der Datei ist eine Rechnung die 3 Faktoren die Multipliziert werden sollen und dann bei jedem einzelnen wieder in die Datenbank geschrieben werden

    Die 3 Faktoren:
    Level (in welchem level ist der user)
    Etage (Wie viele Etgaen hat der user)
    580€ (fester Wert)

    Die Rechnung

    $ergebnis = $level * $etage * 580
    

    Das Problem an sich ist bei mir ,da ja jeder eine andere anzahl an leveln und etagen hat, dass jeder den auch noch das richtige ergebnis dazu bekommt zu dem bestehenden geld

    bisheriger code :

    $abfrage = "SELECT level, etage FROM login";
    $ergebnis = mysql_query($abfrage);
    $row = mysql_fetch_array($ergebnis);
    
    $level = $row['level'];
    $etage = $row['etage'];
    $zahl = "580";
    $ergebnis = $level * $etage * 580
    ?>
    

    Ich hoffe das ich das soweit gut erklärt habe und das mir einige helfen können

    einfügen würde ich das denn irgendwie das vorhanden geld auslesen und dann die 2 ergebnise addieren und wieder einfügen mit INSERT INTO wenn es auch einfacher geht ich bin für alles offen!

    mfg



  • Hallo,

    du musst schon eine Frage stellen auf die man antworten kann. Auf den ersten Blick fällt mir nur auf, dass deine SQL-Statement keine WHERE-Klausel hat, die aber erforderlich wäre, wenn User und Level/Etage in der Datenbank assoziiert sind.

    Sprich:

    ID etage level username
    -----------------------------
    1 15 15 testuser

    Deine Abfrage müsste sich dann auf den Username beziehen:

    SELECT etage,level FROM login WHERE username='testuser'
    

    Oder du musst, da du sagst es soll als CRONJOB laufen, das gesamte Ergebnisarray durchlaufen und berechnen. Dann müsste der SELECT aber auch auf den username ausgelegt sein.

    $sql = "SELECT `etage`, `level`, `username` FROM `login`";
    $result = mysql_query($sql);
    while($row=mysql_fetch_array($sql))
    {
      $level = $row['level'];
      $etage = $row['etage'];
      $user  = $row['username'];
      $zahl = (int)580; // Da es eine Zahl ist, brauchst du keine Anführungszeichen. Der Cast ist nicht wichtig, sollte man aber mal gesehen haben!
    
      $ergebnis = $level * $etage * $zahl; // $zahl solltest du auch verwenden, wenn du es schon deklarierst.
    
      mysql_free($result);
      mysql_query("INSERT INTO `login` (`etage`, `level`, `username`) VALUES ('".$etage."', '".$level."', '".$username."') ON DUPLICATE KEY UPDATE `etage`='".$etage."', `$level`='".$level."'"); 
      /* Der Unique-Index (Schlüssel (Key) für Eindeutigkeit) muss hierbei auf "username" sitzen (NICHT auf etage und level) */
    }
    

    Ich hoffe das hat geholfen.

    VlG



  • Hallo,

    Sry,

    mysql_free($result); // Gibt es nicht
    mysql_free_result($result); // So ist es richtig =)
    

    06:58 war mir einfach noch zu früh .

    LG



  • PHP schrieb:

    $sql = "SELECT `etage`, `level`, `username` FROM `login`";
    $result = mysql_query($sql);
    while($row=mysql_fetch_array($sql))
    {
      $level = $row['level'];
      $etage = $row['etage'];
      $user  = $row['username'];
      $zahl = (int)580; // Da es eine Zahl ist, brauchst du keine Anführungszeichen. Der Cast ist nicht wichtig, sollte man aber mal gesehen haben!
    
      $ergebnis = $level * $etage * $zahl; // $zahl solltest du auch verwenden, wenn du es schon deklarierst.
    
      mysql_free($result);
      mysql_query("INSERT INTO `login` (`etage`, `level`, `username`) VALUES ('".$etage."', '".$level."', '".$username."') ON DUPLICATE KEY UPDATE `etage`='".$etage."', `$level`='".$level."'"); 
      /* Der Unique-Index (Schlüssel (Key) für Eindeutigkeit) muss hierbei auf "username" sitzen (NICHT auf etage und level) */
    }
    

    Damit little bobby tables in der Datenbank auch seinen Platz findet, könnten ein paar mysql_real_escape_string-Aufrufe nicht schaden.



  • 😕 Die daten sind doch aufbereitet in der Datenbank
    Kann da überhaupt noch was schief gehen?



  • Sqwan schrieb:

    😕 Die daten sind doch aufbereitet in der Datenbank
    Kann da überhaupt noch was schief gehen?

    Ja. Du holst die Felder aus der Datenbank, da kann alles mögliche drinstehen.

    mysql_real_escape_string betrifft *nur* die Verbindung mysql-client <-> mysql-server. In der Datenbank landen die Daten ohne die ganzen backslashes, die mysql_real_escape_string einführt. Deswegen braucht man bei prepared statements auch kein mysql_real_escape_string.



  • Hallo,

    danke für die Antworten allerding brauche ich ja noch die eintragung in die "GELD" spalte der Datenbank!

    denn die Formel soll ja gerechnet werden und wenn jetzt bei dem einen 150000 raus kommt und bei dem anderen 580 rein kommt soll das ja zu der Spalte "Geld" (im SQL) dazu Gerechnet werden und da das alles einmal täglich gemacht werden soll das wegen auch cronjob!

    und da ich nicht wegen jedem einzelennen die session abfragen will (sons wäre es mir viel leichter) will ich dass die Formel mit jedem einzelnen "betrag" berechnet wird und das ergebnis + dem Geld wieder in die DB geschrieben wird !

    mfg derdefeckter



  • Wie genau sieht jetzt deine tabelle aus.
    Versuch das mal ein klein bischen klarer zu vormulieren...
    Dann ists leichter...

    Du MÖCHTEST also das aus einer Tabelle (login)

    id | etage | lvl | geld

    Etage und lvl ausgelesen werden, alles multipliziert wird mit 580 und dann auf geld addiert wird? Und zwar für jeden user...

    $sql = "SELECT * FROM login";
    $result = mysql_query($sql);
    
    while($row = mysql_fetch_object($result))
    {
        $erg = ($row->etage * $row->lvl * 580) + $row->geld;
        $sql = "UPDATE login SET geld='".$erg."' WHERE id='".$row->id."'";
        mysql_query($sql);
    }
    

    ACHTUNG: Das ist keine musterlösung. Im gegenteil. Aber du möchtest ja auch selber noch was schaffen. So sollte es zwar funktionieren undgefähr (Nicht getestet), aber wenn du alles gelesen hast, fällt dir auf, das du sicherheitstechnisch noch was machen musst, und die Mysql Query nicht grade der schönste stiel sind. War jetzt auch nur schnell ausm kopf damit du das prinziep verstehst...

    EDIT: Was für sessions denn in nem Cronjob 😕



  • Christoph schrieb:

    Damit little bobby tables in der Datenbank auch seinen Platz findet, könnten ein paar mysql_real_escape_string-Aufrufe nicht schaden.

    Sicher, aber das war nicht die Frage :P! Antworte nur auf das, wonach du gefragt wirst, wurde mir vor langer Zeit mal beigebracht. Zumal mysql_real_escape_string('s) schon ewige Threads vorher mit "derdefeckter" ausdiskutiert wurden 😛

    LG



  • Hallo,

    Vielen dank für die Hilfe habe es jetzt so hinbekommen wie ich es wollte!

    mfg


Anmelden zum Antworten