[Apache, phpmyadmin, html, PHP, ...] Datenbank mit webbasiertem Zugriff erstellen

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
Ja, so sieht's aus, aber wo???

Das müsste dann hierin sein:
PHP:
foreach ($taetigkeiten as $key => $taetigkeit) {
    if ($key == $row_taet[0]) {
       echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
   } else {
       echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
   }
}
Nur das Ding gibt das Tätigkeiten-Dropdown aus.
 
HTML:
<!doctype html><html>  <head>    <title>Projektzeiterfassung - Projektzeiterfassung</title>    <meta charset="utf-8">    <link rel="stylesheet" type="text/css" href="style.css">  </head>  <body>    <div class="submit">      <form action="index.php?section=pze" method="post">        <h1>Projektzeiterfassung</h1><table>  <tr>    <td colspan="10" class="head_cap">      <table style="width:100%; border:none; background-color:#A9F5BC;"><tr>        <td style="border:none" align="left"><input type="submit" value="<<" name="prevWeek" class="switch"></td>        <td style="width:90%; border:none; text-align:center">            Kalenderwoche 42: 13.10.2014 - 19.10.2014            <input type="hidden" value="1413194400" name="wa">            <input type="hidden" value="1413712800" name="we">          </td>        <td style="border:none" align="right"><input type="submit" value=">>" name="nextWeek" class="switch"></td>      </tr></table>    </td>  </tr>    <tr>
                <th>Tätigkeit</th>
                <th>Produkt</th>
                <th>Beschreibung</th>
                <th width="150">MO</th>
                <th width="150">DI</th>
                <th width="150">MI</th>
                <th width="150">DO</th>
                <th width="150">FR</th>
                <th width="150">SA</th>
                <th width="150">SO</th>    </tr>Taetigkeiten: Array
(
    [1] => A...

    [2] => A...

    [3] => E...

    [4] => O...

    [5] => P...

    [6] => P...

    [7] => S...

    [8] => S...

    [9] => S...

    [10] => S...

    [11] => V...

)
<tr><td><select name="taetigkeit1"><option value="A">A</option><option value="A">A</option><option value="E">E</option><option value="O">O</option><option value="P">P</option><option value="P">P</option><option value="S">S</option><option value="S">S</option><option value="S">S</option><option value="S">S</option><option value="V">V</option></select></td><td><select name="product1"><option value="R">R</option><option value="R">R</option><option value="R">R</option><option value="G">G</option><option value="M">M</option><option value="M">M</option><option value="R">R</option><option value="R">R</option><option value="R">R</option><option value="R">R</option><option value="C">C</option><option value="C">C</option><option value="C">C</option><option value="T">T</option><option value="V">V</option><option value="O">O</option><option value="O">O</option><option value="O">O</option><option value="M">M</option><option value="G">G</option><option value="-">-</option></select></td><td><input name="beschreibung1" type="text" size="50" maxlength="250"></td> <td><input type="text" name="1413194400_1" maxlength="6" size="4"></td> <td><input type="text" name="1413280800_1" maxlength="6" size="4"></td> <td><input type="text" name="1413367200_1" maxlength="6" size="4"></td> <td><input type="text" name="1413453600_1" maxlength="6" size="4"></td> <td><input type="text" name="1413540000_1" maxlength="6" size="4"></td> <td><input type="text" name="1413626400_1" maxlength="6" size="4"></td> <td><input type="text" name="1413712800_1" maxlength="6" size="4"></td></table><br><div class="submit">  <input type="submit" style="height:24px; width:130px" name="addLine" value="+ Zeile hinzufügen">  <input type="submit" style="height:24px; width:130px" name="remLine" value="- Zeile entfernen">  <input type="hidden" name="add" value="1"></div><br><div class="submit"><input type="submit" name="confirm" value="Bestätigen"> Schreibt Einträge in Datenbank ...</div><br><br><br><div class="submit">Einträge anzeigen ...  <input type="submit" style="height:24px; width:65px" name="auswerten" value="eigene">  <input type="submit" style="height:24px; width:65px" name="auswertenall" value="alle">         <br><br><input type="submit" name="logout" value="Ausloggen">      </form>    </div>  </body></html>
Das Ding in der Mitte ist noch von meinem print_r (da habe ich die vollständigen Namen zensiert), das gehört normal nicht rein. Und dann kommen eben die Dropdowns mit den Anfangsbuchstaben.

BTW sehe ich auch gerade selbst, dass ja auch der $key (value) totaler Pfusch ist! Das sollten int-Zahlen (ergo Feldindexe) sein, nicht auch die Anfangsbuchstaben!
 
Zuletzt bearbeitet:
^^ Hat sich gerade erledigt: Das Problem war, dass ich über den EDIT-Button zu projektzeiterfassung.php gekommen bin. Dadurch hat er nicht den eigentlichen Ausgabecode gesehen, sondern den von der editierbaren Zeile, wo ich das noch nicht auf $key umgebaut hatte.

Jetzt habe ich das Programm neugestartet und ALLES umgebaut. Jetzt stimmt das mit den ganzen $keys, IDs, ... :) *schwere Geburt :fresse:*
-----------

