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

  • Ersteller Ersteller boss3D
  • Erstellt am Erstellt am
Um Himmels Willen nein.

Ein ganz normaler UNIQUE-Index kann mehr als eine Spalte umfassen. D. h. ein UNIQUE über a, b, c bedeutet, dass nur die Kombination aus a, b und c unique sein muss, nicht jede einzelne Spalte in sich.

http://dev.mysql.com/doc/refman/5.1/de/multiple-column-indexes.html

Edit: Kann dir nur empfehlen, dich mal näher mit den verschiedenen MySQL-Indizes zu befassen. Für dieses Projekt hier nicht so wichtig, aber später bei größeren Projekten, wo auch Geschwindigkeitsoptimierungen usw. wichtig sind, ist das ein spannendes Thema.
 
Zuletzt bearbeitet:
ähä, nen simplen foreign key kennt die hütte nich, aber sowas? da muss man erstmla druff kommen -.- *les*
 
Da ist ja auch gar nicht von Foreign Keys die Rede, sondern von diesem Reference-Gedöns. Foreign Keys funktionieren 1A, weiß ich aus eigener Erfahrung ^^
 
Naja, "1A" wäre, wenn sie so funktionieren würden, wie der SQL-Standard sie spezifiziert. Aber wozu gibts PostgreSQL und Co? ;-)
 
dann hab ich das wohl falsch interpretiert. war eines der ersten google ergebnisse *böse rüber schiel* wenn ich den bastard frag, was ich gestern zum mittag hatte (ich merk mir sowas nie), weiß der das bestimmt - aber bei lebenswichtigen sachen... :motz:


:ugly:
 
Den Code-Teil in formular.php habe ich jetzt so:
PHP:
if (isset($_POST['confirm'])) {
    for ($a = 1; $a <= $add; $a++) {
        $check = mysqli_query($mysqli, "SELECT * FROM projekte WHERE taetigkeit='".$_POST['taetigkeit'.$a]."' AND produkt='".$_POST['product'.$a].";");
        if ($check) {
            $row = mysqli_fetch_assoc($check);
            $taetprodid = row['id'];
            if ($row['taetigkeit'] != $_POST['taetigkeit'.$a] or $row['produkt'] != $_POST['product'.$a] or $row['beschreibung'] != $_POST['beschreibung'.$a]) {
                $eintragen1 = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit'.$a]."', produkt='".$_POST['product'.$a]."', userid='".$userid."', beschreibung='".$_POST['beschreibung'.$a]."', erstellt='$erstellt') WHERE id='$taetprodid';");  
        } else {
            $eintragen1 = 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];                              
                $check = mysqli_query($mysqli, "SELECT * FROM zeiten WHERE taetprodid='".$taetprodid."' AND userid='".$userid."' AND datum='".$ts."';");
                if ($check) {
                    $row = mysqli_fetch_assoc($check);
                    if ($row['zeit'] != $dauer) {
                        $eintragen2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer." WHERE id='".$row['zeit']."';"); 
                    }
                } else {
                    $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                }
            }
        }
    }
}
    
function startsWith($haystack, $needle) {
    return $needle === "" || strpos($haystack, $needle) === 0;
}
    
