Goedenavond,

Ik heb een probleem en ik zie momenteel even de bomen door het bos niet meer.
Voor het vak informatica moeten we een praktische opdracht doen met een zelf gekozen onderwerp.
Nu maken wij een werknemers website voor een zeker bedrijf.
De inlog/registratie/uitlog en index pagina staan.
Ook heb ik hierbij een extra pagina gemaakt om het rooster te kunnen maken, als je niet de functie filiaalmanager hebt dan kom je er niet op. Als default staat er dat je hulpkracht bent.

Echter nu komt het probleem,
Ik heb een tabel gemaakt met de data's en uiteraard de gebruikers (verkregen uit de database door middel van een query en een while-loop). In de cellen staan text fielden waar je de werktijden in kunt vullen, welke daarna in de database komen te staan. De andere werknemers kunnen dan op hun beurt de gegevens uitlezen en hun eigen rooster zien. Dat is het idee.

Maar wanneer ik op de submit knop druk, voert hij alle waarden in behalve de username. Daar stoort het 'm. Want eerst had ik de username die op dat moment ingelogd was, ik (Sander) dus. Dus wanneer ik dan een tijd voor een andere werknemer invul, pakt het systeem hem niet.

Dit kan ik het beste aan de hand van het voorbeeld hanteren.
Er werken twee werknemers, Sander en Victor. Sander is de filiaalmanager en Victor de hulpkracht.
Sander maakt dus het rooster voor hemzelf en Victor. Wanneer Sander het rooster voor Sander invult, pakt het systeem hem en komt er ook in de tabel te staan: Username; Sander, WerkTijd1: ... etc. Voor Victor pakt hij hem niet en vult hij in het veld niet de username Victor in.

De vraag is nu: Hoe pak ik een specifieke variable uit de while loop en vul de username daarbij in?

Help help help.