Damit bleibt uns erstmal nur noch das Problem mit der $dauer, wobei ich vorhin festgestellt habe, dass BenRo und ich da die selbe Vermutung haben:
Das Problem ist eine Kombination aus
- In $_POST['ts'] steht kein Integer (sondern vermutlich nichts/NULL)
- Um $dauer sind im Query keine Anführungszeichen
Wenn du "UPDATE zeiten SET zeit = '$dauer'... draus machst, wird zumindest der Query durchlaufen und keinen Fehler verusachen, das ist doch schonmal was
Das mit $dauer ist auch irre! Obwohl's ne Zahl ist, kriege ich den query-Fehler wenn ich es ohne Hochkomma schreibe. Schreibe ich allerdings '$dauer', läuft das query plötzlich durch, aber die Zeiten in der DB werden immer noch nicht geupdatet. :(
Stattdessen wandelt er alle Zeiten dieses Eintrags in 0 um. Kann das sein, dass '$dauer' als leerer aber auch funktionierender String gewertet wird, der dann die Zeitwerte mit 0 überschreibt?
projektzeiterfassung.php
PHP:
for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
                    $time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$j]."';");
                    $row_time = mysqli_fetch_row($time_id);
                    echo $wochentag.'<br>';
                    echo '<td><input type="text" name="ts['.$wochentag.']" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                }
formular.php
PHP:
for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    $dauer = $_POST['ts['.$ts.']'];
                    mysqli_query($mysqli, "UPDATE zeiten SET zeit = '$dauer' WHERE taetprodid = '".$_SESSION['prid']."' AND datum = $ts;") or die ("Update 'zeiten' fehlgeschlagen.<br>".mysqli_error());
                }
 
mach mal bitte testweise aus if ($key == $row_taet[0]) { ein if ($key == $row_taet) { oder eher ein if ($key == $row_taet['taetigkeit']) {
 
^^ Mal kurz dazwischen gesagt: Ich habe exkl. dem Resttag von heute noch 3 Tage bis das Projekt endgültig fertig sein muss. Nachdem wir bei der $dauer gerade anzustehen scheinen, mal was anderes ...

Einen letzten Wunsch hat der Auftraggeber gestern noch geäußert: Es soll unter der Datensätze-Tabelle noch eine Tabelle mit den Mitarbeitern ausgegeben werden. War auch easy umzusetzen, habe ich gestern in 10 Minuten schnell hingebastelt (dazu brauchte ich btw auch die Vornamen und Nachnamen in der Registrierung dazu). Einzig eines ist mir davon übergeblieben: Die Passwörter sollen als Klartext angezeigt werden, falls ein MA seines vergisst, damit der Admin dann nachschauen kann. Derzeit habe ich sie noch verschlüsselt aus der DB ausgelesen.

Unbenannt.PNG

Insgesamt bleiben jetzt also noch 4 Dinge, von denen die ersten beiden Pflicht und die letzten beiden optional sind (bzw. das dritte ist zwar auch "Pflicht", ließe sich aber simple lösen):

1) $dauer richten.

2) Unterscheidungskriterium für INSERT/UPDATE finden. Eventuell brauche ich dann auch noch eine kleine zusätzliche Überprüfung, ob beim "updaten" ein Wert überschrieben werden, oder ein leeres Feld erstmalig befüllt werden soll?! Oder müsste ich dafür das alles nochmal grundlegend umbauen:
PHP:
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
            
            /*if (!isset($_POST['edit'])) {
                echo "EINTRAGEN";
                mysqli_query($mysqli, "INSERT INTO projekte (taetigkeit, produkt, userid, beschreibung, erstellt) VALUES ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt');");
                $taetprodid = mysqli_insert_id($mysqli);
                
                for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                        $dauer = $_POST[$ts.'_'.$a];
                        mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts');");
                    }
                }
            } else {*/      
                mysqli_query($mysqli, "UPDATE projekte SET taetigkeit = '".$_POST['taetigkeit']."', produkt = '".$_POST['product']."', beschreibung = '".$_POST['beschreibung']."' WHERE id = '".$_SESSION['prid']."';") or die ("Update 'projekte' fehlgeschlagen.<br>".mysqli_error());
                for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    $dauer = $_POST['ts['.$ts.']'];
                    mysqli_query($mysqli, "UPDATE zeiten SET zeit = '$dauer' WHERE taetprodid = '".$_SESSION['prid']."' AND datum = $ts;") or die ("Update 'zeiten' fehlgeschlagen.<br>".mysqli_error());
                }
            }          
        }
    //}
3) PWs als Klartext ausgegeben kriegen.

4.) +/- Zeile-Buttons eventuell löschen und mehrere Zeilen fix anzeigen.

^^ Wenn 1.) gerade nicht geht, können wir uns vielleicht bis uns was einfällt einen der anderen Punkte überlegen?! 2.) geht schlecht, weil das mit 1.) zusammenhängt. Bei 3) wär's halt die "Idiotenlösung", die PWs von Anfang an unverschlüsselt in der DB zu speichern. Aber geht das auch schlauer? Jedenfalls gibt's keine Funktion um unseren Hash zu knacken (was ja auch gar nicht der Sinn der Sache wäre).

[EDIT]
@ DarkMo
Habe dein Posting erst jetzt gesehen. Bezieht sich das noch auf das vorige Problem? Wenn ja, das haben wir bereits gelöst. Es läuft jetzt mit $row_taet[0] völlig korrekt. Oder geht's bei deiner Frage noch um irgendeine Optimierung?
 
Zuletzt bearbeitet:
ging noch um den anfangsbuchstaben. is ja gut, wenns nu läuft. wegen den pw's... wie solln das gehn? xD du kannst dem admin höchstens ne funktion anbieten, dem mitarbeiter ein neues pw zu generieren, dass er dann dem MA gibt. dieser bräuchte dann natürlich noch ne funktion, das pw zu ändern. alles andere ist ein enormes sicherheitsrisiko (ich weis, is bei dir nich so wild, aber da rollt sich einem trotzdem alles zusammen ^^).
 