foreach($_POST as $key => $val) {
    if (startsWith($key, 'save')) {
        $prID = (int)substr($key, 4);
        if (isset($_POST['save'.$prID])) {
            mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."', beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
            for ($b = 0; $b < 7; $b++) {
                $ts = $wochenanfang + ($b * 60 * 60 * 24);
                $dauer = $_POST[$ts]; 
                if ($dauer == "") { 
                    mysqli_query($mysqli, "DELETE FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' taetprodid='".$prID."'");
                } else {
                    if (mysqli_query($mysqli, "SELECT * FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' AND taetprodid='".$prID."'")) {
                        mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
                    } else {
                        mysqli_query($mysqli, "INSERT INTO zeiten (zeit) VALUES ('$dauer') WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
                    }
                }
            }
        }
    }
}
Dein mysqli passt, aber die ganzen '$userid' habe ich durch '".$userid."' ersetzt. Ich denke, so stimmt's. Allerdings kriege ich für folgende Zeile (ziemlich weit oben):
Parse error: syntax error, unexpected '[' in C:\xampp\htdocs\db\formular.php on line 141
PHP:
$taetprodid = row['id'];
 
^^ Okay, eine { hat auch noch gefehlt. Allerdings funktioniert das ganze immer noch nicht, und obendrein schaut's jetzt auch etwas kurios aus ...

Unbenannt.PNG

Zeile 113 in auswerten.php wäre übrigens das echo hier:
PHP:
for ($i = 0; $i < count($td); $i++) {
     echo '    <td>'.$td[$i].'</td>';
}
PHP:
<?php
    $db_erg = mysqli_query($mysqli, "SELECT t.taetigkeit AS Taetigkeit, p.produkt AS Produkt, t.id AS tID, p.id AS pID, pr.id AS prID, pr.beschreibung AS Beschreibung, u.name AS User, z.zeit AS Zeit, z.datum AS Datum FROM zeiten AS z, projekte AS pr, user AS u, taetigkeiten AS t, produkte AS p WHERE z.datum >= '".$wochenanfang."' AND z.datum <= '".$wochenende."' AND u.name = '".$user."' AND u.id = z.userid AND pr.id = z.taetprodid AND pr.taetigkeit = t.id AND pr.produkt = p.id ORDER BY z.datum ASC;");
    if (!$db_erg) {
        die ('Ungültige Abfrage: '.$mysqli->error);
    }
    
    $taetigkeiten = array();
    $res_t = mysqli_query($mysqli, "SELECT * FROM taetigkeiten") or die ("Get Taetigkeiten failed.<br>".mysqli_error());
    if (mysqli_num_rows($res_t))
        while ($row_t = mysqli_fetch_assoc($res_t)) {
            $taetigkeiten[count($taetigkeiten)] = $row_t;
        }

    $products = array();
    $res_p = mysqli_query($mysqli, "SELECT * FROM produkte") or die ("Get Produkte failed.<br>".mysqli_error());
    if (mysqli_num_rows($res_p))
        while ($row_p = mysqli_fetch_assoc($res_p)) {
            $products[count($products)] = $row_p;
        }

    echo '<table>';
    echo '  <tr>';
    echo '    <td colspan="10" class="head_cap">';
    echo '      <table style="width:100%; border:none; background-color:#A9F5BC;"><tr>';
    echo '        <td style="border:none" align="left"><input type="submit" value="<<" name="prevWeek" class="switch"></td>';
    echo '        <td style="width:90%; border:none; text-align:center">';
    if (date('Y', $wochenanfang) <> date('Y', $wochenende)) {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    } else {
        echo '            Kalenderwoche '.$kw.': '.date('j.m.Y', $wochenanfang).' - '.date('j.m.Y', $wochenende);
    }
    echo '            <input type="hidden" value="'.$wochenanfang.'" name="wa">';  
    echo '            <input type="hidden" value="'.$wochenende.'" name="we">';  
    echo '          </td>';
    echo '        <td style="border:none" align="right"><input type="submit" value=">>" name="nextWeek" class="switch"></td>';
    echo '      </tr></table>';
    echo '    </td>';
    echo '  </tr>';
    echo '    <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>';
    $row_collector = array();
    if (mysqli_num_rows($db_erg)) {
        while ($row = mysqli_fetch_assoc($db_erg)) {
            if (!isset($row_collector[$row['tID']])) {
                $row_collector[$row['tID']] = array();
                $row_collector[$row['tID']]['taet'] = $row['Taetigkeit'];
                $row_collector[$row['tID']]['data'] = array();
            }
            if (!isset($row_collector[$row['tID']]['data'][$row['pID']])) {
                $row_collector[$row['tID']]['data'][$row['pID']] = array();
                $row_collector[$row['tID']]['data'][$row['pID']]['prod'] = $row['Produkt'];
                $row_collector[$row['tID']]['data'][$row['pID']]['desc'] = $row['Beschreibung'];
                $row_collector[$row['tID']]['data'][$row['pID']]['prID'] = $row['prID'];
                $row_collector[$row['tID']]['data'][$row['pID']]['user'] = $row['User'];
                $row_collector[$row['tID']]['data'][$row['pID']]['time'] = array();
            }
            $row_collector[$row['tID']]['data'][$row['pID']]['time'][$row['Datum']] = $row['Zeit'];
        }
        foreach ($row_collector as $taet_id => $teat) {
            $td = array();
            $td[0] = $row_collector[$taet_id]['taet'];
            foreach ($row_collector[$taet_id]['data'] as $prod_id => $prod) {
                $td[1] = $row_collector[$taet_id]['data'][$prod_id]['prod'];
                $td[2] = $row_collector[$taet_id]['data'][$prod_id]['desc'];
                for ($i = 0; $i < 7; $i++) {
                    $ts = $wochenanfang + ($i * 60 * 60 * 24);
                    if (isset($row_collector[$taet_id]['data'][$prod_id]['time'][$ts])) {
                        $td[$i+3] = $row_collector[$taet_id]['data'][$prod_id]['time'][$ts];
                    }
                }
                echo '  <tr>';    
                if (isset($_POST['edit'.$row_collector[$taet_id]['data'][$prod_id]['prID']])) {
                    echo '<td><select name="taetigkeit">';
                    foreach ($taetigkeiten as $taetigkeit) {
                        echo '<option value="'.$taetigkeit['id'].'"';
                        if ($taetigkeit['id'] == $taet_id) {
                            echo ' selected="selected"';  
                        }
                        echo '>'.$taetigkeit['taetigkeit'].'</option>';
                    }
                    echo '</select></td>';

                    echo '<td><select name="product">';
                    foreach ($products as $product) {
                        echo '<option value="'.$product['id'].'"';
                        if ($product['id'] == $prod_id) {
                            echo ' selected="selected"'; 
                        }
                        echo '>'.$product['produkt'].'</option>';
                    }
                    echo '</select></td>';

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

                    for ($i = 0; $i < 7; $i++) {
                        $ts = $wochenanfang + ($i * 60 * 60 * 24);
                        echo ' <td><input type="text" name="'.$ts.'" maxlength="6" size="4" value="'.$td[($i + 3)].'"></td>';
                    }
                
                    echo '    <td><input type="submit" name="save'.$row_collector[$taet_id]['data'][$prod_id]['prID'].'" value="save"></td>';
                } else {
                    for ($i = 0; $i < count($td); $i++) {
                        echo '    <td>'.$td[$i].'</td>';
                    }
                
                    echo '    <td><input type="submit" name="edit'.$row_collector[$taet_id]['data'][$prod_id]['prID'].'" value="edit"></td>';
                }            
                echo '  </tr>';
            }
        }
    } else {
        echo '  <tr><td colspan="10" style="text-align:center">Keine Einträge gefunden.</td></tr>';
    }  
    echo '</table>';
    
    echo '<br><input type="submit" value="Zurück zur Eingabe" name="btnOutputCancel"><br><br>';
    echo '<input type="submit" name="export" value="Exportiere MySQL Daten zu Excel File"><br><br>';

[EDIT]
Ich merke auch gerade, es wird bei "Bestätigen" nichts mehr in "zeiten" eingetragen. :(
 
Zuletzt bearbeitet:
notfalls kommentier die updates/deletes/inserts mal aus (die selects lassen) und ersetze sie mit echo's. entweder schreibste selbst was rein, oder lässt dir variaben ausgeben oder den sql string... hauptsache, du kannst irgendwie nachvollziehen dadurch was er macht, welche if-zweige er nimmt. damit lässt sich sowas oft viel besser nachvollziehen. das tatsächliche ausführen mach ich meist erst, wenns durch die echos ganz gut ausgesehen hat ^^
 
^^ Okay ...

Hattest du eigentlich gemeint, dass der Code jetzt nur noch das ...
PHP:
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $check = mysqli_query($mysqli, "SELECT * FROM projekte WHERE taetigkeit='".$_POST['taetigkeit'.$a]."' AND produkt='".$_POST['product'.$a].";");
            if ($check) {
                $row = mysqli_fetch_assoc($check);
                $taetprodid = $row['id'];
                if ($row['taetigkeit'] != $_POST['taetigkeit'.$a] or $row['produkt'] != $_POST['product'.$a] or $row['beschreibung'] != $_POST['beschreibung'.$a]) {
                    $eintragen1 = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit'.$a]."', produkt='".$_POST['product'.$a]."', userid='".$userid."', beschreibung='".$_POST['beschreibung'.$a]."', erstellt='$erstellt') WHERE id='$taetprodid';");  
                }
            } else {
                $eintragen1 = 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];                              
                    $check = mysqli_query($mysqli, "SELECT * FROM zeiten WHERE taetprodid='".$taetprodid."' AND userid='".$userid."' AND datum='".$ts."';");
                    if ($check) {
                        $row = mysqli_fetch_assoc($check);
                        if ($row['zeit'] != $dauer) {
                            $eintragen2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE id='".$row['zeit']."';"); 
                        }
                    } else {
                        $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                    }
                }
            }
        }
    }
