$_Post werkt niet in Mysqli Query
Kom tegen iets aan waarvan ik nu echt niet meer weet wat ik fout doe. Heb al rond gesnuffeld op internet voor een oplossing, maar nog niet de goede gevonden.
Ik heb het volgende scriptje:
Quote:
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
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
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
//***************************************************************************
require_once '/home/website.nl/secret/misc.inc.php';
$mysqli = new mysqli(hostname, username, password, database);
$Id = mysqli_real_escape_string($mysqli,$_POST['Id']);
if(mysqli_connect_errno()){trigger_error('Fout bij verbinding: '.$mysqli->error);}
if ($mysqli->set_charset('utf8') === false) { die('failed setting charset');}
//***************************************************************************
$sql = "SELECT Id,Membernummer,Naam
FROM Member WHERE Id = '.$Id.'";
//***************************************************************************
$result = mysqli_query($mysqli, $sql);
if (mysqli_num_rows($result) > 0) {
//***************************************************************************
echo "<form action='' method='POST'>";
//***************************************************************************
while ($row = $result->fetch_assoc()) { extract($row);
//***************************************************************************
echo "member: $Membernummer $Naam";
//***************************************************************************
include("specificatietabel.inc");
}
}
else
{
echo "Niets gevonden";
echo "id=$Id";
}
//***************************************************************************
mysqli_free_result($result);
mysqli_close($mysqli);
?>
error_reporting(E_ALL);
ini_set('display_errors', 1);
//***************************************************************************
require_once '/home/website.nl/secret/misc.inc.php';
$mysqli = new mysqli(hostname, username, password, database);
$Id = mysqli_real_escape_string($mysqli,$_POST['Id']);
if(mysqli_connect_errno()){trigger_error('Fout bij verbinding: '.$mysqli->error);}
if ($mysqli->set_charset('utf8') === false) { die('failed setting charset');}
//***************************************************************************
$sql = "SELECT Id,Membernummer,Naam
FROM Member WHERE Id = '.$Id.'";
//***************************************************************************
$result = mysqli_query($mysqli, $sql);
if (mysqli_num_rows($result) > 0) {
//***************************************************************************
echo "<form action='' method='POST'>";
//***************************************************************************
while ($row = $result->fetch_assoc()) { extract($row);
//***************************************************************************
echo "member: $Membernummer $Naam";
//***************************************************************************
include("specificatietabel.inc");
}
}
else
{
echo "Niets gevonden";
echo "id=$Id";
}
//***************************************************************************
mysqli_free_result($result);
mysqli_close($mysqli);
?>
Nu krijg ik op $Id onderaan de echo juiste uitvoer: (bijvoorbeeld) 26001
Als ik in $sql rechtstreeks na Id = '26001' invoer, krijg ik de juiste uitvoer en verschijnen de gegevens van de geselecteerde member correct. Echter via de variabel $Id krijg ik niets, ofwel een weergaven van "Niets gevonden" (mysqli_num_rows($result) > 0 is blijkbaar NULL)
De variabel $Id is dus wel degelijk aanwezig en bestaat, maar in de $sql lijkt het of deze variabel niets bevat en dus ook niet de juiste gegevens ophaald uit de database.
Dacht nog dat het ligt aan het ontbreken van mysqli_real_escape_string, maar deze heb ik alsnog toegevoegd zoals jullie hierboven zien, maar zonder beter resultaat.
Het vreemde is dat als ik dit zelfde doe met $_GET, dat dit wel werkt en doet wat ik wil en verwacht.
Wie weet wat ik hier mee aan moet of wat ik fout doet?
Uit de literatuur heb ik begrepen dat het mengen van object oriented en procedural stylen geen goed idee is.
Het is het één of het ander.
http://php.net/manual/en/mysqli.query.php
Stel dat het $Id = 123, dan wordt dit dus:
Zie je die puntjes staan rond 123? Dat was de reden dat je query niet werkte (want er is geen record met Id = '.123.').
Die puntjes heb je alleen nodig als je werkt zoals in optie 1 van @SanThe (losse strings aan elkaar plakken). Wat jij deed was meer volgens optie 2 (variabelen in een tekst laten vervangen), en dan hoef je de puntjes dus niet te gebruiken.
Overigens al vaker geroepen: ik vind optie 2 overzichtelijker. In optie 1 heb je rond $Id zoveel "leestekens" dat je door de bomen het bos niet meer ziet. In mij favo editor (Notepad++) wordt $Id binnen de met dubbele quotes afgesloten zin netjes in een andere opmaak getoond (vet en lichter), dus super duidelijk wat daar gebeurd.
Gewijzigd op 27/10/2018 11:09:01 door Rob Doemaarwat
Adoptive Solution op 27/10/2018 09:43:39:
@N
Uit de literatuur heb ik begrepen dat het mengen van object oriented en procedural stylen geen goed idee is.
Het is het één of het ander.
http://php.net/manual/en/mysqli.query.php
Uit de literatuur heb ik begrepen dat het mengen van object oriented en procedural stylen geen goed idee is.
Het is het één of het ander.
http://php.net/manual/en/mysqli.query.php
Ik heb begrepen dat dit geen probleem zou mogen vormen? Het enige nadeel wat ik kan indenken is dat het gebruik van functies tegenover de objecten niet erg consistent zijn. En misschien enige overhead en traagheid van enkele milliseconden?
Maar het gebruik van procedureel OF object-oriënted is het beste idee. Zelf prefereer ik de object-oriënted versie, omdat deze eenvoudig uit te breiden is.
De fout zat trouwens in eerste instantie ook in de selectie vooraf. Hier had ik $Id ook omringt met punten ('.$Id.') is nu geworden '$Id' en in de Query is het gewoon jullie aangeraden methode 2 geworden:
WHERE Id = '$Id'";
Ik ga me op methode 2 richten om het overzichtelijk te houden.
Dit werkt nu. Bedankt voor jullie oplettendheid en tips. Ik kan weer verder knutselen....Groetjes
Toevoeging op 27/10/2018 12:46:45:
- Ariën - op 27/10/2018 12:44:31:
Ik heb begrepen dat dit geen probleem zou mogen vormen? Het enige nadeel wat ik kan indenken is dat het gebruik van functies tegenover de objecten niet erg consistent zijn. En misschien enige overhead en traagheid van enkele milliseconden?
Maar het gebruik van procedureel OF object-oriënted is het beste idee. Zelf prefereer ik de object-oriënted versie, omdat deze eenvoudig uit te breiden is.
Adoptive Solution op 27/10/2018 09:43:39:
@N
Uit de literatuur heb ik begrepen dat het mengen van object oriented en procedural stylen geen goed idee is.
Het is het één of het ander.
http://php.net/manual/en/mysqli.query.php
Uit de literatuur heb ik begrepen dat het mengen van object oriented en procedural stylen geen goed idee is.
Het is het één of het ander.
http://php.net/manual/en/mysqli.query.php
Ik heb begrepen dat dit geen probleem zou mogen vormen? Het enige nadeel wat ik kan indenken is dat het gebruik van functies tegenover de objecten niet erg consistent zijn. En misschien enige overhead en traagheid van enkele milliseconden?
Maar het gebruik van procedureel OF object-oriënted is het beste idee. Zelf prefereer ik de object-oriënted versie, omdat deze eenvoudig uit te breiden is.
Bedankt Ariën voor je tip. Ik ga me er even iets verder in verdiepen om onlogische foutjes te voorkomen.
- Ariën - op 27/10/2018 12:44:31:
Het enige nadeel wat ik kan indenken is dat het gebruik van functies tegenover de objecten niet erg consistent zijn.
Je bedoelt wellicht dat het mengen van procedurele en object georiënteerde code niet erg logisch noch zinnig is, wat klopt.
MySQLi werkt zelf uitsluitend met objecten (mysqli, mysqli_stmt, mysqli_result etc.) en niet meer met resources, zoals bij de oorspronkelijke MySQL-driver het geval was. Dus ook de procedurele variant gebruikt op zijn beurt deze objecten. Daarom is het logischer dat je gewoon alles object georiënteerd houdt.
Welke variant je gebruikt (procedureel, OOP) maakt voor de snelheid echt niets uit omdat daar de performance bottleneck niet zit.
Ontopic: het bovenstaande fragment bevat alleen een openings form tag, waar is de sluitingstag? Verder heeft dit formulier geen formuliervelden tenzij dit maar een gedeelte is van alle code? En er is geen expliciete controle op de REQUEST_METHOD. Als je gebruik maakt van $_POST variabelen zou ik op zijn minst een soort van controle op het bestaan hiervan verwachten, en/of een validatie van de invoer. Zo zou $_POST['Id'] een auto-increment veld moeten zijn. Als deze variabele niet bestaat of een verkeerd format heeft het sowieso geen zin om ook maar een poging te ondernemen om hiermee een query uit te voeren omdat dat toch nooit iets zinnigs oplevert.
Gewijzigd op 27/10/2018 14:33:04 door Thomas van den Heuvel