Was ist denn schlimm dran, wenn der Admin die PWs als Klartext sieht? Wenn er der einzige ist, ist eh gleich klar wer's gewesen sein muss, wenn was böswillig verstellt wurde. Aber egal ...

Jedenfalls sehe ich nur 2 Möglichkeiten:
a) Die PWs gleich unverschlüsselt in die DB speichern, dann kann man sie auch ohne Umstände unverschlüsselt wieder auslesen.
b) Sowas:

formular.php
Code:
[COLOR=royalblue]$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);    
    
    if (isset($_POST['btnLog'])) {
        $username = $_POST['username'];
        $erg = mysqli_query($mysqli, "SELECT * FROM user WHERE name='".$username."'");
        $row = mysqli_fetch_object($erg);
        [COLOR=seagreen]//$password = hash('sha512', ($_POST['password']).$salt);        [COLOR=royalblue]$password = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, hash('sha256', $salt), $_POST['password'], MCRYPT_MODE_ECB, $iv);        if ($row->passwort == $password) {
            $_SESSION['name'] = $username;
            $_SESSION['id'] = $row->id;
            $_SESSION['rechte'] = $row->rechte;
            $_SESSION['ip'] = $ipadresse;
            $_SESSION['last_on'] = $now[0];
            
            $user = $username;
            $userid = $row->id;
            $rechte = $row->rechte;

            $site_title = 'Projektzeiterfassung';
            $section = 'pze';
        [COLOR=red]} else {
            $protokoll .= '- Benutzername und/oder Passwort waren falsch oder nicht registriert.<br>';        }
    }
    
    if (isset($_POST['logout'])) {
        $site_title = "Login";
        logout();
    }
    
    if (isset($_POST['btnReg'])) {
        if (isset($_POST['vorname'], $_POST['nachname'], $_POST['username'], $_POST['password'], $_POST['password2']) and trim($_POST['vorname']) != "" and trim($_POST['nachname']) != "" and trim($_POST['username']) != "" and trim($_POST['password']) != "" and trim($_POST['password2']) != "") {
            $vorname = $_POST['vorname'];
            $nachname = $_POST['nachname'];
            $username = $_POST['username'];
            $passwort = $_POST['password'];
            $passwort2 = $_POST['password2'];
            if ($passwort != $passwort2) {
                $protokoll .= '- die Bestätigung des Passworts stimmt nicht.<br>';
                $_POST['btnRegForm'] = true;
                unset($_POST['btnReg']);
                $site_title = "Registrieren";
            } else {
                [COLOR=seagreen]//$passwort = hash('sha512', ($passwort).$salt);                [COLOR=royalblue]$passwort = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, hash('sha256', $salt), $_POST['password'], MCRYPT_MODE_ECB, $iv);                if ($username == "test") {
                    $rechte = 0;
                } else {
                    $rechte = 1;
                }
auswerten2.php
Code:
echo '<table>';
    echo '    <tr>';
    echo '      <th>Username</th>
                <th>Vorname</th>
                <th>Nachname</th>
                <th>Passwort</th>';
    echo '      </tr>';
    $mitarbeiter = array();
    $res_m = mysqli_query($mysqli, "SELECT * FROM user;") or die ("Get Mitarbeiter fehlgeschlagen.<br>".mysqli_error());
    if (mysqli_num_rows($res_m)) {
        while ($row_m = mysqli_fetch_assoc($res_m)) {
            $mitarbeiter[count($mitarbeiter)] = $row_m;
        }
    }
    foreach ($mitarbeiter as $mitarbeiter_sg) {
        echo '    <tr>';
        echo '        <td>'.$mitarbeiter_sg['name'].'</td>';
        echo '        <td>'.$mitarbeiter_sg['vorname'].'</td>';
        echo '        <td>'.$mitarbeiter_sg['nachname'].'</td>';
        [COLOR=royalblue]$pw_clear = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, hash('sha256', $salt), $mitarbeiter_sg['passwort'], MCRYPT_MODE_ECB, $iv);
        echo '        <td>'.$pw_clear.'</td>';        [COLOR=seagreen]//echo '        <td>'.$mitarbeiter_sg['passwort'].'</td>';        echo '    </tr>';
    }
    echo '</table><br>';
^^ Funktioniert allerdings eh nicht wie's sollte. Ich kann zwar MAs registrieren, aber beim Login-Versuch danach läuft er mir ins rote else: "Benutzername und/oder Passwort waren falsch oder nicht registriert"

Im $iv ist irgendwas RANDom-mäßiges drinnen. Ich vermute, dass der beim Login irgendwas neu generiert und der Vergleich der Verschlüsselungen dadurch fehlschlägt?!
--------------

Wichtiger als das wäre aber wirklich die EDIT-Funktion noch fertig zu kriegen. 1.) und 2.)

[EDIT]
Hab's schon, auch wenn ich's (noch) nicht gänzlich verstehe: Der Schlüssel darf nur $salt sein, kein hash('sha256', $salt) über den $salt. Eigentlich müsste es egal sein, weil der Schlüssel für den Rijndael in beiden Fällen eine Zeichenfolge wäre. Aber vielleicht generiert der hash irgendwas, das dann nicht gleich ist, sobald's um einen Vergleich ginge?! Wie ich das oben schon vermutet hatte.

Jedenfalls läuft's jetzt so: In der DB sind die PWs verschlüsselt, aber für den Admin und seine Ausgabe werden sie wieder entschlüsselt. So war auch der Wunsch des Auftraggebers.
--------------