... sein soll, oder eh alles wie folgt?
PHP:
if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
            $check = mysqli_query($mysqli, "SELECT * FROM projekte WHERE taetigkeit='".$_POST['taetigkeit'.$a]."' AND produkt='".$_POST['product'.$a].";");
            if ($check) {
                $row = mysqli_fetch_assoc($check);
                $taetprodid = $row['id'];
                if ($row['taetigkeit'] != $_POST['taetigkeit'.$a] or $row['produkt'] != $_POST['product'.$a] or $row['beschreibung'] != $_POST['beschreibung'.$a]) {
                    $eintragen1 = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit'.$a]."', produkt='".$_POST['product'.$a]."', userid='".$userid."', beschreibung='".$_POST['beschreibung'.$a]."', erstellt='$erstellt') WHERE id='$taetprodid';");  
                }
            } else {
                $eintragen1 = 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];                              
                    $check = mysqli_query($mysqli, "SELECT * FROM zeiten WHERE taetprodid='".$taetprodid."' AND userid='".$userid."' AND datum='".$ts."';");
                    if ($check) {
                        $row = mysqli_fetch_assoc($check);
                        if ($row['zeit'] != $dauer) {
                            $eintragen2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE id='".$row['zeit']."';"); 
                        }
                    } else {
                        $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                    }
                }
            }
        }
    }
    
    function startsWith($haystack, $needle) {
        return $needle === "" || strpos($haystack, $needle) === 0;
    }
    
    foreach ($_POST as $key => $val) {
        if (startsWith($key, 'save')) {
            $prID = (int)substr($key, 4);
            if (isset($_POST['save'.$prID])) {
                mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."', beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
                for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    $dauer = $_POST[$ts]; 
                    if ($dauer == "") { 
                        mysqli_query($mysqli, "DELETE FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' taetprodid='".$prID."'");
                    } else {
                        if (mysqli_query($mysqli, "SELECT * FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' AND taetprodid='".$prID."'")) {
                            mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
                        } else {
                            mysqli_query($mysqli, "INSERT INTO zeiten (zeit) VALUES ('$dauer') WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
                        }
                    }
                }
            }
        }
    }