De broncode volgt hieronder.
<?php
include_once "includes/config.php";
?>
<html>
<head>
</head>
<body>
<?php
if(empty($_SESSION['LoggedIn']) && empty($_SESSION['Username']))
{
    header("Location: login.php");
}
else
{
	if($_SESSION['Function'] != "Filiaalmanager")
	{	
	echo "Je bent niet bevoegd om deze pagina te bekijken. Je wordt terug gestuurd.";
	echo "<meta http-equiv=\"refresh\" content=\"2;url=index.php\">";
	}
	else
	{
	$maandag = date("d/m/Y");
	$dinsdag = date("d/m/Y", time()+86400);
	$woensdag = date("d/m/Y", time()+172800);
	$donderdag = date("d/m/Y",  time()+259200);
	$vrijdag = date("d/m/Y", time()+432000);
	$zaterdag = date("d/m/Y", time()+518400);
	$zondag = date("d/m/Y", time()+604800);
	
	$resultaat = mysql_query("SELECT Username FROM users");
	
     ?>
 
     <h1>Filiaalmanagers pagina</h1>
     <p>Welkom <b><?php echo $_SESSION['Username'];?></b>.</p>
	 
	 <form name = "rooster" method = "post" action = "<?php echo $_SERVER['PHP_SELF'];?>">
	 <table border = "1">
	 <tr>
		<th>Naam</th>
		<th><?php echo $maandag;?></th>
		<th><?php echo $dinsdag;?></th>
		<th><?php echo $woensdag;?></th>
		<th><?php echo $donderdag;?></th>
		<th><?php echo $vrijdag;?></th>
		<th><?php echo $zaterdag;?></th>
		<th><?php echo $zondag;?></th>
	 </tr>
	 <?php
	 while ($row = mysql_fetch_assoc($resultaat))
	 {
	 ?>
	 
	 <tr>
	 <?php
	 echo "<td>" . $row['Username'] . "</td>";
	 echo "<td><input type = 'text' size = '10' name = 'werktijd1'></td>";
	 echo "<td><input type = 'text' size = '10' name = 'werktijd2'></td>";
	 echo "<td><input type = 'text' size = '10' name = 'werktijd3'></td>";
	 echo "<td><input type = 'text' size = '10' name = 'werktijd4'></td>";
	 echo "<td><input type = 'text' size = '10' name = 'werktijd5'></td>";
	 echo "<td><input type = 'text' size = '10' name = 'werktijd6'></td>";
	 echo "<td><input type = 'text' size = '10' name = 'werktijd7'></td>";
	 ?>
	 </tr>
	 <?php
	 }
	 ?>
	 </table>
	 
	 <input type = "submit" name = "submit" value = "Verstuur naar database">
	 
	 </form>
	 
	 <li><a href = "index.php">Index</a></li> 
	 <li><a href = "logout.php">Log uit</a></li> 
     <?php
	 if($_POST['submit']){
		$gebruiker = mysql_fetch_assoc($resultaat);
		$werktijd1 = $_POST['werktijd1'];
		$werktijd2 = $_POST['werktijd2'];
		$werktijd3 = $_POST['werktijd3'];
		$werktijd4 = $_POST['werktijd4'];
		$werktijd5 = $_POST['werktijd5'];
		$werktijd6 = $_POST['werktijd6'];
		$werktijd7 = $_POST['werktijd7'];	

		$sql = mysql_query("INSERT INTO `roster`(`Username`, `WorkDate1`, `WorkDate2`, `WorkDate3`, `WorkDate4`, `WorkDate5`, `WorkDate6`, `WorkDate7`, `WorkTime1`, `WorkTime2`, `WorkTime3`, `WorkTime4`, `WorkTime5`, `WorkTime6`, `WorkTime7`) 
		VALUES ('".$gebruiker."','".$maandag."','".$dinsdag."','".$woensdag."','".$donderdag."','".$vrijdag."','".$zaterdag."','".$zondag."','".$werktijd1."','".$werktijd2."','".$werktijd3."','".$werktijd4."','".$werktijd5."','".$werktijd6."','".$werktijd7."')");
		
		
		if($sql){
			echo "Succes";
		}
		else{
			echo "Error";
		}
	 }
	 
}
}
?>
</body>
</html>


[size=xsmall]Toevoeging op 25/11/2014 20:56:15:[/size]

PS. Ik gebruik nog mysql_ . Het is puur voor een opdracht. Als ik MySqli gebruik snapt mn docent het niet meer. Hij snapt het nu al niet meer want hij kan me al niet meer helpen. -_-
Dan zou ik meer van de structuur moeten weten, maar goed... gezien het om dagen gaat zal er tot in de verre toekomst geen WorkTime8 bij komen.

Zoals Frank zegt, laten we de lat maar even wat lager leggen, gezien het om een schoolopdracht gaat.
Om je vraag te beantwoorden:

je zou gewoon een tabel diensten kunnen maken waarin je per record 1 dienst voor 1 medewerker opslaat

diensten
========================================================
id | user_id | beginnen            | eindigen
========================================================
1  | 1       | 2014-12-01 06:00:00 | 2014-12-01 14:00:00 
2  | 1       | 2014-12-02 06:00:00 | 2014-12-02 14:00:00 
3  | 2       | 2014-12-01 14:00:00 | 2014-12-01 20:00:00 
4  | 2       | 2014-12-02 14:00:00 | 2014-12-02 20:00:00 

Maar voor nu zou ik dat nog maar even vergeten.
(Wanneer moet je opdracht ingeleverd worden)
16 december zou ik het in moeten leveren.
Ik ben verantwoordelijk voor het PHP gedeelte en de rest is verantwoordelijk voor het HTML gedeelte.
We doen het met zn 3'en.

Maar wat ik nu wel apart vindt, is dat als ik op Submit druk, dan komen er in de tabellen géén tijden te staan. Ik moet serieus dan in het textfield zetten:

26/11/11-06:00:00

Dus je suggestie Frank vindt ik wel een erg goede. Dan moet ik alleen de tabel even ombouwen.
Alleen hoe moet ik dat dan aanpakken query gewijs?
Een INSERT query gaat altijd met één tabel en één record tegelijk. daar veranderd dus weinig aan.

Stel dat je voor de tabel diensten nu alle records wilt hebben van een werknemer met user_id 2, maar je wilt ook de naam van deze werknemer laten zien dan kun je dat oplossen met twee SELECT queries:

1:

SELECT name FROM users WHERE user_id=2

2:

SELECT beginnen, eindigen FROM diensten WHERE user_id=2


Dit is echter ook beter en sneller op te lossen met één query:

SELECT
	users.name, diensten.beginnen, diensten.eindigen
FROM
	diensten
JOIN
	users
ON
	diensten.user_id = users.user_id
WHERE
	diensten.user_id=2
Duidelijk. Dat snap ik nu.
Maar hoe voer ik dan de data in met tijden van beginnen/eindigen met het door u geschreven script?..
Tabel 'diensten' maken met de kolommen:
-id (integer, auto increment, primary index)
-user_id (integer, index)
-beginnen (datetime)
-eindigen (datetime)

dan is dit het script:

<?php

session_start();

mysql_connect('localhost', 'frank', 'pass');
mysql_select_db('test');

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
    // laat ons even zien wat er de $_POST array zit!
    echo '<pre>';
    print_r($_POST);
    echo '</pre>';

    /* 
     * Loop door alle elementen van de array $_POST['werktijd'] waarbij de array-key het userId is
     * en de array-waarde ook weer een array is van 7 weekdagen (index 0 t/m 6).
     */
    foreach ($_POST['werktijd'] as $userId => $dagen)
    {
        /*
         * Loop door de 7 weekdagen. Iedere weekdag is wederom een array met drie elementen:
         * - datum
         * - beginnen
         * - eindigen
         */
        foreach ($dagen as $dag)
        {
            /*
             * Voordat we een dienst in de database willen opslaan moeten $dag['beginnen']
             * en $dag['eindigen'] wel een waarde hebben. Met andere woorden als één van 
             * de twee leeg is dan slaan we de dienst niet op in de database.
             */
            if(strlen($dag['beginnen']) && strlen($dag['eindigen']))
            {
                // maak van de tijden een volledige mysql-datetime formaat (YY-mm-dd HH:ii:ss)
                $beginnen = $dag['datum'] . ' ' . $dag['beginnen'] . ':00';
                $eindigen = $dag['datum'] . ' ' . $dag['eindigen'] . ':00';
                
                // INSERT query opbouwen
                $sql = "INSERT INTO diensten (user_id, beginnen, eindigen) 
                VALUES ('".$userId."','".$beginnen."','".$eindigen."')";
                echo $sql . '<br>';

                if(mysql_query($sql) === FALSE)
                    echo 'Kon data niet opslaan in de database<br>'; 
            }
        }
    }
}
     

