$_Post werkt niet in Mysqli Query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

N tigerrag

N tigerrag

27/10/2018 01:02:18
Quote Anchor link
Hallo allemaal,

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
?>


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?
 
PHP hulp

PHP hulp

29/03/2024 11:13:48
 
- SanThe -

- SanThe -

27/10/2018 05:46:38
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$sql
= "SELECT  Id,Membernummer,Naam
                
                 FROM Member WHERE Id = '"
.$Id."'";
?>


Of, maar minder netjes
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$sql
= "SELECT  Id,Membernummer,Naam
                
                 FROM Member WHERE Id = '$Id'"
;
?>
Gewijzigd op 27/10/2018 05:48:50 door - SanThe -
 
Adoptive Solution

Adoptive Solution

27/10/2018 09:43:39
Quote Anchor link
@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
 
Rob Doemaarwat

Rob Doemaarwat

27/10/2018 11:06:30
Quote Anchor link
Ik hoop dat je ook hebt gezien wat je nu precies fout deed. Je had dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$sql = "SELECT  Id,Membernummer,Naam
        FROM Member WHERE Id = '.$Id.'";

Stel dat het $Id = 123, dan wordt dit dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$sql = "SELECT  Id,Membernummer,Naam
        FROM Member WHERE Id = '.123.'";

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
 
- Ariën  -
Beheerder

- Ariën -

27/10/2018 12:44:31
Quote Anchor link
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

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.
 
N tigerrag

N tigerrag

27/10/2018 12:44:55
Quote Anchor link
Jullie hadden gelijk...heb die punten helemaal over het hoofd gezien. Zag nu in de output inderdaad het Id met punten omringt en daarom kon $sql deze niet vinden omdat deze niet bestaat.(logisch ook..haha)

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:
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

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.
 
Thomas van den Heuvel

Thomas van den Heuvel

27/10/2018 14:29:37
Quote Anchor link
- 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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.