Werk Rooster script
Pagina: « vorige 1 2 3 volgende »
Ik kan het ook maar per keer toevoegen. Dat is ook niet echt handig..
Man wat zit ik hier in vast hahah
Je kunt in een <form> niet telkens name="werktijden" terug laten komen. Wat wel mag is dit
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?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>
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>
Toevoeging op 26/11/2014 19:31:00:
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
Gewijzigd op 26/11/2014 19:32:27 door Frank Nietbelangrijk
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?
Gewijzigd op 26/11/2014 19:48:21 door Sander Haug
Indien true: Handel de rest af.
Indien false: toon mysql_error() (bij voorkeur alleen voor beheerders).
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
Gewijzigd op 26/11/2014 19:53:19 door Frank Nietbelangrijk
Ik kan redelijk PHP'en maar dit stijgt me boven de pet. Ook al wil ik het graag leren.
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 ;-) )
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.
Frank Nietbelangrijk op 26/11/2014 20:06:09:
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.
Heb ik herschreven. Het was UserID en dat heb ik veranderd..
Je probleem is dus opgelost, neem ik aan?
http://www.phptuts.nl/view/39/6/
Daarnaast zie je in mijn code hoe ik de volledige $_POST op het scherm dump. Doe dat ook eens met je oude code en zie het verschil.
Om de code te begrijpen moet je echt eens met array's bezig zijn geweest. Daarnaast zie je in mijn code hoe ik de volledige $_POST op het scherm dump. Doe dat ook eens met je oude code en zie het verschil.
Ik heb mijn database tabel: roster, aangepast naar de tabellen: Username, WorkTime1 .. t/m 7.
In de PHP output komt er het volgende te staan:
Code (php)
1
INSERT INTO roster(Username, WorkTime1, WorkTime2, WorkTime3, WorkTime4, WorkTime5, WorkTime6, WorkTime7) VALUES ('1','06:00','','','','','','')
Ik heb idd één waarde ingevoerd, puur als test. Alleen in mijn database verschijnt die 0600 niet. Want daar komt te staan:
Dus hier gaat ook iets mis. :S
Toevoeging op 26/11/2014 20:16:43:
Ja. wat is het type van die WorkTime? kolommen? DATE of DATETIME?
Je moet er voor gaan zorgen dat er dit komt te staan:
Dus ik denk dat ik dan even in de INSERT query moet snuffelen?
Want daar stuur je wel de $tijden mee, maar niet de data?
Daarom moet je dus de juiste datum weten en de tijd naar het formaat hh:mm:ss zetten met tussen de datum en de tijd een spatie
dan gaan mijn vingers jeuken. Want wat nu als je straks 20 WorkTimes hebt? Ga je dan steeds de code aanpassen? Ik zou zeker eens kijken naar Normalisatie in SQL, want velden moet je nooit nummeren, dat is vragen om moeilijkheden.
Correct Aar maar van ondergeschikt belang. En er zullen altijd zeven dagen in de week blijven dus zou ik zeggen voor een schoolopdracht: laat maar even.
Klopt, ik heb er nu ook second thoughts over. Maar wat vindt u dan een alternatief? Dat ik wel 7 dagen aan werktijden kwijt kan?