Damit bleibt jetzt wirklich nur mehr das zu richten:
PHP:
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
            
            if (!isset($_POST['edit'])) {
                echo "EINTRAGEN";
                mysqli_query($mysqli, "INSERT INTO projekte (taetigkeit, produkt, userid, beschreibung, erstellt) VALUES ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt');");
                $taetprodid = mysqli_insert_id($mysqli);
                
                for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                        $dauer = $_POST[$ts.'_'.$a];
                        mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts');");
                    }
                }
            } else {     
                mysqli_query($mysqli, "UPDATE projekte SET taetigkeit = '".$_POST['taetigkeit']."', produkt = '".$_POST['product']."', beschreibung = '".$_POST['beschreibung']."' WHERE id = '".$_SESSION['prid']."';") or die ("Update 'projekte' fehlgeschlagen.<br>".mysqli_error());
                for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    $dauer = $_POST['ts['.$ts.']'];
                    mysqli_query($mysqli, "UPDATE zeiten SET zeit = '$dauer' WHERE taetprodid = '".$_SESSION['prid']."' AND datum = $ts;") or die ("Update 'zeiten' fehlgeschlagen.<br>".mysqli_error());
                }
            }          
        }
    }
Mit folgenden Punkten:
- (Funktionierendes) Unterscheidungskriterium im ersten if zwischen INSERT und UPDATE finden
- $dauer richten für korrektes Überschreiben alter Stundenwerte mit neuen
- Überprüfung ob ein Feld in der Zeile erstmalig beschrieben wird (= INSERT), oder ob es geUPDATEet werden soll (lässt sich vielleicht mit dem ersten Punkt verbinden?!)

^^ Dazu bräuchte ich bitte nochmal eure Hilfe.
 
Zuletzt bearbeitet:
$dauer kannst du selbst vermutlich deutlich besser debuggen als wir aus der Ferne. Vergleiche wie die Felder im HTML-Quelltext heißen, was in den Feldern drinsteht, was dann im $_POST ankommt (Ein Debugging-Plugin für den Browser wie Firebug o. ä. hilft enorm, in Firebug wäre das im Tab "Netzwerk" zu sehen), was in $dauer steht. So läuft halt Fehlersuche, an jedem Punkt an dem sich Daten ändern können prüfen, ob diese noch korrekt sind, oder nicht. Für die Zukunft: Schau dir mal xdebug an.

Passwort: Wennd er Mitarbeiter sein Passwort vergisst, kriegt er ein neues. Jedes andere Verfahren ist Quatsch. Ob er das neue kriegt, indem er einen Link klickt, oder indem er dem Administrator sagt "Ich hab mein Passwort vergessen" ist dann erstmal nachrangig, zweiteres ist natürlich leichter zu implementieren.

Zu INSERT/UPDATE werfe ich nochmal "ON DUPLICATE KEY UPDATE" (--> Google) in den Raum.

Zu guter Letzt
Einen letzten Wunsch

Das zu glauben ist naiv. Kannst ja mal selbst den Thread durchgehen und nach Formulierungen wie "jetzt fehlt nur noch", "das einzige was noch fehlt" etc. schauen. Es werden immer noch Anforderungen dazukommen. Das ist auch ganz normal so.
 
1) Das "witzige" ist, es stimmt bis zum allerletzten Moment, also bis zum Anklicken des "Bestätigen" Buttons in projektzeiterfassung.php ...

1.PNG 2.PNG

Das Problem muss in formular.php selbst liegen, wo der Wert für $dauer nicht ankommt?! Firebug hätte ich eh schon installiert, schaue ich mir dann vielleicht* mal an.

2) Das mit den PWs lasse ich jetzt so. Meine Umsetzung erfüllt den Wunsch des Auftraggebers. Damit ist das für mich erledigt. Hätte ich mehr Zeit, würde ich mir vielleicht auch noch was anderes überlegen.

3) Das mit ON DUPLICATE KEY UPATE klingt gerade total interessant, vielen Dank! *Ich denke mir nämlich gerade, dass ich vielleicht meinen ganzen UPDATE-Code wegschmeißen und einfach den INSERT-Code, der ja einwandfrei funktioniert, um die genannte Funktion erweitern kann?! Muss ich mir gleich anschauen. Dann fiele nämlich auch das Überlegen eines Unterscheidungskriterium bzw. überhaupt das if-else weg. :)

4) Das hat schon immer so gestimmt, wie ich es geschrieben habe. Du musst bedenken, ich habe in zwei Etappen (mit großem zeitlichen Abstand dazwischen) an dem Projekt gearbeitet. Dass es da mehrmals einen "letzten Wunsch" gab, ist somit nicht verwunderlich. Außerdem sind uns auch immer wieder neue Sachen eingefallen, die ich im Sommer noch nicht gewusst habe. Da hatten wir für Herbst (jetzt) nur noch die Filterfunktionen geplant. Dann habe ich jetzt aber freiwillig den DELETE-Button eingebaut. Das EDIT ist auch mir eingefallen, hat dem Auftraggeber aber so gut gefallen, dass aus einem nice-to-have schnell ein must-have wurde (so kann man sich's auch selber einbrocken :fresse:) ...
Übrigens ist am kommenden SA wirklich die Zeit aus, mehr geht also alleine deswegen schon nicht mehr.
 
Zuletzt bearbeitet:
Rein codetechnisch bzw. syntaktisch müsste das dann so ausschauen (in formular.php):
PHP:
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $stunden = array("montag".$a."", "dienstag".$a."", "mittwoch".$a."", "donnerstag".$a."", "freitag".$a."", "samstag".$a."", "sonntag".$a."");
            
            mysqli_query($mysqli, "INSERT INTO 
                                        projekte (taetigkeit, produkt, userid, beschreibung, erstellt) 
                                      VALUES 
                                        ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."', '$userid', '".$_POST['beschreibung'.$a]."', '$erstellt') 
                                    ON DUPLICATE KEY UPDATE 
                                        taetigkeit = '".$_POST['taetigkeit'.$a]."', produkt = '".$_POST['product'.$a]."', beschreibung = '".$_POST['beschreibung'.$a]."';");
            $taetprodid = mysqli_insert_id($mysqli);
                
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                if (isset($_POST[$ts.'_'.$a]) and $_POST[$ts.'_'.$a] != "") {
                    $dauer = $_POST[$ts.'_'.$a];
                    mysqli_query($mysqli, "INSERT INTO 
                                                zeiten (userid, taetprodid, zeit, datum) 
                                            VALUES 
                                                ('$userid', '$taetprodid', '$dauer', '$ts')
                                            ON DUPLICATE KEY UPDATE
                                                zeit = $dauer;");
                }
            }
        }
    }
