login  Naam:   Wachtwoord: 
Registreer je!
 Forum

SQL Query foutief, maar geeft geen error (Opgelost)

Offline JoDe - 15/06/2016 21:19
Avatar van JoDeLid Beste mensen.
Dit is lauter een SQL-vraag. Maar voor onderstaande query krijg ik geen resultaat waar het echt vreemd is. En ik kreeg ook geen foutmeldingen van de MySQL-server terug.
Kan iemand helpen?

  1. mysqli_query($sqlconnect, 'SELECT klantnr FROM klanten WHERE email = $mail');


Alvast bedankt voor de hulp!
Groetjes, Jordy

9 antwoorden

Gesponsorde links
Offline Jointjeff - 15/06/2016 21:55
Avatar van Jointjeff HTML interesse De enkele quotes moet je in dit geval vervangen door dubbele quotes, anders kun je geen variabele zomaar in je query gebruiken.

Dus ofwel:

  1. mysqli_query($sqlconnect, "SELECT klantnr FROM klanten WHERE email = $mail");


Of:

  1. mysqli_query($sqlconnect, 'SELECT klantnr FROM klanten WHERE email = '.$mail.');
Offline advertentiep - 15/06/2016 21:57
Avatar van advertentiep PHP interesse $mail bevat een waarde ?

  1. mysqli_query($sqlconnect, 'SELECT klantnr FROM klanten WHERE email = ' .$mail);


Werkt dit ?

PS; er is genoeg te vinden over mysqli_erno(); en mysqli_error, onder "sql query afhandeling".
Offline JoDe - 15/06/2016 22:26
Avatar van JoDe Lid Jammer, ik weet nu wel dat de query ok is, maar er loopt wat anders mis! Zie onderstaande code:

  1. <?php
  2. // Klantensysteem Dikowork (C)2016
  3. include('configdb.inc');
  4. //include('http://database.vdslhosting.be/configdb.inc');
  5. ?>
  6.  
  7. <!DOCTYPE html>
  8. <html>
  9. <head>
  10. <!--<meta http-equiv="refresh" content="30;url=http://www.dikowork.com">-->
  11. <title>Verwerking Registratie</title>
  12. </head>
  13. <body>
  14. <?php
  15. //Formfields
  16. $vnaam = $_POST["vnaam"];
  17. $tussenv = $_POST["tussenv"];
  18. $anaam = $_POST["anaam"];
  19. $telnr = $_POST["telnr"];
  20. $mail = $_POST["email"];
  21. $adres = $_POST["adres"];
  22. $bus = $_POST["busnr"];
  23. $postcode = $_POST["postcode"];
  24. $postcnll = $_POST["postcodenlletters"];
  25. $city = $_POST["city"];
  26. $country = $_POST["country"];
  27. $passw1 = md5($_POST["wachtwoord"]);
  28. $passw2 = md5($_POST["wachtwoord2"]);
  29. $gebdat = $_POST["gebdat"];
  30. $blindziend = $_POST["blindziend"];
  31. $ontvfact = $_POST["ontvfact"];
  32. $eigenopm = $_POST["eigenopm"];
  33. $submit = $_POST["submit"];
  34.  
  35.  
  36. //Check if the submitbutton is clicked
  37. if(!isset($submit))
  38. {
  39. echo "Je hebt het formulier niet ingevuld";
  40. }
  41. else
  42. {
  43. //Check if there isn't a require field left blanc
  44. if($vnaam == "" || $anaam == "" || $mail == "" || $adres == "" || $bus == "" || $postcode == "" || $city == "" || $country == "" || $gebdat == "" || $blindziend == "" || $ontvfact == "" || $telnr == "")
  45. {
  46. echo "Er werden een of meer velden niet ingevuld!";
  47. }
  48. //Check if the two passwordfields are the same
  49. elseif($passw1 != $passw2)
  50. {
  51. echo "De twee wachtwoorden die u moest invullen zijn niet hetzelfde! Doe het nog eens.";
  52. }
  53. else
  54. {
  55. if($bus == "")
  56. {
  57. $bus = "00";
  58. }
  59. $sqlquery = "INSERT INTO klanten
  60. (naam, tussenv, achternaam, telnr, gebdat, blindziend, email, wachtwoord, adres, busnr, postcode, postcodenlletters, woonplaats, land, ontvfact, eigenOpm)
  61. VALUES ('".mysqli_real_escape_string($sqlconnect,$vnaam)."', '".mysqli_real_escape_string($sqlconnect,$tussenv)."', '".mysqli_real_escape_string($sqlconnect,$anaam)."', '".mysqli_real_escape_string($sqlconnect,$telnr)."', '".mysqli_real_escape_string($sqlconnect,$gebdat)."', '".mysqli_real_escape_string($sqlconnect,$blindziend)."', '".mysqli_real_escape_string($sqlconnect,$mail)."', '".mysqli_real_escape_string($sqlconnect,$passw1)."', '".mysqli_real_escape_string($sqlconnect,$adres)."', '".mysqli_real_escape_string($sqlconnect,$bus)."', '".mysqli_real_escape_string($sqlconnect,$postcode)."', '".mysqli_real_escape_string($sqlconnect,$postcnll)."', '".mysqli_real_escape_string($sqlconnect,$city)."', '".mysqli_real_escape_string($sqlconnect,$country)."', '".mysqli_real_escape_string($sqlconnect,$ontvfact)."', '".mysqli_real_escape_string($sqlconnect,$eigenopm)."')";
  62. if(mysqli_query($sqlconnect, $sqlquery))
  63. {
  64. echo "<p><h1>Gefeliciteerd! U bent klant.</h1></p>";
  65. echo "<p>We sturen u een email met uw gegevens, waaronder uw klantnummer.";
  66. echo "Alles is succesvol toegevoegd in onze database. U zal ongenblikkelijk terugkeren naar <a href='http://www.dikowork.com'>www.dikowork.com</a>. Bedankt voor uw registratie.";
  67. $klantnrselect=mysqli_query($sqlconnect, 'SELECT klantnr FROM klanten WHERE email = '.$mail);
  68. $to = $mail;
  69. $subject="Registratie op Dikowork.com";
  70. $msg="Beste ".$vnaam." ".$tussenv." ".$anaam."\n
  71. Hierbij sturen we u uw persoonlijke klantgegevens.\n
  72. Uw klantennummer is ".$klantnrselect."Het emailadres dat u ons heeft opgegeven is ".$mail."\n
  73. We danken u nogmaals voor uw registratie. En hopen dat u onse diensten nuttig vindt!\n
  74. Om ons terug te mailen kan u sturen naar info@nl.vdslhosting.be .\n
  75. Vriendelijke groeten\n
  76. Het Dikowork Team\n";
  77. $msg=wordwrap($msg,70);
  78. echo $msg;
  79. //$headers="From: noreply@dikowork.com"."\r\n".
  80. "BCC: info@nl.vdslhosting.be";
  81. //mail($to,$subject,$msg,$headers);
  82. }
  83. else
  84. {
  85. die("Onze excuses er ging wat mis! Probeer het later opnieuw!");
  86. }
  87. }
  88. }
  89. ?>
  90. </body></html>
Offline Thomas - 15/06/2016 22:42 (laatste wijziging 15/06/2016 22:48)
Avatar van Thomas Moderator Een variant met quotes + een real_escape_string() functie/methode lijkt mij de enige juiste oplossing.

Afhankelijk van waar $mail vandaan komt en hoe deze input gefilterd wordt is de query anders mogelijk vatbaar voor SQL injectie.

EDIT: om te controleren of een formulier gePOST is kun je beter de volgende controle gebruiken:
  1. <?php
  2. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  3. // hier de verdere afhandeling van het formulier
  4. // ...
  5. }
  6. ?>