Ich hatte jedenfalls die function und das foreach mal auskommentiert, hat aber am Problem nichts geändert. Scheinbar macht der Code eh nichts mehr?!

[EDIT]
Der Fehler ist auf jeden Fall irgendwo hierin:
PHP:
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];                              
                    $check = mysqli_query($mysqli, "SELECT * FROM zeiten WHERE taetprodid='".$taetprodid."' AND userid='".$userid."' AND datum='".$ts."';");
                    if ($check) {
                        $row = mysqli_fetch_assoc($check);
                        if ($row['zeit'] != $dauer) {
                            $eintragen2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE id='".$row['zeit']."';"); 
                        }
                    } else {
                        $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                    }
                }
            }
Die obere for-Schleife im if macht das richtige.

[EDIT2]
Fehler gefunden: Er kommt nur ins UPDATE, nicht aber ins INSERT:
PHP:
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];                              
                    $check = mysqli_query($mysqli, "SELECT * FROM zeiten WHERE taetprodid='".$taetprodid."' AND userid='".$userid."' AND datum='".$ts."';");
                    if ($check) {
                        echo 'Wir sind im check';
                        $row = mysqli_fetch_assoc($check);
                        if ($row['zeit'] != $dauer) {
                            echo 'UPDATE';
                            $eintragen2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE id='".$row['zeit']."';"); 
                        }
                    } else {
                        echo 'INSERT';
                        $eintragen2 = mysqli_query($mysqli, "INSERT INTO zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid', '$taetprodid', '$dauer', '$ts')");
                    }
                }
            }
Unbenannt.PNG
 
Zuletzt bearbeitet:
^^ Ich könnte einfach "if (!$check)" sagen, aber dann lande ich wieder hier (und UPDATE funktioniert nicht) ... :ugly:

Unbenannt.PNG