$tableHeaders = array('<th>naam</th>');
$tableHeaders2 = array('<th></th>');
for($i = 0 ; $i < 7 ; $i++)
{
    $tableHeaders[] = '<th colspan="2">'.date("d/m/Y", time()+($i*86400)).'</th>';
    $tableHeaders2[] = '<th>beginnen</th><th>eindigen</th>';
}

$resultaat = mysql_query("SELECT id,Username FROM users");
?>
<!DOCTYPE html>
<html>
    <head>
        <title>Roster</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>Filiaalmanagers pagina</h1>
        <p>Welkom <b><?php echo $_SESSION['Username'];?></b>.</p>

        <form action = "" method="post" >
            <table>
                <tr>
                    <?php foreach($tableHeaders as $header) echo $header; ?>
                </tr>
                <tr>
                    <?php foreach($tableHeaders2 as $header) echo $header; ?>
                </tr>
                <?php while ($row = mysql_fetch_assoc($resultaat)) { ?>
                    <tr>
                        <td><?php echo $row['Username']; ?></td>
                         <?php for($i = 0 ; $i < 7 ; $i++) { ?>
                              <input type="hidden" name="<?php echo 'werktijd['.$row['id'].']['.$i.'][datum]'; ?>" value="<?php echo date("Y-m-d", time()+($i*86400)); ?>">
                            <td><input type="time" name="<?php echo 'werktijd['.$row['id'].']['.$i.'][beginnen]'; ?>"></td>
                            <td><input type="time" name="<?php echo 'werktijd['.$row['id'].']['.$i.'][eindigen]'; ?>"></td>
                        <?php } ?>
                    </tr>
                <?php } ?>
            </table>

            <input type="submit" value="Verstuur naar database">

        </form>

        <li><a href = "index.php">Index</a></li> 
        <li><a href = "logout.php">Log uit</a></li> 
    </body>
</html>


Jaaa het draaaaaait! Super bedankt Frank.
Ik was hier nooit zelf op gekomen. Super bedankt voor de duw in de goede richting!

Ik neem aan dat ik de data uit de tabel diensten trek met de query uit je vorige post?
Dan moet het helemaal goed komen!

In een woord SUPER!

[size=xsmall]Toevoeging op 27/11/2014 13:12:07:[/size]

Ik ondervind nu wat problemen met het uitlezen van de data en deze te outputten in een tabel.
Want als we bijvoorbeeld alle werktijden willen hebben voor werknemer ID 2, hoe doen we dat dan in een tabel met de kolommen:

Naam datum beginnen eindigen ?

De naam kan ik uitlezen. Alleen dan de andere 3 kolommen?..
Hoi Sander,

Ik doe dat zelf altijd met de DateTime class van PHP:
<?php
// we hebben twee datetime kolommen in de tabel diensten:
$beginnen = new DateTime( $row['beginnen'] );
$eindigen = new DateTime( $row['eindigen'] );

// begin datum:
echo $beginnen->format('d-m-Y');

// begin tijd:
echo $beginnen->format('H:i');

// eind datum:
echo $eindigen->format('d-m-Y');

// eind tijd:
echo $eindigen->format('H:i');
?>

P.S. We kunnen de tabel diensten nog aanpassen en in plaats van twee datetime kolommen twee time kolommen en één date kolom maken als je dat prettiger vindt. Dat is een minimale aanpassing.

Reageren