Funktioniert allerdings noch nicht, aber mal langsam ...
Was ich nicht verstanden habe, ist, wodurch er wissen will, ob da irgendwo an der richtigen Stelle bereits was in der DB steht und er das updaten muss. Irgendwie fehlt mir bei dem ON DUPLICATE KEY UPDATE ein WHERE mit Bedingung für meine Logik. Müsste ich den queries nicht irgendwie die ID der Einträge mitgeben, damit dann genau dieser Eintrag auf ein Duplikat geprüft wird???

Und warum das so noch nicht funktioniert, dürfte an folgendem liegen:

projektzeiterfassung.php
Code:
if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];
    
            [COLOR=royalblue]for ($j = 0; $j < count($selected); $j++) {                $taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$j];");
                $row_taet = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                echo '<tr><td><select [COLOR=royalblue]name="taetigkeit">';
                foreach ($taetigkeiten as $key => $taetigkeit) {
                    if ($key == $row_taet[0]) {
                        echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
                    }
                }
                echo '</select></td>';
                 
                $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$j];");
                $row_prod = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                echo '<td><select [COLOR=royalblue]name="product">';
                foreach ($products as $key => $product) {
                    if ($key == $row_prod[0]) {
                        echo '<option value="'.$key.'" selected>'.$product.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$product.'</option>';
                    }
                }
                echo '</select></td>';
                 
                $init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id = $selected[$j];");
                $row_desc = mysqli_fetch_row($init_desc); // beschreibung aus projekte
                echo '<td><input [COLOR=royalblue]name="beschreibung" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                
                for ($wochentag = $wochenanfang; $wochentag <= $wochenende; $wochentag += 86400) {
                    $time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$j]."';");
                    $row_time = mysqli_fetch_row($time_id);
                    echo '<td><input type="text" [COLOR=royalblue]name="ts['.$wochentag.']" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                }
                
                $_SESSION['prid'] = $selected[$j];
                echo '<td>'.$selected[$j].'</td><br>';
            }
        }
    }
    /*************/
      
    [COLOR=royalblue]for ([B]$a = 1; $a <= $add; $a++[/B]) {        echo '<tr><td><select [COLOR=royalblue]name="taetigkeit'.[B]$a[/B].'">';
        foreach ($taetigkeiten as $key => $taetigkeit) {
            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
        }
        echo '</select></td>';

        echo '<td><select [COLOR=royalblue]name="product'.[B]$a[/B].'">';
        foreach ($products as $key => $product) {
            echo '<option value="'.$key.'">'.$product.'</option>';
        }
        echo '</select></td>';

        echo '<td><input [COLOR=royalblue]name="beschreibung'.[B]$a[/B].'" type="text" size="50" maxlength="250"></td>';

        for ($i = 0; $i < 7; $i++) {
            $ts = $wochenanfang + ($i * 60 * 60 * 24);
            echo ' <td><input type="text" [COLOR=royalblue]name="'.$ts.'_'.[B]$a[/B].'" maxlength="6" size="4"></td>';
        }
    }
^^ Die Namen im EDIT-Zeile-Code (oberer Abschnitt) passen noch nicht für die Abfrage in formular.php, siehe ganz oben im Posting. Aber die beiden Teile hier im Spoiler machen ja im Prinzip das selbe, also muss sich das doch innerhalb der for ($a...) Schleife kombinieren lassen?! Die for ($j...) Schleife hat ja exakt den selben Sinn.

:huh:

[EDIT]
Wenn ich es allerdings so mache (projektzeiterfassung.php) ...
PHP:
for ($a = 1; $a <= $add; $a++) {
        
        /*************/
        if (isset($_POST['edit'])) {
            if (isset($_POST['check'])) {
                $selected = $_POST['check'];
        
                //for ($j = 0; $j < count($selected); $j++) {
                    $taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$a];");
                    $row_taet = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                    echo '<tr><td><select name="taetigkeit'.$a.'">';
                    foreach ($taetigkeiten as $key => $taetigkeit) {
                        if ($key == $row_taet[0]) {
                            echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                        } else {
                            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
                        }
                    }
                    echo '</select></td>';
                     
                    $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$a];");
                    $row_prod = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                    echo '<td><select name="product'.$a.'">';
                    foreach ($products as $key => $product) {
                        if ($key == $row_prod[0]) {
                            echo '<option value="'.$key.'" selected>'.$product.'</option>';
                        } else {
                            echo '<option value="'.$key.'">'.$product.'</option>';
                        }
                    }
                    echo '</select></td>';
                     
                    $init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id = $selected[$a];");
                    $row_desc = mysqli_fetch_row($init_desc); // beschreibung aus projekte
                    echo '<td><input name="beschreibung'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                    
                    for ($wochentag = $wochenanfang, $i=0; $wochentag <= $wochenende, $i < 7; $wochentag += 86400, $i++) {
                        $time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$a]."';");
                        $row_time = mysqli_fetch_row($time_id);
                        $ts = $wochenanfang + ($i * 60 * 60 * 24);
                        echo '<td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                    }
                    
                    $_SESSION['prid'] = $selected[$a];
                    echo '<td>'.$selected[$a].'</td><br>';
                //}
            }
        }
        /*************/
      
    //for ($a = 1; $a <= $add; $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $key => $taetigkeit) {
            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
        }
        echo '</select></td>';

        echo '<td><select name="product'.$a.'">';
        foreach ($products as $key => $product) {
            echo '<option value="'.$key.'">'.$product.'</option>';
        }
        echo '</select></td>';

        echo '<td><input name="beschreibung'.$a.'" type="text" size="50" maxlength="250"></td>';

        for ($i = 0; $i < 7; $i++) {
            $ts = $wochenanfang + ($i * 60 * 60 * 24);
            echo ' <td><input type="text" name="'.$ts.'_'.$a.'" maxlength="6" size="4"></td>';
        }
    }
