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. -_-
Ja, dat zie ik nu ook. Dan wordt er maar één rij verwerkt.
Ik kan het ook maar per keer toevoegen. Dat is ook niet echt handig..
Man wat zit ik hier in vast hahah
Ik hoop dat je een beetje bekend bent met array's want zonder dat is het bijna niet te doen om te maken wat je graag wil.

Je kunt in een <form> niet telkens name="werktijden" terug laten komen. Wat wel mag is dit

name="werktijden[]"


Nu worden alle velden van die naam in een array teruggegeven.

Paar algemene tips:
1) schrijf bovenin je script eerst alle PHP logica en begin onderin pas met de output
2) zodra je telkens moet gaan schrijven werktijd1, werktijd2 etc dan moet je stoppen en overstappen op een array. Misschien best even lastig in het begin maar daar kom je doorheen.
3) Controleer of een formulier verzonden is met if($_SERVER['REQUEST_METHOD'] == 'POST')
4) hou de action="" attribuut leeg en het formulier wordt naar hetzelfde script verstuurd.
5) $_POST is ook gewoon een array. array's kun je met print_r() op het scherm weergeven
6) gebruik bij je attributen in HTML double quotes (")

Het onderstaande script werkt al aardig. Ik liep alleen tegen het probleem aan dat je zeven datums en zeven tijden wilt gaan wegschrijven in de database. Dat zou ik niet doen. Maak gewoon zeven datetime fields aan in je database. in 1 veld past dan zowel de datum als de tijd. Dus daar moet je nog even aan werken. Zorg ook dat je volledig begrijpt hoe onderstaand script werkt anders sta je weer met een mond vol tanden straks. Ik heb de beveiliging achterwege gelaten dus die moet je er weer even inplakken.



<?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>';

    foreach ($_POST['werktijd'] as $userId => $tijden)
    {
        $sql = "INSERT INTO roster(Username, WorkDate1, WorkDate2, WorkDate3, WorkDate4, WorkDate5, WorkDate6, WorkDate7, WorkTime1, WorkTime2, WorkTime3, WorkTime4, WorkTime5, WorkTime6, WorkTime7) 
        VALUES ('".$userId."','".implode("','", $tijden)."')";
        echo $sql . '<br>';
        
        if(mysql_query($sql) === FALSE)
            echo 'Kon data niet opslaan in de database<br>';
    }
}
     

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

$resultaat = mysql_query("SELECT id,Username FROM users");
?>
<html>
    <head>
    </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>
                <?php while ($row = mysql_fetch_assoc($resultaat)) { ?>
                    <tr>
                        <td><?php echo $row['Username']; ?></td>
                        <?php for($i = 0 ; $i < 7 ; $i++) { ?>
                            <td><input type="text" size="10" name = "<?php echo 'werktijd['.$row['id'].']['.$i.']'; ?>"></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>


[size=xsmall]Toevoeging op 26/11/2014 19:31:00:[/size]

Let even op regel 31 en regel 49. Hier kom je 'id' tegen. dit is het user id uit de tabel users. Kan zijn dat jij user_id hebt in je database of iets dergelijks.

Ook moet je nog even fatsoenlijke foutafhandeling inbouwen bij al je mysql_* regels zoals ik dan wel al gedaan heb op regel 21
Super! Ik volg je gedachtegang. Alleen krijg ik nu de foutmelding:

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in...

Dit komt omdat je in de query zoekt naar Userid EN Username..

Plus de volgende meldingen:
[
Notice:__Undefined_index:_id_in_D:\Informatica\USBWebserver_v8_5\8_5\root\Lidl\fm_php_on_line_61
werktijd] => Array

Notice: Undefined index: werktijd in D:\Informatica\USBWebserver v8.5\8.5\root\Lidl\fm.php on line 30

Warning: Invalid argument supplied for foreach() in D:\Informatica\USBWebserver v8.5\8.5\root\fm.php on line 30
Hoe kan ik dit oplossen?
Er zal wel foutafhandeling missen op lijn 31. Kijk of $resultaat true of false is.
Indien true: Handel de rest af.
Indien false: toon mysql_error() (bij voorkeur alleen voor beheerders).
Nee dit komt omdat je connectie niet lukt. even je username password en dergelijke instellen?
Nogmaals: foutafhandeling inbouwen in alle mysql_* functies!

OP php.net vind je voor iedere PHP functie welke waarden de functie terug kan geven bij Return Values. kijk maar eens bij bijvoorbeeld http://php.net/manual/en/function.mysql-connect.php Je ziet dan bij Return Values:

Returns a MySQL link identifier on success or FALSE on failure.


Je moet dus altijd testen of deze functie soms FALSE terug geeft en dan een nette foutmelding genereren
Ik voel me echt dom nu maar hoe doe ik dat?
Ik kan redelijk PHP'en maar dit stijgt me boven de pet. Ook al wil ik het graag leren.
zie vorige topic?

p.s.
Sander Haug op 26/11/2014 19:51:03

Ik voel me echt dom nu maar hoe doe ik dat?


Wees duidelijk in je vraagstelling. wat bedoel je met 'dat'?

( We hebben geen glazen bol ;-) )
In de volgende screens komen de foutmeldingen naar voren.
Ik hoop dat dat verduidelijkt.
Excuses voor de verwarring haha.

Afbeelding 1:


Afbeelding 2:



Let even op regel 31 en regel 49. Hier kom je 'id' tegen. dit is het user id uit de tabel users. Kan zijn dat jij user_id hebt in je database of iets dergelijks.
Relevante code rond die lijnen graag.

Reageren