Ankündigung

Einklappen
Keine Ankündigung bisher.

Gebäude_bau Ablauf

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Gebäude_bau Ablauf

    Hallöchen zusammen, da bin ich wieder

    Da ich gerade fleißig dabei bin programmieren zu lernen und meiner Ansicht für die kurze Zeit schon viel gelernt und auch verstanden habe, bin ich gerade dennoch auf ein Problem gestoßen was ich schon seit stunden am behandeln bin, nur leider komme ich nicht auf den Fehler.

    Ich habe um einfach mal die zusammenhänge zu lernen,

    einen Gebäude bau Ablauf programmiert, mein Problem an der ganzen Sache ist, daß meine UPDATE Funktion nicht wirklich etwas macht, ich könnte mir vorstellen, daß ich vielleicht die Query nicht richtig geschrieben habe, habe aber schon sämtliche Sachen ausprobiert und troz dem komme ich nicht zum gewünschten Ergebnis.

    Am Anfang prüfe ich, ob es eine Bauzeit gibt wenn nicht, dann wird geprüft, ob submit und die Anzahl zu bauender Gebäude gesetzt wurden.

    Wenn das alles ok ist ( soweit klappt das auch noch ) dann soll die Bauzeit mittels UPDATE in die Datenbank geschrieben werden und das wird leider nicht gemacht. Habe es auch schon mit INSERT INTO probiert, klapp im ersten Durchlauf auch, nur wenn ich dann nach abgelaufener Zeit noch etwas in Auftrag geben möchte, Probiert er natürlich mit INSERT INTO zu schreiben, dabei steht ja schon etwas in der Spalte drin.
    Nach Ablauf der Zeit, soll dann eben die vom User eingegebene Anzahl an Gebäude mit UPDATE auf das Gesamtkonto gutgeschrieben werden.

    Vom logischen denken her, kann es doch nur mit UPDATE richtig sein oder nicht ?

    Nur bleibt nach Bestätigung des Auftrags meine Spalte leider leer ( Fehlermeldung gibt es dann auch keine).

    Hier mal das Script dazu

    PHP-Code:
    <?php

    error_reporting
    (E_ALL);
    ini_set('display_errors'1);

    require_once (
    "../db_config.php");

    $sub_button = isset($_POST['submit']);
    $saegewerk_auftrag = isset($_POST['saegewerk']) ? trim($_POST['saegewerk']) : false;
    $getreidefarm_bau = isset($_POST['getreidefarm']) ? trim($_POST['getreidefarm']) : false;


    $aktuelle_zeit time();
    $saegewerk_bauzeit time()+30;


    $set_bauzeit = <<<SQL
    UPDATE
        `rohstoff_gebaeude`
    SET
        `saegewerk_bauzeit` = 
    $saegewerk_bauzeit
    SQL;


    $ende_auftrag = <<<SQL
    UPDATE
        `rohstoff_gebaeude`
    SET
        `saegewerk_gesamt` = ?
    SQL;


    $rest_bauzeit = <<<SQL
    SELECT
        `saegewerk_bauzeit`
    FROM
        `rohstoff_gebaeude`
    SQL;

    $restbauzeit $db_connect->prepare($rest_bauzeit);
    $restbauzeit->execute();
    $restbauzeit->bind_result($restzeit_saegewerk);
    $restbauzeit->fetch();

        if(
    $restzeit_saegewerk $aktuelle_zeit)
        {
            if(
    $sub_button || $saegewerk_auftrag)
            {
                
    $bauzeit $db_connect->prepare($set_bauzeit);
                
    $bauzeit->execute();


                    
    $bauzeit_ende $db_connect->prepare($rest_bauzeit);
                    
    $bauzeit_ende->execute();
                    
    $bauzeit_ende->bind_result($restbau_zeit);
                    
    $bauzeit_ende->fetch();

                        if (
    $restbau_zeit $aktuelle_zeit)
                        {
                            
    $saegewerk_gesamt $db_connect->prepare($ende_auftrag);
                            
    $saegewerk_gesamt->bind_param('i' ,$saegewerk_auftrag);
                            
    $saegewerk_gesamt->execute();
                        }
                    
    $bauzeit_ende->close();

                 
    $bauzeit->close();
            }
        }
        else
        {
            echo 
    "Momentan ist ein Auftrag in Bearbeitung !";
        }

    $restbauzeit->close();


    $db_connect->close();
    ?>
    Ps: habe auch schon probiert, die Variablen worin die Updatedaten drin stehen, mit ->bind_param zu übergeben, nur da bekomme ich dann eine Fehlermeldung sowas wie .... in a non object (hab gerade nicht die komplette meldung im Kopf ^^ )


  • #2
    Hallo Ascalon

    Dein Code sieht im grossen und ganzen ganz in Ordnung aus.
    Was mir auf den ersten Blick etwas komisch vorkommt, wie dein SQL Statements geschrieben sind.
    Würde dir dafür so eine Schreibweise vorschlagen:
    PHP-Code:
    $ende_auftrag "UPDATE `rohstoff_gebaeude` SET `saegewerk_gesamt` =  '"$saegewerk_auftrag ."' WHERE id = 1"
    Weiter benötigst du bei deinem UPDATE befehl noch eine WHERE Klausel ausser du möchtest alle Einträge Updaten.
    Alternativ wäre der INSERT Befehl wie folgt.
    PHP-Code:
    $ende_auftrag "INSERT INTO rohstoff_gebaeude (saegewerk_gesamt) VALUES ('"$saegewerk_auftrag ."'); 
    Weiter Funktioniert ein Update nur wenn du einen bestehenden Eintrag hast und du in diesem 1 bis alle Werte aktuallisieren möchtest.
    Ist kein Eintrag vorhanden musst du zuerst ein INSERT machen.

    Alternativ dazu könntest du dich auch über den REPLACE befehl Informieren. Ist eine INSERT/ UPDATE Kombination.

    Den Rest habe ich mal nicht weiter angeschaut, denke aber wenn du den INSERT und UPDATE Befehl richtig stellst sollte der Rest ganz einfach gehen.

    Kommentar


    • #3
      Hast du dir die Query schonmal ausgeben lassen und dann manuell in der Datenbank ausgeführt?


      Bzw. generell ein paar var_dumps reingehauen um den Programmablauf nachzugehen.
      Relax, you're doing fine.
      RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

      Kommentar


      • #4
        Danke für eure Antworten.

        Meine Query´s funktionieren ja, habe ich schon alles durch getestet, die REPLACE INTO Funktion sieht auch sehr nützlich aus, funktioniert auch was die Bauzeit betrifft ( kann das nur dafür nutzen ). Irgendwie hapert´s noch an meiner UPDATE Funktion, über ein stink normales Formular funktioniert das auch

        nur in meinem Fall, müsste ich für den ersten Eintrag das INSERT INTO benutzen und ab dem 2ten bzw. der nächsten Aufaddierung dann überprüfen ob schon ein Eintrag existiert, wenn ja dann die UPDATE, wenn nein dann die INSERT INTO Funktion.

        Werde ich mir morgen nochmal in Ruhe anschauen, programmieren macht ja echt Spaß aber es kann einem auch die Nerven rauben, denke gerade am Anfang, wenn man eh noch nicht alles kennt ^^

        PS: und klar werde ich auch die WHERE Funktion benutzen, nur momentan bin ich ja nur auf Testkurs, somit muss ich keinem eine ID zuweisen oder sonst was.
        Ansonsten wird die ID ja an den jeweiligen Account gebunden, daß sollte ja dann keine schwierige Sache sein

        Kommentar


        • #5
          Kannst du nochmal sagen welche Query genau schief läuft? Geprüft was auf dem Wert steht, der in die Tabelle soll?

          Übrigens könnte es sein, dass du ein ungünstiges Datenbank-Design hast, wenn du für die einzelnen Gebäude so Sachen wie "Gebäudex_bauzeit", "Gebäudex_bauzeit" in einer Tabelle hast.
          Stichwort: Normalisierung, so früh wie möglich bevor du eklige Workarounds schaffen musst.
          Relax, you're doing fine.
          RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

          Kommentar


          • #6
            Huhu

            Danke für den Tipp mit der "Normalisierung" , ich achte aber schon darauf das ich nicht alles in eine Tabelle schreibe, sondern etwas trenne.
            Natürlich wird es noch nicht perfekt sein aber das wird dann mit der Zeit kommen.
            Ich ärgere mich gerade mit meinem Script rum, mittlerweile sitze ich 2 Tage daran und es will einfach nicht so funktionieren wie es soll

            ich schreibe hier mal die Punkte vom Ablauf auf und weiße die anhand Kommentare dem Script zu, vll habt ihr da ne optimale Lösung:

            Spalten : id / saegewerk_auftrag / saegewerk_bauzeit / saegewerk_gesamt


            1. Gibt es schon eine Auftrags / Bauzeit .

            2. Wurde der Submit-Button und das Anzahl Feld gesetzt wenn ja, dann schreibe die Bauzeit ( Aktuelle Zeit + Bauzeit ) in die Tabelle sowie die Anzahl der in Auftrag gegebenen Sägewerke

            3. Schaue ob die Auftrags / Bauzeit kleiner als die Aktuelle Zeit ist, ist das der Fall dann Selectiere die Gesamtanzahl der fertigen Sägewerke

            4. Die Anzahl der Fertigen Sägewerke mit der Anzahl der gebauten addieren

            5. Trage die Neue Anzahl der Sägewerke in die Spalte : saegewerk_gesamt

            PHP-Code:
            <?php

            error_reporting
            (E_ALL);
            ini_set('display_errors'1);

            require_once (
            "../db_config.php");

            $sub_button = isset($_POST['submit']);
            $saegewerk_anzahl = isset($_POST['saegewerk']) ? trim($_POST['saegewerk']) : false;
            $getreidefarm_anzahl = isset($_POST['getreidefarm']) ? trim($_POST['getreidefarm']) : false;

            $aktuelle_zeit time();
            $saegewerk_bau_zeit $aktuelle_zeit 30;

            $saegewerk_restzeit = <<<SQL
            SELECT
                `saegewerk_bauzeit`
            FROM
                `rohstoff_gebaeude`
            SQL;


            $saegewerk_auftrag_start = <<<SQL
            REPLACE INTO
                `rohstoff_gebaeude`
                    (`saegewerk_auftrag` , `saegewerk_bauzeit`)
            VALUES
                (? , ?)
            SQL;


            $saegewerk_bauende = <<<SQL
            SELECT
                `saegewerk_gesamt`
            FROM
                `rohstoff_gebaeude`
            SQL;


            $saegewerk_auftrag_fertig = <<<SQL
            REPLACE INTO
                `rohstoff_gebaeude`
                    (`saegewerk_gesamt`)
            VALUES
                (?)
            WHERE
                `id` = 1
            SQL;



            # 1. Gibt es schon eine Auftrags / Bauzeit ?

            $start $db_connect->prepare($saegewerk_restzeit);
            $start->execute();
            $start->bind_result($start_auftrag_zeit);
            $start->fetch();

                if(
            $start_auftrag_zeit $aktuelle_zeit)
                {

            # 2. Wurde der Submit-Button und das Anzahl Feld gesetzt wenn ja,
            # dann schreibe die Bauzeit ( Aktuelle Zeit + Bauzeit ) in die Tabelle sowie die Anzahl der in Auftrag gegebenen Sägewerke.

                    
            if($sub_button || $saegewerk_anzahl)
                    {
                        
            $anfang_bau $db_connect->prepare($saegewerk_auftrag_start);
                        
            $anfang_bau->bind_param('ii' ,$saegewerk_anzahl ,$saegewerk_bau_zeit);
                        
            $anfang_bau->execute();
                        
            $anfang_bau->close();


            # 3. Schaue ob die Auftrags / Bauzeit kleiner als die Aktuelle Zeit ist,
            # ist das der Fall dann Selectiere die Gesamtanzahl der fertigen Sägewerke.

                            
            if($start_auftrag_zeit == $aktuelle_zeit)
                            {
                                
            $saegewerk_gesamt $db_connect->prepare($saegewerk_bauende);
                                
            $saegewerk_gesamt->execute();
                                
            $saegewerk_gesamt->bind_result($gesamt);
                                
            $saegewerk_gesamt->fetch();
                                
            $saegewerk_gesamt->close();

            # 4. Die Anzahl der Fertigen Sägewerke mit der Anzahl der gebauten addieren

                                    
            $saegewerk_alles $gesamt $saegewerk_anzahl;
                                    echo 
            $saegewerk_alles;

            # 5. Trage die Neue Anzahl der Sägewerke in die Spalte : saegewerk_gesamt

                                    
            if($gesamt 1)
                                    {
                                        
            $saegewerk_auftrag_fertig $db_connect->prepare($saegewerk_auftrag_fertig);
                                        
            $saegewerk_auftrag_fertig->bind_param('i' ,$saegewerk_alles);
                                        
            $saegewerk_auftrag_fertig->execute();
                                        
            $saegewerk_auftrag_fertig->close();
                                    }
                                    else
                                    {
                                        echo 
            "Eintrag fehlgeschlagen !";
                                    }


                            }
                            else
                            {
                                echo 
            "Auftrag wird bearbeitet ! ";
                            }
                     }
                }


            $start->close();



            $db_connect->close();

            ?>
            Ich bin soweit, das ich den Auftrag geben kann, die Anzahl vom Auftrag + die Bauzeit wird in die Datenbank geschrieben und in diesem falle laufen dann die 30 Sekunden runter.

            Ist die Bauzeit zuende, bleibt meine Spalte: saegwerk_gesamt leer und möchte ich nochmal einen Auftrag erteilen, springt das Script bis zum 2ten Block und gibt mir dann einen Fatal error

            Fatal error: Call to a member function execute() on a non-object in ... on line 70

            und trägt mir

            id: 1
            saegewerk_auftrag : 0
            saegewerk_bauzeit : 0
            saegewerk_gesamt : 0


            in meine Tabelle

            Kommentar


            • #7
              hab ich vll etwas im ablauf falsch ? .. ich kapier einfach nicht, warum es nicht funktioniert

              Kommentar


              • #8
                Ich vermute, da stimmt was mit einem prepare() nicht bzw. es kommt kein PDOStatement-/mysqli_stmnt-Objekt zurück.
                Welches ist denn Zeile 70 genau?


                btw. @Saneke
                Was mir auf den ersten Blick etwas komisch vorkommt, wie dein SQL Statements geschrieben sind.
                Würde dir dafür so eine Schreibweise vorschlagen:
                Seine Schreibweise ist durchaus korrekt: HereDoc / NowDoc
                Competence-Center -> Enjoy the Informatrix
                PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                Kommentar


                • #9
                  Nach Ablauf der Bauzeit werden mir die neu gebauten Saegewerke nicht gutgeschrieben und wenn ich dann nochmal einen Auftrag geben will, kommt dieser Fatal error und das ist dann die Zeile im Code:

                  PHP-Code:
                  $anfang_bau->bind_param('ii' ,$saegewerk_anzahl ,$saegewerk_bau_zeit); 
                  wie gesagt, meine Query´s funktionieren alle, vermute das ich etwas im Aufbau vom Ablauf falsch habe aber ich finde es einfach nicht raus

                  Kommentar


                  • #10
                    Teste mal was da passiert, bitte:
                    PHP-Code:
                    // nach dieser Zeile:
                    $saegewerk_gesamt $db_connect->prepare($saegewerk_bauende);

                    // letzten Fehler ausgeben lassen:
                    echo $db_connect->error;

                    // und btw. das:
                    var_dump$saegewerk_gesamt ); 
                    Competence-Center -> Enjoy the Informatrix
                    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                    Kommentar


                    • #11
                      oben kommt keine meldung und

                      PHP-Code:
                      var_dump$saegewerk_gesamt ); 
                      vor execute(); , spuckt mir NULL aus und nach execute ist alles ok bzw keine meldung


                      wie gesagt, setzen des submit wird die bauzeit und die anzahl welche ich eingegeben habe auch in die tabelle geschrieben, die 30 sekunden laufen auch runter, bzw laufen ins minus rein ( vll ist da irgendwo das problem ? )

                      Kommentar


                      • #12
                        Jo, dann bekommt er kein Statement zurück!
                        Da stimmt dann in dem Durchgang mit dem prepare() was nicht.
                        Competence-Center -> Enjoy the Informatrix
                        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                        Kommentar


                        • #13
                          sowas in der art hab ich mir auch schon gedacht, weil er ja nix zurück bekommt und somit mitten im prozess ist auch wenn man einen neuen auftrag starten will... aber kapier nicht wieso der rest nicht ausgeführt wird wenn ich schreibe

                          PHP-Code:
                          if ($start_auftrag_zeit == $aktuelle_zeit)
                          {
                             
                          # ..... dann schreibe die gesamt anzahl in die tabelle 

                          Kommentar


                          • #14
                            Kleiner Tipp am Rande, setzt beim Verbindungsaufbau:

                            PHP-Code:
                            $db_connect->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION); 
                            Damit ersparst du dir das Fehler suchen. Standardmässig läuft die Fehlerbehandlung bei PDO über den Rückgabewert der ausgewertet werden muss. Das ist aber Sackgang, keiner will für jeden einzelnen Query eine eigene Fehlerbehandlung schreiben. Mit der Zeile oben wird die Fehlerbehandlung auf Exceptions umgestellt. Bei einem Fehler trit dann eine Exception auf, damit gehen keine Fehler unter und du kannst problemlos gezielt einzelne Fehler behandeln oder einfach alle.

                            Kommentar


                            • #15
                              PHP-Code:
                              if ($start_auftrag_zeit == $aktuelle_zeit
                              Diese Bedingung trifft nur in einer ganz bestimmten Sekunde zu, das dürfte schwer zu timen sein...
                              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                              Kommentar

                              Lädt...
                              X