... dann kriege ich zwar ganz normal meine EDIT-Zeile, aber ohne vorbelegte Werte:

Unbenannt.PNG

[EDIT2]
Ah, die projekt- bzw. taetprodid (der ersten EDIT-Zeile) ist in $selected[0] drinnen, aber $a fängt bei 1 an. Alle $selected[$a] zu $selected[0] ausgebessert, jetzt kriege ich auch mit dem kombinierten Code wieder EINE EDIT-Zeile. Jetzt müsste ich das aber trotzdem noch irgendwie dynamisch mit einer Variable lösen, damit auch mehrere EDIT-Zeilen wieder dargestellt werden können. Hm ...
 
Zuletzt bearbeitet:
Du musst für das ON DUPLICATE KEY in der Datenbank auch einen KEY (Index) erstellen. Und zwar einen UNIQUE Key, diesen kannst du über mehrere Spalten definieren. (D. h. "Hiermit sage ich, die Kombination aus A, B und C darf nur einmal vorkommen). Siehe z. B.
MySQL :: MySQL 5.0 Reference Manual :: 13.1.8 CREATE INDEX Syntax

(Falls du phpmyadmin einsetzt, damit geht das sehr simpel & graphisch.)

EDIT:

Zum Beispiel hierfür:
PHP:
     mysqli_query($mysqli, "INSERT INTO 
                                                zeiten (userid, taetprodid, zeit, datum) 
                                            VALUES 
                                                ('$userid', '$taetprodid', '$dauer', '$ts')
                                            ON DUPLICATE KEY UPDATE
                                                zeit = $dauer;");
wäre der notwendige UNIQUE Index eienr über userid, taetprodid und datum.
 
Zuletzt bearbeitet:
^^ Ich glaube, ganz habe ich das nicht kapiert mit dem UNIQUE INDEX, aber soweit ich das sehe, haben wir doch eh durch die auto-increment IDs in der projekte- und der zeiten-Tabelle eindeutige INDEXE?!

Ich frage mich nur, wie ich die dem ON DUPLICATE KEY UPDATE mitteilen soll, sodass er dann eben genau den Eintrag an dieser ID anschaut und zwischen INSERT und UPDATE entscheidet?!

[EDIT]
Die auto-increment ID wäre btw auch "unique" für z. B. userid+taetprodid+datum in zeiten, oder taetigkeit+produkt+beschreibung+erstellt in projekte.
 
Zuletzt bearbeitet:
auto-increment-IDs? Wusste ich nicht (mehr). Wie heißt denn das entsprechende Feld? id? Das wird im Code aber nicht benutzt, oder?

Naja, wenn du zum Beispiel einen Unique Index über userid, taetprodid und datum erstellst, dann arbeitet die Datenbank in etwa so:

-> Will eine Spalte für User 4, Taetprodid 7 und Datum 11.11.2014 erstellen, mit der Zeit 20
-> User, Taetprodid, Datum sind UNIQUE, das heißt, die Kombination aus diesen drei Werten darf in der Datenbank nur einmal vorkommen, soso...
-> Oje! Es kommt bereits vor! User 4, Taetprodid 7 und Datum 11.11.2014 mit Zeit 15 gefunden!
-> Bei einem Query ohne ON DUPLICATE KEY UPDATE würde ich jetzt einen Fehler melden, aber so...
-> Mache ich stattdessen ein Update der Zeile, in der die Kombination vorkommt! Hurra!

(Edit: Siehe
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
Auch den obersten Kommentar lesen)
 
Zuletzt bearbeitet:
projekte

projekte.PNG

zeiten

zeiten.PNG

(taetprodid in zeiten == id aus projekte, aber wir würden auch in zeiten die auto-increment ID letztgenannter Tabelle brauchen)

Wie das arbeitet, habe ich schon verstanden. Was mir nicht klar ist: Wie sag ich dem ON DUPLICATE KEY UPDATE, für welchen Eintrag, also welche ID, er prüfen soll??? Genau dafür fehlt mir in meiner Logik ein WHERE, das es aber in der Syntax der DUPLICATE-Funktion nicht gibt?!

[EDIT]
Ja, die Comments habe ich eh gelesen. Wenn ich den ersten richtig verstehe, dann muss ich eigentlich gar nichts machen?! Wenn eindeutige Kombinationen in der DB vorhanden sind, dann funktioniert ON DUPLICATE KEY UPDATE automatisch wie ein UPDATE ... WHERE auf einen bestimmten Eintrag?!

Jedenfalls kann ich den formular.php-Code eh noch nicht so richtig testen, weil vorher noch die Ausgabe in projektzeiterfassung.php gerichtet werden muss. Noch ist die ein kleines Chaos:
PHP:
for ($a = 1; $a <= $add+count($selected); $a++) {
        
        $b = $a-1;
        /*************/
        if (isset($_POST['edit'])) {
            if (isset($_POST['check'])) {
                $selected = $_POST['check'];

                //for ($j = 0; $j < count($selected); $j++) {
                    $taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$b];");
                    $row_taet = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                    echo '<tr><td><select name="taetigkeit'.$a.'">';
                    foreach ($taetigkeiten as $key => $taetigkeit) {
                        if ($key == $row_taet[0]) {
                            echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                        } else {
                            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
                        }
                    }
                    echo '</select></td>';
                     
                    $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$b];");
                    $row_prod = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                    echo '<td><select name="product'.$a.'">';
                    foreach ($products as $key => $product) {
                        if ($key == $row_prod[0]) {
                            echo '<option value="'.$key.'" selected>'.$product.'</option>';
                        } else {
                            echo '<option value="'.$key.'">'.$product.'</option>';
                        }
                    }
                    echo '</select></td>';
                     
                    $init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id = $selected[$b];");
                    $row_desc = mysqli_fetch_row($init_desc); // beschreibung aus projekte
                    echo '<td><input name="beschreibung'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                    
                    for ($wochentag = $wochenanfang, $i=0; $wochentag <= $wochenende, $i < 7; $wochentag += 86400, $i++) {
                        $time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$b]."';");
                        $row_time = mysqli_fetch_row($time_id);
                        $ts = $wochenanfang + ($i * 60 * 60 * 24);
                        echo '<td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                    }
                    
                    $_SESSION['prid'] = $selected[$b];
                    echo '<td>'.$selected[$b].'</td><br>';
                //}
            }
        }
        /*************/
      
    //for ($a = 1; $a <= $add; $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $key => $taetigkeit) {
            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
        }
        echo '</select></td>';

        echo '<td><select name="product'.$a.'">';
        foreach ($products as $key => $product) {
            echo '<option value="'.$key.'">'.$product.'</option>';
        }
        echo '</select></td>';

        echo '<td><input name="beschreibung'.$a.'" type="text" size="50" maxlength="250"></td>';

        for ($i = 0; $i < 7; $i++) {
            $ts = $wochenanfang + ($i * 60 * 60 * 24);
            echo ' <td><input type="text" name="'.$ts.'_'.$a.'" maxlength="6" size="4"></td>';
        }
    }