Hierin liegt jedenfalls der Fehler:
PHP:
if (!$check) {
     $row = mysqli_fetch_assoc($check);
     if ($row['zeit'] != $dauer) {
         $eintragen2 = mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE id='".$row['zeit']."';"); 
     }
 
im mom hab ich nich wirklich zeit mich tiefer damit zu beschäftigen :( auch wenns in den fingern juckt ^^

aber mal kurz geschaut:
unterer code, erste sql abfrage: am ende fehlt ein '
generell wegen deinem $erstellt: schreib doch einfach NOW(), dann kannste auf die variable pfeiffen ^^

reine logik geschichte: weiß grad nich, wie du es nun handhabst... du hast ja bei projekte die erstellt und die userid spalte. beide beziehen sich auf das erstellt von/am. ich würde die bedeutung der spalten umändern. userid gibt an, wer die letzte änderung veranlasst hat (halt der, der das insert ausgelöst hat, oder eben ein update) und das erstellt bekommt die bedeutung, wann diese änderung war (wird also beim erstellen und bei jeder änderung mit geändert). kannst die spalten ggf auch umbenennen (musste halt dann imcode auch überall ändern). die jetzige bedeutung heist ja eben, dass es von dem und dem erstellt wurde (das datum is erstmal relativ bums).

problem hierbei ist, dass nun jeder user (trotz selber tätigkeit/produkt-kombi) für sich eine "projekt-kopie" anlegt. wenn wir projekt jetzt also so definieren, dass es eben eine tätigkeit/produkt-kombi ist und eben KEINE tätigkeit/produkt/user-kombi (was ich wie gesagt sehr viel sinnvoller fände), dann taucht ein problem auf. der hans bearbeitet ein projekt tätigkeit1/produkt1. der meier macht da auch mit. nun fuhrwerken beide mit ihrer eigenen projekt-kopie in der db rum. beide erstellen jeder für sich einen eintrag in der db, der sich nur durch ihre user-id unterscheidet - das projekt selber ist gleich. wir haben also faktisch ein projekt, aber 2 einträge. wie gesagt, bekommt man ja über die zeiten raus, wer am projekt rumfuhrwerkt, deswegen braucht mans eigentlich beim projekt nich nochmal speichern.

wenn du deinen code oben (also der untere ausschnitt) so laufen lässt, holt dir check diese 2 datensätze aus der db (da du nicht nach der user-id filterst - was ich wie gesagt ok finde, aber dann muss das speichern halt angepasst werden, is ja auch gleich hier, gleich mal schauen ^^), wir bearbeiten aber nur den ersten. jetzt wissen wir aber garnich, ob das der ist, der grad bearbeitet wird -> besagtes problem.

nächstes problem: wir suchen das projekt mit den per formular übergebenen id's für tätigkeit und produkt, statt über die ermittelte prID (damit wäre auch das erste prob aus der welt ^^). hb ich natürlich in der eile gestern nich dran gedacht. weil du möchtest ja, das beide mit editierbar sind. wenn wir aber nach den schon editierten dingern suchen, können wir natürlich kaum erwarten, den ursprünglichen eintrag zu finden. also - ach shit, wir sind ja bei confirm, da gibts noch keine id xD jetz bin ich völlig verwirrt. also nochmal langsam :ugly:


wenn confirm, geh alle zeilen durch. hier wäre es ganz gesund, erstmal die pflichtfelder zu checken. also tätigkeit und produkt (und eventuell mindestens eine zeit - aber das kann man sich ggf auch schenken). also quasi if isset(post teat, post prod) and beide trim() != "" -> go.
jenau, frage anhand der tät/prod kombi bei der db an (stimmt also doch), ob es diese schon gibt (user wird ignoriert, da irrelevant). wenn es die schon gibt, dann update ggf (sofern änderungen vorliegen) das gerumpel. diesemal wird der user vermerkt, auch die zeit. die projektid ist hierbei die id des anfrage ergebnisses. falls es diese kombi noch ned gibt, inserte sie. auch diesemal wird der user vermerkt, auch die zeit. die projektid ist jetzt die id des letzten inserts.

also soweit hauts mMn hin. dann rödelt er alle tage durch, kontrolliert wieder die eingaben. wurde was eingetragen, schaut er wieder nach, obs diesen eintrag schon gibt. wenn, dann wird der geupdated (sofern sich die zeit geändert hat) - den schritt kannst du btw auch weglsaaen, wenn du magst, weil an und für sich haben wir ja ne gesonderte edit-funktion. kannste aber auch drin lassen, wenn dir diese alternative edit-möglichkeit gefällt ^^ joa, und falls es den eintrag noch ned gibt, wir er erstellt.

klingt für mich schlüssig und sollte funtzen *grübel*


sow, und jetzt die editiererei. hier müssten wir das ganze jetzt auch abändern, dass erst gecheckt wird, obs das projekt schon gibt. wenn es das schon gibt, wird wieder auf unterschiede geprüft und sind unterschiede vorhanden, wird geupdated. nur so kann man den "neuen sinn" (den ich halt irgendwie sinnvoller finde) für userid und erstellt (könnte man umbenennen in changed_by und changed_date oder so) beibehalten. wer zuletzt was dran geändert hat, der wird mit zeit vermerkt.
dann gehts wieder zu der "tages-schleife". in der if würde ich halt wieder auf trim($dauer) prüfen, aber so passt das erstmal. wenn nix eingegeben, lösche (gibts nix zu löschen, macht das ding auch nix - also brauchen wir auch keinen check vorher. aber ansonsten sollte das eigentlich passen *grübel*


die db war auch wieder sinnvoll gefüllt mit daten? weil du hattest ja beim einen versuch die ganzen zeiten gekillt ^^ wenn die immernoch fehlen, wird da ggf nich viel passieren.
 
^^ Puh, aus deinen Texten ist es nicht leicht, rauszulesen, was denn nun konkret ich eigentlich machen soll ...

1) Soll ich jetzt also in "projekte" eine weitere Spalte "prID" hinzufügen, zusätzlich zu all dem? (Und wodurch würde sich die dann von der auto_increment id unterscheiden?)

Capture.JPG

2) Wozu bitte auf Änderungen überprüfen und nur im Falle dieser das Projekt updaten? Ich würde das in jedem Fall updaten (auch wenn's keine Änderungen gibt) und mir dadurch wieder "komplizierten" Code ersparen, bei dem eh wieder keiner durchblickt, wenn's nen Fehler geben sollte. Ist zwar vielleicht ein bisschen "Mehraufwand" für die DB, aber leichter für uns.

3) Und zu deinem Hans und Meier: Aus den bisher verwendeten Excel-Tabellen geht auch nicht hervor, ob mehrere MAs an einem Projekt gearbeitet haben, insofern denke ich nicht, dass wir das jetzt unbedingt in unserer DB umsetzen müssen. Oder gäb's da einen anderen Sinn, den ich dann nicht aus deinem Posting rausgelesen hätte?

^^ Irgendwie weiß ich halt jetzt gerade nicht so ganz, was ich machen soll. :huh:
Eigentlich hatten wir bis gestern diesen Fehler, dass halt nichts in "zeiten" gespeichert wird. Ich wäre schon glücklich, wenn wir einfach nur diesen finden, anstatt jetzt wieder alles mögliche Zeugs reinzubasteln, bei dem Ende wahrscheinlich noch weniger funktioniert als jetzt ...
 
1) mit der prID ist die id deines projektes gemeint - ergo brauchste die spalte nich extra.

