foreach loop
Ik leer op school de PDO methode om verbinden met mysql te maken maar gebruik liever mysql_connect...
Nu heb ik met PDO de volgende (werkende) foreach loop gemaakt:
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
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
<?php
session_start();
try {
$db = new PDO('mysql:host=localhost;dbname=planner','admin','hoi');
}
catch(PDOException $e) {
echo $e->getMessage();
}
$sql = "SELECT * FROM tasks WHERE tsk_ID = $_POST[verstopt]";
$resultaat = $db->query($sql);
foreach($resultaat as $row) {
$_SESSION['Tid'] = $row[tsk_ID];
$_SESSION['Tvak'] = $row[tsk_subj];
$_SESSION['Ttitel'] = $row[tsk_title];
$_SESSION['Ttxt'] = $row[tsk_txt];
$_SESSION['TsJ'] = $row[tsk_start_date];
$_SESSION['TsM'] = $row[tsk_start_date];// dag,maand,jaar etc wordt gekozen in index.php
$_SESSION['TsD'] = $row[tsk_start_date];
$_SESSION['TeJ'] = $row[tsk_end_date];
$_SESSION['TeM'] = $row[tsk_end_date];
$_SESSION['TeD'] = $row[tsk_end_date];
$_SESSION['Tdone'] = $row[tsk_done];
}
$db = NULL;
?>
session_start();
try {
$db = new PDO('mysql:host=localhost;dbname=planner','admin','hoi');
}
catch(PDOException $e) {
echo $e->getMessage();
}
$sql = "SELECT * FROM tasks WHERE tsk_ID = $_POST[verstopt]";
$resultaat = $db->query($sql);
foreach($resultaat as $row) {
$_SESSION['Tid'] = $row[tsk_ID];
$_SESSION['Tvak'] = $row[tsk_subj];
$_SESSION['Ttitel'] = $row[tsk_title];
$_SESSION['Ttxt'] = $row[tsk_txt];
$_SESSION['TsJ'] = $row[tsk_start_date];
$_SESSION['TsM'] = $row[tsk_start_date];// dag,maand,jaar etc wordt gekozen in index.php
$_SESSION['TsD'] = $row[tsk_start_date];
$_SESSION['TeJ'] = $row[tsk_end_date];
$_SESSION['TeM'] = $row[tsk_end_date];
$_SESSION['TeD'] = $row[tsk_end_date];
$_SESSION['Tdone'] = $row[tsk_done];
}
$db = NULL;
?>
Dit werkt. Nu wil ik dit omzetten naar mysql_connect ipv dat PDO en heb het volgende:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
session_start();
$con = mysql_connect("localhost","admin","hoi");
if (!$con) die('Could not connect: '.mysql_error());
mysql_select_db("planner", $con);
$sql = "SELECT * FROM tasks WHERE tsk_ID = $_POST[verstopt]";
$resultaat = mysql_query($sql,$con);
foreach($resultaat as $row) {
$_SESSION['Tid'] = $row[tsk_ID];
$_SESSION['Tvak'] = $row[tsk_subj];
$_SESSION['Ttitel'] = $row[tsk_title];
$_SESSION['Ttxt'] = $row[tsk_txt];
$_SESSION['TsJ'] = $row[tsk_start_date];
$_SESSION['TsM'] = $row[tsk_start_date];// dag,maand,jaar etc wordt gekozen in index.php
$_SESSION['TsD'] = $row[tsk_start_date];
$_SESSION['TeJ'] = $row[tsk_end_date];
$_SESSION['TeM'] = $row[tsk_end_date];
$_SESSION['TeD'] = $row[tsk_end_date];
$_SESSION['Tdone'] = $row[tsk_done];
}
?>
session_start();
$con = mysql_connect("localhost","admin","hoi");
if (!$con) die('Could not connect: '.mysql_error());
mysql_select_db("planner", $con);
$sql = "SELECT * FROM tasks WHERE tsk_ID = $_POST[verstopt]";
$resultaat = mysql_query($sql,$con);
foreach($resultaat as $row) {
$_SESSION['Tid'] = $row[tsk_ID];
$_SESSION['Tvak'] = $row[tsk_subj];
$_SESSION['Ttitel'] = $row[tsk_title];
$_SESSION['Ttxt'] = $row[tsk_txt];
$_SESSION['TsJ'] = $row[tsk_start_date];
$_SESSION['TsM'] = $row[tsk_start_date];// dag,maand,jaar etc wordt gekozen in index.php
$_SESSION['TsD'] = $row[tsk_start_date];
$_SESSION['TeJ'] = $row[tsk_end_date];
$_SESSION['TeM'] = $row[tsk_end_date];
$_SESSION['TeD'] = $row[tsk_end_date];
$_SESSION['Tdone'] = $row[tsk_done];
}
?>
Dit geeft echter de volgende error:
Warning: Invalid argument supplied for foreach() in D:\xampp\htdocs\PO3\verwijderen.php on line 13
Naast dit heb ik de vraag of dit ook anders kan. Dit verwijder script wordt opgevraagd als ik op verwijder klik naast een row in een tabel met een heleboel results. Er is telkens maar 1 'resultaat' dus. Waarom dan die foreach loop als er maar 1 is? (dit heb ik uit mijn boek namelijk).
En ja dat met de SESSIONS kan vast makkelijker of beter maar ik ben een beginner dus dat laat ik nu even zo.
Heeft iemand een oplossing? :)
En gebruik geen wildcards met het select geef aan wat je wilt
Antwoord: je maakt van die error een array en van die array maak je een variabel die je op een bepaalde plek laat weergeven
Gewijzigd op 16/12/2010 21:36:59 door Jordi Kroon
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
while($row = mysql_fetch_assoc($resultaat)){
foreach($row as $sleutel => $waarde){
$_SESSION['Tid'] = $sleutel.$waarde;
$_SESSION['Tvak'] = $sleutel.$waarde;
$_SESSION['Ttitel'] = $sleutel.$waarde;
$_SESSION['Ttxt'] = $sleutel.$waarde;
$_SESSION['TsD'] = $sleutel.$waarde;// dag,maand,jaar etc wordt gekozen in index.php
$_SESSION['TeD'] = $sleutel.$waarde;
$_SESSION['Tdone'] = $sleutel.$waarde;
}
}
?>
while($row = mysql_fetch_assoc($resultaat)){
foreach($row as $sleutel => $waarde){
$_SESSION['Tid'] = $sleutel.$waarde;
$_SESSION['Tvak'] = $sleutel.$waarde;
$_SESSION['Ttitel'] = $sleutel.$waarde;
$_SESSION['Ttxt'] = $sleutel.$waarde;
$_SESSION['TsD'] = $sleutel.$waarde;// dag,maand,jaar etc wordt gekozen in index.php
$_SESSION['TeD'] = $sleutel.$waarde;
$_SESSION['Tdone'] = $sleutel.$waarde;
}
}
?>
Roep alleen degene op die je nodig hebt
tsk_done1
waardes, waarbij tsk_done de laatste row in mijn tabel is en 1 de waarde ervan. Ik moet per row die sleuten en waarde kunnen instellen :/
Stel dat er meerder records worden gevonden dan zal de foreach() de session-vars steeds overschrijven. De query is niet correct bij de post-var => de quotes missen in het post-array(). En de query is lek => sql-injection.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$query = "select tb1, tb2 FROM tabelnaam tb1 = eenwaarde";
$get = mysql_query(query);
$aantal = mysql_num_rows($get);
$verzamel = Mysql_fetch_assoc($get);
//nu kun je je tabellen ophalen en bijv vergelijken met
$verzamel['tb2'];
?>
$query = "select tb1, tb2 FROM tabelnaam tb1 = eenwaarde";
$get = mysql_query(query);
$aantal = mysql_num_rows($get);
$verzamel = Mysql_fetch_assoc($get);
//nu kun je je tabellen ophalen en bijv vergelijken met
$verzamel['tb2'];
?>
Gewijzigd op 16/12/2010 22:22:24 door Jordi Kroon
Toevoeging op 16/12/2010 22:35:52:
Top! Het werkt. Heel erg bedankt allemaal :D
Hoe heb je het uiteindelijk gedaan ?
Waarom stap je af van PDO? Als je al PDO gebruikt zie ik geen reden om terug te gaan naar mysql (omgekeerd wel).
Jordi, jouw laatste post heb ik gebruikt. Ik post morgen wel het uiteindelijke script als je wilt.
Verder kan ik je dan adviseren om eens naar deze tutorial te kijken.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$sql = "SELECT * FROM tasks WHERE tsk_ID = $_POST[verstopt]";
$resultaat = mysql_query($sql);
$aantal = mysql_num_rows($resultaat);
$verzamel = mysql_fetch_assoc($resultaat);
//nu kun je je tabellen ophalen en bijv vergelijken met
$_SESSION['Tid'] = $verzamel['tsk_ID'];
$_SESSION['Tvak'] = $verzamel['tsk_subj'];
$_SESSION['Ttitel'] = $verzamel['tsk_title'];
$_SESSION['Ttxt'] = $verzamel['tsk_txt'];
$_SESSION['TsD'] = $verzamel['tsk_start_date'];// dag,maand,jaar etc wordt gekozen in index.php
$_SESSION['TeD'] = $verzamel['tsk_end_date'];
$_SESSION['Tdone'] = $verzamel['tsk_done'];
?>
$sql = "SELECT * FROM tasks WHERE tsk_ID = $_POST[verstopt]";
$resultaat = mysql_query($sql);
$aantal = mysql_num_rows($resultaat);
$verzamel = mysql_fetch_assoc($resultaat);
//nu kun je je tabellen ophalen en bijv vergelijken met
$_SESSION['Tid'] = $verzamel['tsk_ID'];
$_SESSION['Tvak'] = $verzamel['tsk_subj'];
$_SESSION['Ttitel'] = $verzamel['tsk_title'];
$_SESSION['Ttxt'] = $verzamel['tsk_txt'];
$_SESSION['TsD'] = $verzamel['tsk_start_date'];// dag,maand,jaar etc wordt gekozen in index.php
$_SESSION['TeD'] = $verzamel['tsk_end_date'];
$_SESSION['Tdone'] = $verzamel['tsk_done'];
?>
Karl ik ga niet uitleggen waarom ik het niet handig vind. Ik vind het gewoon veel ingewikkelder en omslachtiger dan normale directe mysql functies.
- Selecteer altijd wat je wilt hebben, gebruik geen *. SQL is self documenting, dat wil dus zeggen dat je aan de query kunt zien wat je wilt. Verder is * een wildcard wat betekend dat je niet per se iets terug hoeft te krijgen.
- Foutafhandeling ontbreekt overal.
- SQL injections mogelijk, gebruik mysql_real_escape_string.
- Regel 8 tot en met regel 15 zijn geen vergelijkingen, maar zijn toewijzingen.
- Sla je data en tijd op in je database? Gebruik dan het veld van het juiste type, namelijk DATETIME.
- SanThe - op 16/12/2010 22:18:40:
De query is niet correct bij de post-var => de quotes missen in het post-array(). En de query is lek => sql-injection.
Ben je nou gewoon dom of lees je de antwoorden niet.
Karl Karl op 17/12/2010 23:15:03:
- Controleren of een form gepost is doe je met if($_SERVER['REQUEST_METHOD'] == 'POST')
- Selecteer altijd wat je wilt hebben, gebruik geen *. SQL is self documenting, dat wil dus zeggen dat je aan de query kunt zien wat je wilt. Verder is * een wildcard wat betekend dat je niet per se iets terug hoeft te krijgen.
- Foutafhandeling ontbreekt overal.
- SQL injections mogelijk, gebruik mysql_real_escape_string.
- Regel 8 tot en met regel 15 zijn geen vergelijkingen, maar zijn toewijzingen.
- Sla je data en tijd op in je database? Gebruik dan het veld van het juiste type, namelijk DATETIME.
- Selecteer altijd wat je wilt hebben, gebruik geen *. SQL is self documenting, dat wil dus zeggen dat je aan de query kunt zien wat je wilt. Verder is * een wildcard wat betekend dat je niet per se iets terug hoeft te krijgen.
- Foutafhandeling ontbreekt overal.
- SQL injections mogelijk, gebruik mysql_real_escape_string.
- Regel 8 tot en met regel 15 zijn geen vergelijkingen, maar zijn toewijzingen.
- Sla je data en tijd op in je database? Gebruik dan het veld van het juiste type, namelijk DATETIME.
- Dat wist ik niet, ik heb het nu gedaan met een hidden veld.
- Dat * is omdat ik alle velden van die tabel nodig heb WHERE tsk_ID = ....
- Foutafhandeling heb ik nog niet geleerd, ik zal die tutorial die je poste binnenkort is lezen.
- Ook dit weet ik nog niet, en aangezien deze pagina niet op internet komt maar puur voor eigen gebruik is en een opdracht voor school maakt het niet heel veel uit.
- 8 tm 15 moeten ook toewijzingen zijn. Ik haal die row's op en zet ze in sessies die ik op een andere pagina weer opvraag :).
- Alleen datum, dan is DATE toch goed genoeg?
Toevoeging op 18/12/2010 12:04:28:
Ik probeer nu alle rows te laten zien in een tabel met alle waarden, maar krijg 7 keer dezelfde row te zien omdat hij voor elke waarde opnieuw de foreach loop doet. Dit is wat ik heb:
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
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
<?php
$con = mysql_connect("localhost","...","...");
if (!$con) die('Could not connect: '.mysql_error());
mysql_select_db("planner", $con);
$sql = "SELECT * FROM tasks ORDER BY tsk_end_date ASC";
if (!mysql_query($sql,$con)) {
die('Error: '.mysql_error());
}
$resultaat = mysql_query($sql);
$aantal = mysql_num_rows($resultaat);
$verzamel = mysql_fetch_assoc($resultaat);
echo '<table><tr id=tr_all><td>ID</td><td>Titel</td><td>Beschrijving</td><td>Vak</td><td>Begindatum</td><td>Einddatum</td><td>Afgerond</td></tr>';
while($row = mysql_fetch_assoc($resultaat)){
foreach($row as $sleutel => $waarde){
echo '<tr>';
$nummer = $row['tsk_ID'];
$db_start_date=$row['tsk_start_date'];
$db_end_date=$row['tsk_end_date'];
echo '<td>'.$row['tsk_ID'].'</td>
<td>'.$row['tsk_title'].'</td>
<td>'.$row['tsk_txt'].'</td>
<td>'.$row['tsk_subj'].'</td>
<td>'.(date('d-m-Y', strtotime($db_start_date))).'</td>
<td>'.(date('d-m-Y', strtotime($db_end_date))).'</td>
<td>';
if($row['tsk_done']==1) {
echo 'Ja';
}
else {
echo 'Nee';
}
echo '</td>';
echo '</tr>';
}
}
echo '</table>';
mysql_close($con);
?>
$con = mysql_connect("localhost","...","...");
if (!$con) die('Could not connect: '.mysql_error());
mysql_select_db("planner", $con);
$sql = "SELECT * FROM tasks ORDER BY tsk_end_date ASC";
if (!mysql_query($sql,$con)) {
die('Error: '.mysql_error());
}
$resultaat = mysql_query($sql);
$aantal = mysql_num_rows($resultaat);
$verzamel = mysql_fetch_assoc($resultaat);
echo '<table><tr id=tr_all><td>ID</td><td>Titel</td><td>Beschrijving</td><td>Vak</td><td>Begindatum</td><td>Einddatum</td><td>Afgerond</td></tr>';
while($row = mysql_fetch_assoc($resultaat)){
foreach($row as $sleutel => $waarde){
echo '<tr>';
$nummer = $row['tsk_ID'];
$db_start_date=$row['tsk_start_date'];
$db_end_date=$row['tsk_end_date'];
echo '<td>'.$row['tsk_ID'].'</td>
<td>'.$row['tsk_title'].'</td>
<td>'.$row['tsk_txt'].'</td>
<td>'.$row['tsk_subj'].'</td>
<td>'.(date('d-m-Y', strtotime($db_start_date))).'</td>
<td>'.(date('d-m-Y', strtotime($db_end_date))).'</td>
<td>';
if($row['tsk_done']==1) {
echo 'Ja';
}
else {
echo 'Nee';
}
echo '</td>';
echo '</tr>';
}
}
echo '</table>';
mysql_close($con);
?>
Hij moet voor elke row 1 rij laten zien met 7 kolommen (7 verschillende waarden). Nu laat hij dus voor elke waarde een nieuwe rij aanmaken. Dat is ook wel logisch, maar ik weet niet hoe ik dit moet oplossen :P
2. het heeft geen zin om voor dat je de while in gaat 1x te fetchen
3. het heeft geen zin om overbodige variabelen aan te maken
4. het heeft ook geen zin om zovele echo's in je code te hebben
5. je dient attribuutwaarden ook te qouten
6. zal het niet handiger zijn om bepaalde zaken (te tonen datum format) ook alsdanig in de query te steken
7. het heeft geen zin om dood te gaan, en dat slaat op de die(), pas fatsoenlijke foutafhandeling toe op een zodanige manier dat de rest van je code gewoon doorlopen kan worden
Toevoeging op 18/12/2010 22:23:08:
foreach loop weg gehaald en hij werkt idd :)