EDIT: voor het opvragen van het klantid (indien dit het auto-increment id van de tabel is) bestaat de functie/methode insert_id().
Offline JoDe - 15/06/2016 23:52
Avatar van JoDe Lid Thomas, bedankt! Dat is heel wat duidelijker!
Ik heb alleen nog twee vragen:
1) Wat is het verschil en de voordelen tov de methode die ik gebruikte om te controleren of het form is verstuurd?
2) Kan je me even een voorbeeld geven van de insert_id()-functie. Ik vind via google niet de benodigde informatie om het structureel op te lossen, alleen Object Oriented PHP!
Alvast bedankt!
Offline Thomas - 16/06/2016 14:37
Avatar van Thomas Moderator Het verschil met jouw methode is dat je op voorhand al allerlei variabelen introduceert die hun waarde uit het $_POST array halen, terwijl deze mogelijk leeg is omdat je niet eerst controleert of er uberhaupt een formulier is verstuurd. Dit resulteert al meteen in allerlei notices van niet-bestaande variabelen. Daarnaast kun je je afvragen wat de toegevoegde waarde is om al deze $_POST variabelen te kopiëren - het voegt effectief niets toe.

Er is niet echt een voordeel, maar meer een algemeen geaccepteerde manier om dingen te doen. De manier waarop jij afleid dat er een formulier is verstuurd is niet echt gangbaar. Dit doe jij op grond van het bestaan van een kopie van de waarde van een submitbutton :/.