2) hab ich doch erklärt. wenn du es einfach möchtest, lösch zumindest die spalte userid aus projekte. es gibt einfach einen unnötigen mehraufwand, wenn wir die hier "korrekt" mitspeichern. ist in dem bisherigen sinne ("das projekt von MA xyz") bringt das nur unnötige rudundanzen (wer am projekt arbeitet, steht in zeiten). und was schiefgehn kann, hab ich mit hans und meier erklärt. WENN du die redundanz drinne lässt, MUSST du bei der abfrage des projekts auch auf die userid prüfen! das machst du derzeit nicht -> gibt 100% nen fehler irgendwann.

damit du die spalten nich löschen musst, hatte ich eben ersatzweise den plan erdacht, die umzufunktionieren. aus userid im sinne von "dem gehört das projekt" wird userid im sinne von "der user hat zuletzt was an den projekt-daten geändert (nicht die zeitdaten)". zusätzlich könnte man aus erstellt im sinne von "dann und dann wurde der datensatz angelegt" ein "zu diesem zeitpunkt wurde der datensatz geändert" machen. WENN du das allerdings dann so umdeutest (wie ichs vorgeschlagen hätte), darfst du eben nicht "blind" immer den datensatz überschreiben (auch wenn sich nix ändert). denn dann geht der neue sinn unserer spalten schlicht verloren. man sieht nur mit glück eine tatsächliche änderung (ein update von 1 auf 1 ist keine änderung der daten ^^).

du hast also szs 3 möglichkeiten:
- so lassen wie es jetzt ist, dann musst du beim abfragen der projekte den user mit abfragen (bei where) und du hast halt unnötig viele projekt-datensätze, da gleiche projekte für jeden user getrennt angelegt werden.
- daher wäre ich erstmal grundsätzlich für lösung 2: scheiss auf die user-id in projekte ^^ alle user beziehen sich auf das selbe projekt. keine redundanz, keine unnötigen datensätze, bissl weniger aufwand. musst allerdings auch die ganzen sql strings checken ^^
- optional als ergänzung zu lösung 2 wäre lösung 3: behalte die userid spalte und nutze sie in einem anderen sinn (wie oben erklärt). musste halt checken, ob ein update nötig ist oder nicht (sonst ist wie gesagt der sinn der userid usw im eimer und du kannst es gleich bleiben lassen).

3) hans und meier sollten dir das jetz nicht unbedingt verdeutlichen. es ging darum, WIE ein fehler passieren kann. du hast 2 datensätze 1 1 1 und 1 1 2 und fragst nur die ersten beiden ab - bekommst also beide geliefert, verarbeitest aber dann nur den ersten, obwohl du eventuell den 2. gebraucht hättest. nachm speichern haste dann ggf 2 datensätze 1 1 2 und 1 1 2 <- *russisch akzent* grosses haufen mist!

und generell: wäre ein "kostenloses" zusatzfeature schlecht? :P nur weils ne olle excel tabelle nich kann, muss man doch ne db-anwendung nich künstlich mit mehraufwand beschneiden, um sie im funktionsumfang wieder aufs selbe level runterzustutzen ^^
 
