kostenloser Webspace werbefrei: lima-city


MySQL Datensätze verschieben

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    tobilektri

    tobilektri hat kostenlosen Webspace.

    Hallo erstmal,
    Ich arbeite im Moment für eine Freiwillige Organisation an einem "Online-Wachplan".
    Da gibt es ein Skript, welches jede Stunde 1 mal aufgerufen wird (Auto) in welchem überprüft werden soll, ob sich in der Tabelle Datensätze befinden, welche nicht mehr dem heutigen Datum entsprechen.
    Diese sollen aus der Tabelle "Wachplan" in die Tabelle Wachplan-old verschoben werden.

    Versucht habe ich bisher:
    <?php require_once ('konfiguration.php'); 
    $db_link = mysqli_connect (
                         MYSQL_HOST, 
                         MYSQL_BENUTZER, 
                         MYSQL_KENNWORT, 
                         MYSQL_DATENBANK
                        );
     
    $timestamp = time();
    $datum = date("Y-m-d",$timestamp);
    echo $datum;
    echo "<br>";
     
    $sql = <<<END
    INSERT INTO dienstplan-old SELECT * FROM Dienstplan WHERE Datum != $datum
    END;
     
    $db_erg = mysqli_query( $db_link, $sql );
    if ( ! $db_erg )
    {
      die('Ungültige Abfrage: ' . mysqli_error());
    }
    {
    	echo "Glückwunsch :)";
    }
    ?>

    und
    <?php require_once ('konfiguration.php'); 
    $db_link = mysqli_connect (
                         MYSQL_HOST, 
                         MYSQL_BENUTZER, 
                         MYSQL_KENNWORT, 
                         MYSQL_DATENBANK
                        );
     
    $sql = "SELECT Datum FROM dienstplan";
    $timestamp = time();
    $datum = date("Y-m-d",$timestamp);
    echo $datum;
    echo "<br>";
    $not_heute = <<<END
    INSERT INTO dienstplan_old VALUES ((SELECT * FROM dienstplan))
    END;
     
    $db_erg = mysqli_query( $db_link, $sql );
    if ( ! $db_erg )
    {
      die('Ungültige Abfrage: ' . mysqli_error());
    }
     
    echo '<table border="1">';
    while ($zeile = mysqli_fetch_array( $db_erg, MYSQL_ASSOC))
    {
      echo "<tr>";
      echo "<td>". $zeile['Datum'] . "</td>";
      if ($zeile['Datum'] != $datum)
    {
    	echo $copy = mysqli_query($db_link, $not_heute);
    }
    else
    {
    	echo "Heute!<br>";
    }
     
      echo "</tr>";
    }
    echo "</table>"; 
    mysqli_free_result( $db_erg );
     
    ?>


    Funktioniert hat keins...
    Bei ersterem kommt dieser Fehler
    Warning: mysqli_error() expects exactly 1 parameter, 0 given in C:\xampp\htdocs\wawa\new\index2.php on line 22
    Ungültige Abfrage:


    Jemand sonst noch eine Idee bzw. eine Lösung für mein Problem?

    LG und Danke schonmal,

    Tobi
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. mein-wunschname

    mein-wunschname hat kostenlosen Webspace.

    Du kannst nicht einfach PHP-Code mit SQL-Anweisungen mischen

    $sql = <<<END
    INSERT INTO dienstplan-old SELECT * FROM Dienstplan WHERE Datum != $datum
    END;


    gibt es in PHP nicht. Einen SQL-Query String definierst du mit

    $sql = "INSERT INTO ....."

  4. doch doch, das gibt es schon, siehe http://www.php.net/manual/de/language.types.string.php im Bereich heredocs und nowdocs, aber keine Ahnung für was das gut sein soll, es ist aber nicht die Ursache des Fehlers.

    Als erstes würde mich noch interessieren, warum "alte Datensätze" in eine andere Tabelle verschoben werden sollen. Das macht datenbanktechnisch nur sehr selten Sinn, deshalb gibt es wohl auch keine 0815-Funktionen um dies zu bewerkstelligen.

    Aber nun zu einem Problem/Fehler:
    Das erste Beispiel erzeugt einen Fehler, weil die Funktion mysqli_error zusätzlich die Verbindung benötigt, also mit:
    die('Ungültige Abfrage: ' . mysqli_error($db_link));

    wirds funktionieren und du erhälst die Sql-Fehlermeldung zurück.

    Das zweite Beispiel funktioniert nicht da du ein misch masch gemacht hast:
    1. alle Datensätze selektieren (ist schon mal von der Performance nicht optimal)
    2. Schleife in welcher alle Datensätze durchlaufen werden, ist das Datum != heute, dann wird folgender Befehl ausgeführt:
    INSERT INTO dienstplan_old VALUES ((SELECT * FROM dienstplan)) => hier stellt sich nun für SQL die Frage, was denn eingefügt werden soll, es besteht nämlich weder für SQL noch für PHP zu diesem Zeitpunkt ein logischer Zusammenhang zwischen dem aktuellen Datensatz in der Schleife, dem SQL-Ergebnis und deiner Abfrage.

    Ich würde dies so lösen:
    1. Nur Datensätze selektieren, welche nicht heute sind, alle zu kopierenden Felder in die Abfrage nehmen (also SELECT id, datum, benutzer ..... FROM dienstplan WHERE datum != heute)
    2. Schleife, welche selektierte Datesätze durchläuft und ..
    ... 1: den Datensatz mittels INSERT in die dienstplan_old einfügt (INSERT INTO dienstplan_old (old_id,datum,benutzer....) VALUES ($zeile['id'],$zeile['datum'],$zeile['benutzer']...
    ...2: wenn erfolgreich eingetragen, den Datensatz aus Tabelle dienstplan löschen (DELETE FROM dienstplan WHERE id = $zeile['id'])

    Aber wie schon gesagt, besser wäre, wenn die Datensätze in der Tabelle dienstplan verbleiben könnten und einfach an jeder Stelle im Programm nur jene selektiert werden, die effektiv benötigt werden.

    Gruess
    Meron
  5. Autor dieses Themas

    tobilektri

    tobilektri hat kostenlosen Webspace.

    meron schrieb:Ich würde dies so lösen:
    1. Nur Datensätze selektieren, welche nicht heute sind, alle zu kopierenden Felder in die Abfrage nehmen (also SELECT id, datum, benutzer ..... FROM dienstplan WHERE datum != heute)
    2. Schleife, welche selektierte Datesätze durchläuft und ..
    ... 1: den Datensatz mittels INSERT in die dienstplan_old einfügt (INSERT INTO dienstplan_old (old_id,datum,benutzer....) VALUES ($zeile['id'],$zeile['datum'],$zeile['benutzer']...
    ...2: wenn erfolgreich eingetragen, den Datensatz aus Tabelle dienstplan löschen (DELETE FROM dienstplan WHERE id = $zeile['id'])

    Das ist mir jetzt zu hoch :confused::confused:

    Das soll in die andere Tabelle, da am ende des tages eine liste erzeugt werden soll, wer heute wie lange da war, und unter dem Login (sozusagen) eine liste stehen soll wer da ist
    Oder kann man das auch einfacher lösen? :O

    LG
  6. Ja klar kann man :-)

    Und zwar musst du nur die Suche einschränken:
    z.B. bei der Liste, wer heute da war, müsste der SQL-Befehl wie folgt lauten:
    SELECT [felder] FROM dienstplan WHERE datum = CURRENT_DATE()


    So werden alle Datensätze aus der DB selektiert, welche beim Datum das heutige Datum eingetragen haben.

    Folgendes (ungetestet) sollte die gewünschte Funktion haben (also Ausgabe aller Datensätze mit datum = heute):
    <?php require_once ('konfiguration.php'); 
    $db_link = mysqli_connect (
                         MYSQL_HOST, 
                         MYSQL_BENUTZER, 
                         MYSQL_KENNWORT, 
                         MYSQL_DATENBANK
                        );
     
    $sql = "SELECT Datum FROM dienstplan WHERE datum = CURRENT_DATE()";
    
    echo "<br>";
     
    $db_erg = mysqli_query( $db_link, $sql );
    if ( ! $db_erg )
    {
      die('Ungültige Abfrage: ' . mysqli_error($db_link));
    }
     
    echo '<table border="1">';
    while ($zeile = mysqli_fetch_array( $db_erg, MYSQL_ASSOC))
    {
      echo "<tr>";
      echo "<td>". $zeile['Datum'] . "</td>"; 
      echo "</tr>";
    }
    echo "</table>"; 
    mysqli_free_result( $db_erg );
     
    ?>


    Wer wir lange da war?
    Einfach wiederum selektieren wer heute da war (siehe oben) und entsprechend in der PHP-Schleife die Zeitdauer berechnen.

    Ist wesentlich einfacher als die Datensätze immer hin und her zu schaufeln :-)
    Zudem sind so auch Auswertungen (wer war diesen Monat da? Wer war wie oft da? Wer war da vom 04.09.-10.11.?) wesentlich einfacher, da mit deiner ersten Version zweimal ein Selekt abgesetzt (einmal in der dienstplan und einmal in der dienstplan_old Tabelle) und anschliessend deren Resultate in PHP zusammengezogen werden müssten.

    Ich empfehle dir noch ein paar Tutorials zu mysql (resp. generell SQL und Relationalen Datenbanken) zu machen, das hilft dir sicher ungemein ;-)

    Gruess
  7. Autor dieses Themas

    tobilektri

    tobilektri hat kostenlosen Webspace.

    Ok danke ich probier's dann mal aus und kennst du ein paar gute tutorials?
    D.h. ich lösche jetzt die wachplan-old und belasse das alles in einer Tabelle?
    Wir die Datenbank nicht langsam wenn da dann 1200(Zeilen)*10 (Spalten) Einträge drin sind?
    LG und danke,
    Tobi
  8. Hi Tobi

    Kurzum ja, die wachplan_old benötigst du nicht, da alles in der anderen Tabelle belassen wird.
    Eine Liste von Tutorials findest du hier:
    http://www.lima-city.de/thread/php-mysql-links (etwas weiter unten sind die Sql-Tutorials)
    Ich selber habe es (zusammen mit PHP) dazumals mit diesem Tutorial gelernt:
    http://www.php-kurs.com/

    Die 1200 Zeilen sind überhaupt kein Problem für die Datenbank.
    Ich selber habe Tabellen mit über 10'000 Einträgen und es läuft sehr schnell, ich habe auch schon von Tabellen mit über einer Million Datensätzen gelesen (weil ich mich zu dieser Thematik auch schon erkundigte) wo mysql auch sehr schnell unterwegs sein soll, allerdings finde ich dazu keine passenden Quellen mehr.
    Aber kurz gesagt: mit 1'200 Datensätzen bist du noch sehr gut dabei ;-)

    Gruss
    meron
  9. nur ordnungshalber!
    mein-wunschname schrieb:
    Du kannst nicht einfach PHP-Code mit SQL-Anweisungen mischen
    $sql = <<<BLAA
    ...
    BLAA;
    gibt es in PHP nicht. Einen SQL-Query String definierst du mit
    $sql = "INSERT INTO ....."
    die syntax ist gold richtig, es handelt sich um keinerlei art von mischen. bevor du jemanden irreführst, soltest selbst nachlesen (falls nötig). ein minus wäre angebracht - aufpassen ist besser ;)

    meron schrieb:
    ... (im Bereich heredocs und nowdocs,) aber keine Ahnung für was das gut sein soll, es ist aber nicht die Ursache des Fehlers. ...


    'heredoc' ist eigentlich eine zuweisung einer vorformatierten textes zu einer wariable. 'nowdoc' ist einer der vielen sonderbarkeiten von php. eigentlich recht unnötig. der einzige unterschied zu heredoc ist, dass die öffnende marke zwischen anführungszeichen ist (nich aber die schließende)
    $var = <<<'EOT'
    ...
    EOT;
    am jetzigen beispiel wäre dann eine sinnvolle andwendung von heredoc diese:
    $query = <<<EOT
    /*
    	abfrage der heutigen daten von der tabelle 'dienstplan'
    	v0.00.01 2014-07-07
     */
    SELECT Datum
    	FROM dienstplan
    	WHERE datum=CURRENT_DATE()
    EOT;
    $db_res = mysqli_query($db_link, $query);
    und was bringt das dem geplagten progger? erstens, dein query ist documentiert. interessant ist es natürlich erst ab paar kb größe. weiters, du hast dich vertippt! du hast 'datzum' geschrieben, die spalte gibtt es aber nicht. dann kommt die fehlermeldung von mysql 'Error in ... blaaa ... in der nähe von blaaaa in zeile 7' . wenn du jetzt eine einzeiler query hast steht dort in 'zeile 1'. blöd ist nur, dass zeile 1 etwas länger geraten kann. no dann 'such ahoj' nach der stelle! außerdem ist schöner zum lesen.

    so viel zu heredoc. an sonsten ist merons lösung durchaus begehbar.
  10. Autor dieses Themas

    tobilektri

    tobilektri hat kostenlosen Webspace.

    Ok, soweit funktioniert es jetzt!
    Danke!
    Jetzt hab ich ein neues Problem:
    Warning: mysqli_error() expects exactly 1 parameter, 0 given in C:\xampp\htdocs\wawa\new\wl.php on line 55
    Anfrage fehlgeschlagen:

    Der COde:
    <html>
    <head><title>Verarbeite...</title></head>
    
    <?php
    //error_reporting(0);
    
    require_once ('konfiguration.php'); 
    $db_link = mysqli_connect (
                         MYSQL_HOST, 
                         MYSQL_BENUTZER, 
                         MYSQL_KENNWORT, 
                         MYSQL_DATENBANK
                        );
    //Alle variablen mit 0 Füllen
    $vorname1 = "0";
    $vorname2 = "0";	
    $vorname3 = "0";
    $uhr = "0";
    $idges = "0";
    $userals = "0";
    $datum = "0";
    $sql = "0";
    //Jetzt Uhrzeit eintragen - userbeginn
    $timestamp = time();
    $uhr = date("H:i:s",$timestamp);
    echo $uhr;
    
    //echo "<br>";
    //error_reporting(0);
    
    //User-id abfangen aus dem Formular
    $vorname1 = $_POST["leiter1"];
    //echo $vorname1;
    //echo "<br>";
    $vorname2 = $_POST["leiter2"];
    //echo $vorname2;
    //echo "<br>";
    $vorname3 = $_POST["leiter3"];
    //echo $vorname3;
    
    $idges = $vorname1 + $vorname2 + $vorname3;
    echo $idges;
    echo "</br>";
    //User in wl.php automatisch wachleiter
    $userals = "Wachleiter";
    //Datum 
    $datum = date("Y-m-d",$timestamp);
    //echo $datum;
    
    
    //INSERT INTO wachplan 
    $sql = "INSERT INTO dienstplan (user-id, userbeginn, userals, Datum) VALUES ('$idges', '$uhr', '$userals', '$datum')";
    //$sql = "INSERT INTO `dienstplan` (`user-id` , `userbeginn` , `userals` , `Datum`) VALUES ($idges , $uhr, $userals, $datum);";
    $db_erg = mysqli_query($db_link, $sql) 
    	or die("Anfrage fehlgeschlagen: " . mysqli_error());
    
    ?>
    </body>
    </html>

    Da ich hoffnungslos bei der Fehlersuche 2,5 Stunden verbracht habe und irgendwie zu doof bin irgendwas zu finden hoffe ich mal (wieder) auf eure Hilfe :)

    Würde mich freuen, wenn wir auch dieses Problem gelöst bekommen.

    LG,
    Tobi
  11. Hallo,

    was genau verstehst Du nicht? Kannst Du die Fehlermeldung nicht übersetzen oder woran scheitert es?
    Beim Aufruf der Funktion mysqli_error() wurde ein Parameter erwartet, aber es wurden 0 (also kein) Parameter übergeben. Und wenn Du in den Code hinein schaust, Zeile 55, da wird tatsächlich kein Parameter übergeben.

    Lösen kannst Du dein Problem, indem Du folgende Änderung am Script in Zeile 55 vornimmst...
    Zitat von http://php.net/manual/de/mysqli.error.php

    Objektorientierter Stil
    string $mysqli->error;

    Prozeduraler Stil
    string mysqli_error ( mysqli $link )

    $db_erg = mysqli_query($db_link, $sql) 
    	or die("Anfrage fehlgeschlagen: " . $db_link->error);
    oder
    $db_erg = mysqli_query($db_link, $sql) 
    	or die("Anfrage fehlgeschlagen: " . mysqli_error($db_link));
  12. Autor dieses Themas

    tobilektri

    tobilektri hat kostenlosen Webspace.

    Ok, danke :D
    Super :thumb:
    Noch eine andere Frage, ich will aber kein neues Thema erstellen.
    Wie kann ich aus einem Dropdown-Feld
    <form action="wmann.php" method="post">
    <input type="text" size="15" maxlength="3" placeholder="Deine ID" name="wachmann">
    <!-- Auswahl als was eintragen und im nächsten script (wmann.php) überprüfung -->
    <select name="alswas">
     <option value="Boot">Bootführer</option>
     <option value="Taucher">Taucher</option>
     <option value="Schwimmer">Rettungsschwimmer</option>
     <option value="Passiv/Jugend">Passiv/Jugend</option>
    </select>
    <input type="submit" value="Anmelden">
    </form>

    Wie bekomme ich es hin dass ich in der wmann.php
    in der Variable "$alswas" das richtige ausgewählte Value stehen habe?

    Danke,
    TObi
  13. Hoi Tobi

    Da du im Form-Element die Methode "post" wählst, ist dies anschliessend $_POST['alswas'].
    Diese enthält den "Value" der gewählten Option.

    Also konkret:
    $alswas = $_POST['alswas'];


    Gruss


    Beitrag zuletzt geändert: 8.7.2014 23:29:03 von meron
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!