Liefert:

Unbenannt.PNG

Die EDIT-Zeilen stimmen schon, aber ich kriege zu viele von den normalen Eingabezeilen, weil die Schleife zu hoch zählt. Muss ich jetzt erst wieder zwei getrennte Schleifen haben? :ugly: Ich brauche aber für ALLES den $a-Index ...
 
Zuletzt bearbeitet:
Siehe mein Beispiel oben. Mit einem UNIQUE INDEX oder PRIMARY KEY.

Ich bleibe beim Folgenden mal in der Tabelle zeiten:

Du hast in dem Fall zwei Sachen die eine Zeile eindeutig beschreiben, richtig?
a) Die Kombination aus user, taetprodid, datum
Oder
b) Die id (die sich per auto_increment erhöht)

Ich gehe davon aus, dass es bisher keine Indizes (plural von INDEX) in der Tabelle gibt, richtig? (Wenn du keine angelegt hast, gibts auch keine).

Davon ausgehend, dass das Datenbankschema (alle Tabellen, Spalten und deren jeweilige Namen etc.) bleiben soll, wie es ist, halte ich folgende beiden Keys für sinnvoll:
1. PRIMARY KEY auf id
2. UNIQUE INDEX auf user, taetprodid, datum (ACHTUNG: NICHT JEWEILS!!!, sonder ein UNIQUE-INDEX über alle drei)

PRIMARY KEY und UNIQUE sind sehr ähnlich. Es kann allerdings nur einen Primary Key geben (daher das Primary). Primary Key felder dürfen nicht null sein.

Nur der 2. Index ist für den in #813 zitierten SQL-Query relevant.
 
^^ Ja, aber ich verstehe noch nicht ganz, was und wo ich mit dem Zeug was machen soll.

Jetzt mal ganz vereinfacht gesprochen: Muss ich einfach nur eine einzige Zeile in meinem Code irgendwo vor der ersten Verwendung von DUPLICAT... einfügen, die lautet:
PHP:
CREATE UNIQUE INDEX index_name ON projekte (taetigkeit, produkt, beschreibung, erstellt);
???

Ich will ja eigentlich nichts in der DB hinzufügen. Er soll die bereits vorhandene ID bzw. die möglichen Kombinationen vorhandener Spalten als Indizes/Keys verwenden.

Und siehe bitte mein EDIT im Vorposting ...