Also, ich habe jetzt mal versucht, einfach nur deine zweite Möglichkeit zu basteln, indem ich die Spalte "userid" aus projekte gelöscht und auch aus allen querys, die projekte betreffen, entfernt habe. Das Resultat ist jetzt allerdings, dass leider gar nichts in die DB geschrieben wird ... :(

formular.php
PHP:
<?php         
    $erstellt = date('Y-m-d H:i:s'); 
    
    if (isset($_GET['section'])) {
        $section = $_GET['section'];
    }
    
    // seiten-titel bestimmen
    if (isset($_POST['btnRegForm']) or $section == "register") {
        $site_title = "Registrieren";
        $section = "register";
    }
    if (isset($_POST['auswerten']) or $section == "output") {
        $site_title = "Ausgabe";
        $section = "output";
    }
    if (isset($_POST['auswertenadmin']) or $section == "output_admin") {
        $site_title = "Ausgabe (Admin)";
        $section = "output_admin";
    }
    if (isset($_POST['btnRegCancel'])) {
        $site_title = "Login";
        $section = "login";
    }
    if (isset($_POST['btnOutputCancel'])) {
        $site_title = "Projektzeiterfassung";
        $section = "pze";
    }

    // hiddenfields-daten speichern
    if (isset($_POST['add'])) {
        $add = $_POST['add'];
    }
    if (isset($_POST['wa'])) {
        $wochenanfang = $_POST['wa'];
    }
    if (isset($_POST['we'])) {
        $wochenende = $_POST['we'];
    }

    if (isset($_POST['prevWeek'])) {
        $wochenanfang -= 60 * 60 * 24 * 7;
        $wochenende   -= 60 * 60 * 24 * 7;
    }
    if (isset($_POST['nextWeek'])) {
        $wochenanfang += 60 * 60 * 24 * 7;
        $wochenende   += 60 * 60 * 24 * 7;
    }

    $kw = date('W', $wochenanfang);
    $jahr = date('Y', $wochenanfang);
    $monat = date('n', $wochenanfang);
    $tag = date('j', $wochenanfang);

    if (isset($_POST['addLine'])) {
        $add++;
    }
    if (isset($_POST['remLine'])) {
        $add--;
    }
    if ($add < 1) {
        $add = 1;
    }
    
    if (isset($_POST['btnLog'])) {
        $username = $_POST['username'];
        $erg = mysqli_query($mysqli, "SELECT * FROM user WHERE name='".$username."'");
        $row = mysqli_fetch_object($erg);
        $password = hash('sha512', ($_POST['password']).$salt);
        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';
        } else {
            $protokoll .= '- Benutzername und/oder Passwort waren falsch oder nicht registriert.<br>';
        }
    }
    
    if (isset($_POST['logout'])) {
        logout();
    }
    
    if (isset($_POST['btnReg'])) {
         if (isset($_POST['username'], $_POST["password"], $_POST["password2"])  and trim($_POST["username"]) != "" and trim($_POST["password"]) != ""  and trim($_POST["password2"]) != "") {
            $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 {
                $passwort = hash('sha512', ($passwort).$salt);
                if ($username == "test") {
                    $rechte = 0;
                } else {
                    $rechte = 1;
                }

                $check = mysqli_query($mysqli, "SELECT * FROM user WHERE name='".$username."';");
                if (mysqli_num_rows($check)) {
                    $protokoll .= '- Benutzername schon vorhanden.<br>';
                    $_POST['btnRegForm'] = true;
                    unset($_POST['btnReg']);
                    $site_title = "Registrieren";
                } else {
                     $eintragen = mysqli_query($mysqli, "INSERT INTO user (name,  passwort,  rechte) VALUES ('$username', '$passwort', '$rechte')");
                    if ($eintragen) {
                        $protokoll .= '- Benutzer <b>'.$username.'</b> wurde  erstellt.';
                    } else {
                        $protokoll .= '- Fehler: Der Benutzername war schon vorhanden.';
                        $_POST['btnRegForm'] = true;
                        unset($_POST['btnReg']);
                        $site_title = "Registrieren";
                    }
                }
            }
        } else {
            $protokoll .= '- Eingabefehler. Bitte alle Felder korrekt ausfüllen.<br>';
            $_POST['btnRegForm'] = true;
            unset($_POST['btnReg']);
            $site_title = "Registrieren";
        }
    }
    
    if (isset($_POST['confirm'])) {
        for ($a = 1; $a <= $add; $a++) {
             $check = mysqli_query($mysqli, "SELECT * FROM projekte WHERE  taetigkeit='".$_POST['taetigkeit'.$a]."' AND  produkt='".$_POST['product'.$a]."';");
            if ($check) {
                $row = mysqli_fetch_assoc($check);
                $taetprodid = $row['id'];
                 if ($row['taetigkeit'] != $_POST['taetigkeit'.$a] or  $row['produkt'] != $_POST['product'.$a] or $row['beschreibung'] !=  $_POST['beschreibung'.$a]) {
                    $eintragen1 =  mysqli_query($mysqli, "UPDATE projekte SET  taetigkeit='".$_POST['taetigkeit'.$a]."',  produkt='".$_POST['product'.$a]."',  beschreibung='".$_POST['beschreibung'.$a]."', erstellt='$erstellt')  WHERE id='$taetprodid';");  
                }
            } else {
                 $eintragen1 = mysqli_query($mysqli, "INSERT INTO projekte  (taetigkeit, produkt, beschreibung, erstellt) VALUES  ('".$_POST['taetigkeit'.$a]."', '".$_POST['product'.$a]."',  '".$_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];                              
                     $check = mysqli_query($mysqli, "SELECT * FROM zeiten  WHERE taetprodid='".$taetprodid."' AND userid='".$userid."' AND  datum='".$ts."';");
                    if ($check) {
                        $row = mysqli_fetch_assoc($check);
                        if ($row['zeit'] != $dauer) {
                             $eintragen2 = mysqli_query($mysqli, "UPDATE  zeiten SET zeit='".$dauer." WHERE id='".$row['zeit']."';"); 
                        }
                    } else {
                         $eintragen2 = mysqli_query($mysqli, "INSERT INTO  zeiten (userid, taetprodid, zeit, datum) VALUES ('$userid',  '$taetprodid', '$dauer', '$ts')");
                    }
                }
            }
        }
    }
    
    function startsWith($haystack, $needle) {
        return $needle === "" || strpos($haystack, $needle) === 0;
    }
        
    foreach($_POST as $key => $val) {
        if (startsWith($key, 'save')) {
            $prID = (int)substr($key, 4);
            if (isset($_POST['save'.$prID])) {
                 mysqli_query($mysqli, "UPDATE projekte SET  taetigkeit='".$_POST['taetigkeit']."', produkt='".$_POST['product']."',  beschreibung='".$_POST['beschreibung']."' WHERE id='".$prID."'");
                for ($b = 0; $b < 7; $b++) {
                    $ts = $wochenanfang + ($b * 60 * 60 * 24);
                    $dauer = $_POST[$ts]; 
                    if ($dauer == "") { 
                         mysqli_query($mysqli, "DELETE FROM zeiten WHERE  userid='".$userid."' AND datum='".$ts."' taetprodid='".$prID."'");
                    } else {
                         if (mysqli_query($mysqli, "SELECT * FROM zeiten  WHERE userid='".$userid."' AND datum='".$ts."' AND  taetprodid='".$prID."'")) {
                             mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE  taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
                        } else {
                             mysqli_query($mysqli, "INSERT INTO zeiten  (zeit) VALUES ('$dauer') WHERE taetprodid='".$prID."' AND  datum='".$ts."' AND userid='".$userid."'");
                        }
                    }
                }
            }
        }
    }  
    
    if (isset($_POST['export'])) {
        include('export.php');
    }
