Update query werkt niet
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
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
<?php
session_start();
ini_set('display_errors',1); // 1 == on , 0 == off
error_reporting(E_ALL | E_STRICT);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
//Hier checks op de invoer
if (count($_SESSION['error']) == 0) {
try {
require_once ('data/link.php');
$sql = "UPDATE members SET auth=:auth, period=:period WHERE id = :id";
$stmt = $db->prepare($sql);
$stmt->execute(array(
':id' => $_SESSION['id'],
':auth' => $_POST['auth'],
':period' => $_POST['period']
));
if($stmt->rowCount() == 0) {
throw new PDOException('Er zijn geen rijen gewijzigd in de UPDATE query.');
}
}
catch(PDOException $e) {
echo 'Foutmelding: '.$e->getMessage().' op regel '.$e->getLine();
header ('Refresh: 2; url=nieuwe-aanmelding.php');
exit();
}
}
}
try {
require_once ('data/link.php');
$sql = "SELECT id, firstname, lastname, username, email, randomcode FROM members WHERE randomcode=:randomcode";
$stmt = $db->prepare($sql);
$stmt->execute(array(
':randomcode' => $_GET['key']
));
sleep(1);
//Get the results from the database and close the connection
$result = $stmt->fetchAll();
if (count($result) == 1) {
$_SESSION['id'] = $result[0]['id'];
$_SESSION['firstname'] = $result[0]['firstname'];
$_SESSION['lastname'] = $result[0]['lastname'];
$_SESSION['username'] = $result[0]['username'];
$_SESSION['email'] = $result[0]['email'];
$_SESSION['randomcode'] = $result[0]['randomcode'];
}
else {
echo 'Geen resultaat gevonden.';
exit;
}
}
catch(PDOException $e) {
echo 'Foutmelding: '.$e->getMessage().' op regel '.$e->getLine();
}
?>
session_start();
ini_set('display_errors',1); // 1 == on , 0 == off
error_reporting(E_ALL | E_STRICT);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
//Hier checks op de invoer
if (count($_SESSION['error']) == 0) {
try {
require_once ('data/link.php');
$sql = "UPDATE members SET auth=:auth, period=:period WHERE id = :id";
$stmt = $db->prepare($sql);
$stmt->execute(array(
':id' => $_SESSION['id'],
':auth' => $_POST['auth'],
':period' => $_POST['period']
));
if($stmt->rowCount() == 0) {
throw new PDOException('Er zijn geen rijen gewijzigd in de UPDATE query.');
}
}
catch(PDOException $e) {
echo 'Foutmelding: '.$e->getMessage().' op regel '.$e->getLine();
header ('Refresh: 2; url=nieuwe-aanmelding.php');
exit();
}
}
}
try {
require_once ('data/link.php');
$sql = "SELECT id, firstname, lastname, username, email, randomcode FROM members WHERE randomcode=:randomcode";
$stmt = $db->prepare($sql);
$stmt->execute(array(
':randomcode' => $_GET['key']
));
sleep(1);
//Get the results from the database and close the connection
$result = $stmt->fetchAll();
if (count($result) == 1) {
$_SESSION['id'] = $result[0]['id'];
$_SESSION['firstname'] = $result[0]['firstname'];
$_SESSION['lastname'] = $result[0]['lastname'];
$_SESSION['username'] = $result[0]['username'];
$_SESSION['email'] = $result[0]['email'];
$_SESSION['randomcode'] = $result[0]['randomcode'];
}
else {
echo 'Geen resultaat gevonden.';
exit;
}
}
catch(PDOException $e) {
echo 'Foutmelding: '.$e->getMessage().' op regel '.$e->getLine();
}
?>
Het belangrijke deel uit het Postformulier in html is als volgt:
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
<tr>
<td><label for="firstname">Voornaam:</label></td>
<td><input type="text" name="firstname" value="<?php echo isset($_SESSION['firstname']) ? htmlspecialchars($_SESSION['firstname']) : '' ?>"/></td>
</tr>
<tr>
<td><label for="lastname">Achternaam:</label></td>
<td><input type="text" name="lastname" value="<?php echo isset($_SESSION['lastname']) ? htmlspecialchars($_SESSION['lastname']) : '' ?>"/>
</tr>
<tr>
<td><label for="email">Emailadres: </label></td>
<td><input type="text" name="email" value="<?php echo isset($_SESSION['email']) ? htmlspecialchars($_SESSION['email']) : '' ?>"/></td>
</tr>
<tr><td><input type="text" name="check" id="check" /></td></tr>
<tr>
<td><label for="authorisatie">Authorisatie: </label></td>
<td><input type="radio" name="auth" value="1" />Ja
<input type="radio" name="auth" value="0" />Nee
<tr>
<tr>
<td><label for="periode">Geldigheidsduur: </label></td>
<td><input type="radio" name="period" value="1" />Oneindig
<input type="radio" name="period" value="0" />En week;
<tr>
<td> </td>
<td><input type="submit" value="Verstuur" id="button"/>
<input type="reset" value="Wissen" id="button" /></td>
</tr>
<td><label for="firstname">Voornaam:</label></td>
<td><input type="text" name="firstname" value="<?php echo isset($_SESSION['firstname']) ? htmlspecialchars($_SESSION['firstname']) : '' ?>"/></td>
</tr>
<tr>
<td><label for="lastname">Achternaam:</label></td>
<td><input type="text" name="lastname" value="<?php echo isset($_SESSION['lastname']) ? htmlspecialchars($_SESSION['lastname']) : '' ?>"/>
</tr>
<tr>
<td><label for="email">Emailadres: </label></td>
<td><input type="text" name="email" value="<?php echo isset($_SESSION['email']) ? htmlspecialchars($_SESSION['email']) : '' ?>"/></td>
</tr>
<tr><td><input type="text" name="check" id="check" /></td></tr>
<tr>
<td><label for="authorisatie">Authorisatie: </label></td>
<td><input type="radio" name="auth" value="1" />Ja
<input type="radio" name="auth" value="0" />Nee
<tr>
<tr>
<td><label for="periode">Geldigheidsduur: </label></td>
<td><input type="radio" name="period" value="1" />Oneindig
<input type="radio" name="period" value="0" />En week;
<tr>
<td> </td>
<td><input type="submit" value="Verstuur" id="button"/>
<input type="reset" value="Wissen" id="button" /></td>
</tr>
Ik krijg wel contact met de database, want de gevraagde id wordt opgehaald.
Maar ik krijg steeds de melding dat er geen rijen gewijzigd worden, terwijl ik wel andere waarde invoer.
Ik heb geen idee meer wat ik fout doe.
Gewijzigd op 28/12/2015 18:52:41 door Tortuga web
Maar jij zegt dat je waarden echt inhoudelijk wijzigt. Wordt deze wijziging ook echt doorgevoerd in de database? Zoja, dan gaat er niet echt iets fout en zou ik de aanpak wat veranderen, numRows() is dan blijkbaar geen goede controle, kun je in dat geval niet gewoon kijken of execute() true teruggeeft?
En ja, als je het effect van een wijziging helemaal niet terugziet zul je verder moeten kijken waar dit vandaan komt uiteraard.
Een UPDATE-query uitvoeren waarin niets gewijzigd wordt is in ieder geval niet per definitie fout.
Ik wijzig in het formulier de waarde 'auth' en 'period' van 0 naar 1.
In feite is dit een wijziging van false naar true, met een integer-waarde 0 en 1.
Ik krijg de melding terug dat er 'geen rijen gewijzigd zijn', en heb gecontroleerd dat er effectief in de database geen rijen gewijzigd zijn. Dus de wijziging komt niet door. Maar ik zie werkelijk niet waar de fout zit.
Heb je PDO wel zo ingesteld dat deze gebruik maakt van exceptions als foutmeldingsmethode? Dit doe je ook middels een connectie optie PDO::ATTR_ERRMODE met als waarde PDO::ERRMODE_EXCEPTION.
EDIT: hoe luidt de definitie van de tabel, als die kolom een ENUM is moet je de waarde wellicht voorzien van quotes, en mogelijk doet PDO dat zelf niet of zoiets? Je zou altijd kunnen overwegen om tijdelijk query-logging aan te zetten (volgens mij de enige manier om te achterhalen welke concrete queries er daadwerkelijk worden uitgevoerd).
Gewijzigd op 28/12/2015 20:49:19 door Thomas van den Heuvel
Thomas van den Heuvel op 28/12/2015 20:47:28:
Okay, de query mislukt dus.
Heb je PDO wel zo ingesteld dat deze gebruik maakt van exceptions als foutmeldingsmethode? Dit doe je ook middels een connectie optie PDO::ATTR_ERRMODE met als waarde PDO::ERRMODE_EXCEPTION.
EDIT: hoe luidt de definitie van de tabel, als die kolom een ENUM is moet je de waarde wellicht voorzien van quotes, en mogelijk doet PDO dat zelf niet of zoiets? Je zou altijd kunnen overwegen om tijdelijk query-logging aan te zetten (volgens mij de enige manier om te achterhalen welke concrete queries er daadwerkelijk worden uitgevoerd).
Heb je PDO wel zo ingesteld dat deze gebruik maakt van exceptions als foutmeldingsmethode? Dit doe je ook middels een connectie optie PDO::ATTR_ERRMODE met als waarde PDO::ERRMODE_EXCEPTION.
EDIT: hoe luidt de definitie van de tabel, als die kolom een ENUM is moet je de waarde wellicht voorzien van quotes, en mogelijk doet PDO dat zelf niet of zoiets? Je zou altijd kunnen overwegen om tijdelijk query-logging aan te zetten (volgens mij de enige manier om te achterhalen welke concrete queries er daadwerkelijk worden uitgevoerd).
Ja, dat staat aan.
Ik weet niet precies wat je bedoelt met ENUM. Ik heb getest of er een verschil is in het gebruik van <input type="radio" name="period" value="1" /> of <input type="radio" name="period" value=1 />. Maar dat maakt niets uit, de rijen blijven ongewijzigd.
Het rare is dat de query wél werkt op de lokale wamp-server. Het enige verschil dat ik heb kunnen vinden is dat ik thuis op wamp MySQL 5.6.17 heb en de provider 5.5.47 gebruikt. Kan het daar aan liggen???
De kolomwaarden trouwens zijn ingesteld als tinyint en NOT NULL
Gewijzigd op 28/12/2015 21:36:03 door tortuga web
Misschien is het zoiets sufs als de volgorde van de parameters zoals je die in de query gebruikt en de volgorde zoals je die meegeeft aan het execute-array (deze verschillen van elkaar), maar bij named parameters zou dat toch niet uit moeten maken?
Ook is het volgens mij geen gereserveerd woord, maar je zou kunnen proberen de kolomnamen in je query te voorzien van `backticks` (al ben ik daar geen fan van).
Ik zie het anders ook eigenlijk niet, ik vrees dat je -als het bovenstaande het niet oplost- toch de mysql-logs in moet duiken ofzo. Je zou ook kunnen overwegen om gewoon van die numRows() check af te stappen, al zou je query natuurlijk wel gewoon dingen moeten updaten :/.
EDIT: mogelijk zit de informatie niet (goed) in $_SESSION of $_POST, dump deze twee arrays eens, die geven inzicht hoe je uiteindelijke query er mogelijk uit ziet. Misschien ontbreekt $_SESSION['id'] per ongeluk ofzo, en dan wordt er niets geupdate ;).
Gewijzigd op 28/12/2015 23:17:13 door Thomas van den Heuvel
Dat zou meteen een bewijs zijn dat je in elk geval een poging gaat doen om de query uit te voeren.
als $_SESSION['errors'] niet leeg is, kom je daar bijvoorbeeld niet langs.
Waarom 2x een include van data.link.php?
Toevoeging op 29/12/2015 10:56:17:
Dat er geen rijen aangepast zijn, is niet iets waar je exception voor gooit.
Op zich hoeft dat niet fout te zijn.
Misschien iets waar je de gebruiker een opmerking over laat zien, maar fataal is het niet natuurlijk.
Dit werkt wel. $_SESSION['id'] wordt om de één of andere reden niet verwerkt door de providers versie, waar WAMP dat wél doet.
Bedankt voor het meedenken.
Helaas wordt de foutmelding daarvan dan mogelijk onderdrukt.
Schuif session_start() eens 3 regels omlaag, dus onder de 2 regels die je errors activeren.
Daar zou wel eens een headers-already-sent of iets met "cannot start session" uit kunnen komen.
Daarmee zou ook $_SESSION['error'] in problemen komen.
Fijn dat het symptoom nu weg is dat je query mislukt, maar er is dus wel een probleem.
Daarnaast kan elke gebruiker dus andermans naam en mailadres aanpassen als hij dat id in die (hidden?) input even aanpast.
En schuif ik de session_start naar beneden, dan krijg ik inderdaad de cannot start session, headers already sent melding. Ik heb alles nagezocht en kan niet vinden dat er html-uitvoer is, voordat ik dit script uitvoer. Tenzij het probleem gegenereerd wordt omdat ik iedere pagina via een GET['page'] op de indexpagina oproep. De headers already sent meldt de sent op de laatste regel van de file "metadata".
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!DOCTYPE HTML>
<html lang="nl">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1.0, width=device-width" />
<title>Foto's en verhalen</title>
<link rel="stylesheet" href="css/web.css" />
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
<link href='https://fonts.googleapis.com/css?family=Marck+Script' rel='stylesheet' type='text/css' />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="script/responsiveslides.min.js"></script>
<script src="script/responsiveslides.js"></script>
<script>
$(function() {
$("#slideshow").responsiveSlides({
namespace: "rslides",
nav: false,
random: true,
pause: false,
timeout: 6500,
speed: 2500,
pager: false});
});
</script>
</head>
<html lang="nl">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1.0, width=device-width" />
<title>Foto's en verhalen</title>
<link rel="stylesheet" href="css/web.css" />
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
<link href='https://fonts.googleapis.com/css?family=Marck+Script' rel='stylesheet' type='text/css' />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="script/responsiveslides.min.js"></script>
<script src="script/responsiveslides.js"></script>
<script>
$(function() {
$("#slideshow").responsiveSlides({
namespace: "rslides",
nav: false,
random: true,
pause: false,
timeout: 6500,
speed: 2500,
pager: false});
});
</script>
</head>
Dit is toch nog geen HTML uitvoer???
En ja, het staat in de juiste code. (UTF-8 zonder BOM)
het is zelfs html.
Maar als stuurde je een cijfer, of een of ander vaag chinees teken in unicode: uitvoer is uitvoer.
zodra jij uitvoer stuurt, en je gebruikt geen output buffering, dan zegt Apache:
"he browser, hier komt wat data. En deze data moet je zien als een stukje html of gewoon tekst."
Je kunt ook een http-server laten zeggen: "deze data is binair en je kunt er een plaatje van maken".
ofwel : header('Content-Type: image/jpeg');
In elk geval:
dit is nu geroepen en 1 of meer bytes aan data zijn verzonden.
Nu kom jij aan met session_start();
Nu moet Apache nog iets gaan roepen "he browser, de header die ik net stuurde over dat het html is, daar had ik nog iets over een cookie bij willen zeggen".
Ja en dat gaat dus niet meer...
---
Als het op jouw wamp server wel werkt, moet je eens nazoeken of output buffering aan staat.
Dat betekent dat je Apache de eerste x kB aan data op laat sparen voor je de output en de headers begint te versturen.
(is een bron voor bugs: zoals hierboven, maar ook dat je scripts prima werken voor
Jon Doe op plein 1 in Dorp
maar niet voor
Baron van Hier tot daar op de Laan van Meerdervoort in 's-Gravenhage
omdat je dan ineens over de buffer size heen gaat.
Output buffering uitzetten en je script logisch opbouwen:
eerst invoer afhandelen, route bepalen in je script, data klaar zetten en pas dan denken aan wat er naar het scherm gaat moeten
Ik heb nogal eens pogingen gedaan om met OOP te gaan werken, maar ik blijf dat erg moeilijk vinden. Het lijkt mij wel de beste weg om alles klaar te zetten, voordat ik iets uitvoer.
Maar.. Dit zou toch ook moeten kunnen in een script als hierboven, maar ik weet niet hoe. Weet je toevallig een 'tutorial voor Dummy´s' gericht op dit onderwerp?