Daarbij moet je misschien ook met het volgende rekening houden: in jouw script combineer je invoer en uitvoer - tijdens het opbouwen van een webpagina ben je tevens on-the-fly een formulier aan het verwerken. Voor een eenvoudig, standalone, contact- of registratieformulier kan dit misschien nog wel door de beugel maar als je wat grotere dynamische sites gaat maken zul je je acties (het weergeven van een formulier, het verwerken van een formulier, het tonen van een aparte bedankpagina et cetera) toch echt wat meer moeten compartimenteren anders wordt de code één grote incoherente brei.

Indien je je serieus (semi)professioneel wilt bekwamen in PHP zul je moeten leren om gebruik te maken van bepaalde tools. Zoals het officiële naslagwerk van PHP op PHP.net. In de webwereld kom je er ook bijna niet omheen dat de voertaal doorgaans in het Engels is.

Ook kan het handig zijn als je gebruik maakt van MySQLi je aan te leren de object georiënteerde variant te gebruiken. Voor uitleg over insert_id() verwijs ik je dan ook naar de bijbehorende documentatie. Daar vind je ook de procedurele variant die je misschien gewend was vanuit de originele MySQL-driver die enkel met mysql_-functies werkte.
Offline JoDe - 16/06/2016 15:26
Avatar van JoDe Lid Oké, bedankt! Wat is het voordeel van PHP OOP eigenlijk?
En wat die pagina's betreft etc, is het voldoende om met bv. functies te werken?
En als ik MySQLi OOP gebruik, moet ik de rest van mijn systeem ook OOP doen?
Sorry voor deze vragen, maar ik heb nog nooit met OOP gewerkt.
Offline Thomas - 16/06/2016 16:16
Avatar van Thomas Moderator
Citaat:
Oké, bedankt! Wat is het voordeel van PHP OOP eigenlijk?

Dit is zoiets als vragen "wat is het voordeel van een hamer". Voor sommmige klussen is een hamer geschikter dan een ander stuk gereedschap. Maar het blijft een stuk gereedschap. Het bestaan van een hamer maakt het bestaan van andere stukken gereedschap niet overbodig.

Citaat:
En wat die pagina's betreft etc, is het voldoende om met bv. functies te werken?

Whatever floats your boat. Stap 1 is iets werkends opleveren lijkt mij, daarna kun je kijken naar optimalisatie. Het interesseert eindgebruikers doorgaans geen biet hoe alles onder de motorkap er uitziet. Totdat je een keer met panne langs de weg staat .

Citaat:
En als ik MySQLi OOP gebruik, moet ik de rest van mijn systeem ook OOP doen?

Nee. PHP is een hybride taal. Je mag alles door elkaar gebruiken als je dat leuk vindt. Dit legt wel wat meer verantwoordelijkheid bij de programmeur om zelf een soort van overzicht te bewaren.

De OOP variant van MySQLi is wat mij betreft makkelijker in het gebruik, je hoeft dan niet telkens het connectie-object toe te voegen als parameter in de methode-aanroep, ook ontbreekt het voorvoegsel "mysqli_" omdat je al met objecten van MySQLi-klasses werkt.

In beginsel is het dus gewoon kortere code die hetzelfde doet. Daarnaast programmeer je dan (in ieder geval wat betreft database-operaties) (semi) object georiënteerd. Dit kan helpen bij begripsvorming omtrent OOP, ook kun je schillen om deze MySQLi-klasses heenprogrammeren die je het werkt nog makkelijker maakt (de database-functionaliteit is makkelijker uitbreidbaar in de OOP vorm).

En er is een algemene tendens in de PHP-wereld die in de richting van OOP beweegt. Om die reden alleen al valt er iets voor te zeggen om je te bekwamen in de OOP manier van werken, of in ieder geval een globaal beeld te hebben van de gebruikte OOP concepten.
Offline JoDe - 16/06/2016 17:11
Avatar van JoDe Lid Oké, dat is fijn om weten! Bedankt voor alle informatie!
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.225s