Außerdem verstehe ich immer noch nicht, ob ich die foreach-Schleife mit dem key überhaupt (noch) brauche. Macht die nicht irgendwie das selbe, wie das ganze Zeug von "confirm"?
 
confirm ist fürs speichern neuer datensätze da, die for-schleife versucht den save-button zum editieren zu finden. also grundsätzlich 2 verschiedene aktionen, die (wie du richtig erkannt hast) ähnliche funktionen erfüllen.
 
@ DarkMo
Damit kann ich zumindest davon ausgehen, dass der Fehler, warum jetzt nichts in der DB landet, irgendwo in dem "cofirm" Konstrukt drinnen sein muss?!

Dann check ich nochml die querys ...

Vielleicht habe ich nur gerade einen Denkfehler, aber irgendwie irritiert mich diese Zeile gerade:
PHP:
$eintragen1 = mysqli_query($mysqli, "UPDATE projekte SET taetigkeit='".$_POST['taetigkeit'.$a]."', produkt='".$_POST['product'.$a]."', beschreibung='".$_POST['beschreibung'.$a]."', erstellt='$erstellt') WHERE id='$taetprodid';");
In projekte gibt's doch gar keine "taetprodid" (die ist ja erst in zeiten). Woher soll er also wissen, wo (WHERE) er das in der DB hinschreiben soll?!

Jedenfalls landet er (über "echo-Debugging" festgestellt) sofort im UPDATE, aber das hatten wir glaube ich eh schon Ende letzter Woche.

[EDIT]
Wenn ich beide $check "negiere" (!$check), dann funktioniert alles (auch das UPDATEn bestehender Werte in projekte und zeiten), nur nicht das Löschen bestehender Werte und Einfügen neuer in bisher leeren Feldern.

Irgendwo hier liegt der Hund begraben:
PHP:
if ($dauer == "") { 
     mysqli_query($mysqli, "DELETE FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' taetprodid='".$prID."'");
} else {
     if (mysqli_query($mysqli, "SELECT * FROM zeiten WHERE userid='".$userid."' AND datum='".$ts."' AND taetprodid='".$prID."'")) {
         mysqli_query($mysqli, "UPDATE zeiten SET zeit='".$dauer."' WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
     } else {
         mysqli_query($mysqli, "INSERT INTO zeiten (zeit) VALUES ('$dauer') WHERE taetprodid='".$prID."' AND datum='".$ts."' AND userid='".$userid."'");
     }
}

[EDIT2]
Wenn ich in dem Code "if ($dauer != "") { " sage und ein * nach DELETE einfüge, dann wird zumindest eine unerwünschte Zeitangabe schon mal durch 0 ersetzt. Ich will aber, dass der ganze Eintrag in der DB gelöscht wird!
 
Zuletzt bearbeitet:
Zurück