Een vraagje over de 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:

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

Dit werkt. Nu wil ik dit omzetten naar mysql_connect ipv dat PDO en heb het volgende:

<?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];
}
?>

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? :)
PDO is gwn niet handig in mijn ogen..

Jordi, jouw laatste post heb ik gebruikt. Ik post morgen wel het uiteindelijke script als je wilt.
Kan je uitleggen wat er niet handig is aan PDO?
Verder kan ik je dan adviseren om eens naar deze tutorial te kijken.
Hier mijn uiteindelijk gebuikte script (het deel waar het om ging)

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

Karl ik ga niet uitleggen waarom ik het niet handig vind. Ik vind het gewoon veel ingewikkelder en omslachtiger dan normale directe mysql functies.
- 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.
- [google]SQL injections[/google] mogelijk, gebruik [php]mysql_real_escape_string[/php].
- 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.
Die quotes maken echt geen verschil, heb ik al getest. En misschien ben jij wel dom want je leest geeneens de eerste post waarin ik vermeld dat ik een beginner ben en dus niks af weet van sql-injections.

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.
- [google]SQL injections[/google] mogelijk, gebruik [php]mysql_real_escape_string[/php].
- 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?

[size=xsmall]Toevoeging op 18/12/2010 12:04:28:[/size]

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:

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

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
1. het heeft totaal geen zin om binnen de while een foreach te doen in deze situatie
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
Ok dat is hoe het niet moet, maar ik vroeg eigenlijk hoe het wel moet :P

[size=xsmall]Toevoeging op 18/12/2010 22:23:08:[/size]

foreach loop weg gehaald en hij werkt idd :)

Reageren