[EDIT]
So klappt die Darstellung schon mal einwandfrei:
PHP:
for ($a = 1; $a <= $add; $a++) {
        if (isset($_POST['edit'])) {
            if (isset($_POST['check'])) {
                $selected = $_POST['check'];

                for ($j = 0; $j < count($selected); $j++) {
                    $taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$j];");
                    $row_taet = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                    echo '<tr><td><select name="taetigkeit'.$a.'">';
                    foreach ($taetigkeiten as $key => $taetigkeit) {
                        if ($key == $row_taet[0]) {
                            echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                        } else {
                            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
                        }
                    }
                    echo '</select></td>';
                     
                    $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$j];");
                    $row_prod = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                    echo '<td><select name="product'.$a.'">';
                    foreach ($products as $key => $product) {
                        if ($key == $row_prod[0]) {
                            echo '<option value="'.$key.'" selected>'.$product.'</option>';
                        } else {
                            echo '<option value="'.$key.'">'.$product.'</option>';
                        }
                    }
                    echo '</select></td>';
                     
                    $init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id = $selected[$j];");
                    $row_desc = mysqli_fetch_row($init_desc); // beschreibung aus projekte
                    echo '<td><input name="beschreibung'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                    
                    for ($wochentag = $wochenanfang, $i=0; $wochentag <= $wochenende, $i < 7; $wochentag += 86400, $i++) {
                        $time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$j]."';");
                        $row_time = mysqli_fetch_row($time_id);
                        $ts = $wochenanfang + ($i * 60 * 60 * 24);
                        echo '<td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                    }
                    
                    $_SESSION['prid'] = $selected[$j];
                    echo '<td>'.$selected[$j].'</td><br>';
                }
            }
        }
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $key => $taetigkeit) {
            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
        }
        echo '</select></td>';

        echo '<td><select name="product'.$a.'">';
        foreach ($products as $key => $product) {
            echo '<option value="'.$key.'">'.$product.'</option>';
        }
        echo '</select></td>';

        echo '<td><input name="beschreibung'.$a.'" type="text" size="50" maxlength="250"></td>';

        for ($i = 0; $i < 7; $i++) {
            $ts = $wochenanfang + ($i * 60 * 60 * 24);
            echo ' <td><input type="text" name="'.$ts.'_'.$a.'" maxlength="6" size="4"></td>';
        }
    }
Bleibt nur zu hoffen, dass durch die verschachtelten Schleifen $a nicht irgendwann ungewollte Werte annimmt.

Jedenfalls muss ich jetzt eben nur noch den Code in formular.php richten ...

[EDIT2]
$a scheint immer 1 zu sein. Dann wird das so eh noch nicht klappen. :(
Der müsste bei 2 EDIT-Zeilen vor einer normalen Eingabezeile bei $a bis auf 3 kommen.

[EDIT3]
Yes! Jetzt stimmt's $a.
PHP:
if (isset($_POST['edit'])) {
        if (isset($_POST['check'])) {
            $selected = $_POST['check'];

            for ($a = 1; $a <= count($selected); $a++) {
                $b = $a-1;
                    
                $taet_id = mysqli_query($mysqli, "SELECT taetigkeit FROM projekte WHERE id = $selected[$b];");
                $row_taet = mysqli_fetch_row($taet_id); // taetigkeit-id aus projekte
                echo '<tr><td><select name="taetigkeit'.$a.'">';
                foreach ($taetigkeiten as $key => $taetigkeit) {
                    if ($key == $row_taet[0]) {
                        echo '<option value="'.$key.'" selected>'.$taetigkeit.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
                    }
                }
                echo '</select></td>';
                     
                $prod_id = mysqli_query($mysqli, "SELECT produkt FROM projekte WHERE id = $selected[$b];");
                $row_prod = mysqli_fetch_row($prod_id); // produkt-id aus projekte
                echo '<td><select name="product'.$a.'">';
                foreach ($products as $key => $product) {
                    if ($key == $row_prod[0]) {
                        echo '<option value="'.$key.'" selected>'.$product.'</option>';
                    } else {
                        echo '<option value="'.$key.'">'.$product.'</option>';
                    }
                }
                echo '</select></td>';
                     
                $init_desc = mysqli_query($mysqli, "SELECT beschreibung FROM projekte WHERE id = $selected[$b];");
                $row_desc = mysqli_fetch_row($init_desc); // beschreibung aus projekte
                echo '<td><input name="beschreibung'.$a.'" type="text" value="'.$row_desc[0].'" size="50" maxlength="250"></td>';
                    
                for ($wochentag = $wochenanfang, $i=0; $wochentag <= $wochenende, $i < 7; $wochentag += 86400, $i++) {
                    $time_id = mysqli_query($mysqli, "SELECT zeit FROM zeiten WHERE datum = '".$wochentag."' AND taetprodid = '".$selected[$b]."';");
                    $row_time = mysqli_fetch_row($time_id);
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    echo '<td><input type="text" name="'.$ts.'_'.$a.'" value="'.$row_time[0].'" maxlength="6" size="4"></td>';
                }
                    
                $_SESSION['prid'] = $selected[$b];
                echo '<td>'.$selected[$b].'</td><br>';
            }
        }
    }
    echo $a;
      
    for ($a = count($selected)+1; $a <= $add+count($selected); $a++) {
        echo '<tr><td><select name="taetigkeit'.$a.'">';
        foreach ($taetigkeiten as $key => $taetigkeit) {
            echo '<option value="'.$key.'">'.$taetigkeit.'</option>';
        }
        echo '</select></td>';

        echo '<td><select name="product'.$a.'">';
        foreach ($products as $key => $product) {
            echo '<option value="'.$key.'">'.$product.'</option>';
        }
        echo '</select></td>';

        echo '<td><input name="beschreibung'.$a.'" type="text" size="50" maxlength="250"></td>';

        for ($i = 0; $i < 7; $i++) {
            $ts = $wochenanfang + ($i * 60 * 60 * 24);
            echo ' <td><input type="text" name="'.$ts.'_'.$a.'" maxlength="6" size="4"></td>';
        }
    }
Damit sollte jetzt schon mal alles den richtigen Index und Namen haben. :)
 
Zuletzt bearbeitet:
Du musst den Index nur einmalig erstellen.
Egal ob per Mysql Client, Phpmyadmin, PHP, sonstwie...
Also nicht in deinen Code stecken, sondern einfach einmal den Index erstellen.
 
Zurück