Hoi Beste mensen,

Ik ben bezig met een zoekfunctie op mijn website, en nu wordt er maar niks weergegeven constant en dit is een beetje vervelend. Ik kom er ook niet uit waar het mis gaat...

Ik zoek met de volgende code:
            <table>
<form action="uitslag/uitslaghome.php" method="GET"> 
<tr><td ><div align="left"><select type="tekst" name="jaar">
  <option value="Kies">Kies</option>
  <option value="2013">2013</option>
  <option value="2014">2014</option>
  <option value="2015">2015</option>
  <option value="2016">2016</option>
  <option value="2017">2017</option>
  <option value="2018">2018</option>
  <option value="2019">2019</option>
  <option value="2020">2020</option>
  </select></div></td>
  </tr>
  <tr><td ><div align="left"><select type="tekst" name="geslacht">
  <option value="Kies">Kies</option>
  <option value="heren">Heren</option>
  <option value="dames">Dames</option>
  </select></div></td>
  </tr>
  <tr><td ><div align="left"><select type="tekst" name="afstand">
   <option value="Kies">Kies</option>
  <option value="5km">5 Kilometer </option>
  <option value="10km">10 Kilometer </option>
  </select></div></td>
  </tr>
<tr><td ><div align="center"><input type="submit" value="Zoek"></div></td></tr>
</form></table>


Op de site: uitslag/uitslaghome.php
haal ik de gegevens zo binnen:
$zjaar = $_GET['jaar'];
$zgeslacht = $_GET['geslacht'];
$zafstand = $_GET['afstand'];
$sql= "SELECT * FROM uitslag WHERE `jaar` = `$zjaar` AND `geslacht` = `$zgeslacht` AND `afstand` = `$zafstand`";
$res= mysql_query($sql);


En dan probeer ik het weer te geven via de code dit het eigenlijk altijd heeft gedaan...
<table width="auto" border="0" align="center">
<tr>
               <td class="top" >
            <?php echo nl2br($news['jaar']) ?>
        </td>
</tr>
    <tr> 
    <td class="bottem" >
            <b>&nbsp;<?php echo $news['geslacht'] ?></b>
        </td>
        <td class="bottem" >
            <b>&nbsp;<?php echo $news['afstand'] ?></b>
        </td>
        <td class="bottem" colspan="3">
            <?php echo nl2br($news['score']) ?>
        </td>
    </tr>
</table>


Maar als ik dit deed dan had ik er geen zoekfunctie in en werkte ik met het volgende regeltje:
$sql= "SELECT * FROM records ORDER BY id DESC LIMIT 4";
$res= mysql_query($sql);
En dat werkt wel. Als ik deze code neer zet dan zie ik gewoon alle uitslagen met een max van 4. Maar ik wil juist dat hij de uitslagen weergeeft aan de hand van jou opgegeven zoek input.

Is er iemand die de tijd wilt nemen om mij hierbij te helpen en wilt kijken waarom hij niks weergeeft? O

Groeten,
Dennis
- Voeg foutafhandeling toe
- Je GET-invoer is onbeveiligd en vatbaar voor SQL-injection
- Gebruik bij sterke voorkeur de functies voor MySQLi.
Fouthandeling op queries inbouwen

<?php
if (false !== $res = mysql_query($sql)) {
	//code om resultaat te tonen
}
else {
	echo mysql_error(), '<br>', $sql;
}
?>

Je gebruikt backticks(`) daar waar je een string of getal op wilt geven, Mysql ziet dat dan als een kolom identifier.
Heey het veranderen van ` om ' wekt en lost inderdaad het probleem voor een deel op. Behalve dan dat hij nu de lijst onbeperkt weergeeft onder elkaar. En als ik erachter zet LIMIT 1 dan gebeurd dit nog... Kunnen jullie daarbij helpen.

@ -Aar-

Daar heb je gelijk in het is inderdaad onbeveiligd daar ga ik later naar kijken. WIl het eerst even werken hebben voordat ik daarin ga kijken. Ben namelijk nog niet heel goed ermee maar probeer nu zo veel mogelijk zelf te schrijven en soms wat hulp te vragen.

Wat is de verbetering van MYSQLi??
De functie-bibliotheek van mysql_*() is verouderd. Daarom raadt php.net nu die van mysqli_*() aan of om PDO te gebruiken.

Verder raad ik niet aan om een oplossing voor een groot beveiligingslek m.b.t. onbeveiligde data uit te stellen. In ieder geval zeker niet voor iets wat al in productie is. Kijk eens maar mysql_real_escape_string()
- Aar - op 05/12/2014 19:26:42

De functie-bibliotheek van mysql_*() is verouderd. Daarom raadt php.net nu die van mysqli_*() aan of om PDO te gebruiken.

Verder raad ik niet aan om een oplossing voor een groot beveiligingslek m.b.t. onbeveiligde data uit te stellen. In ieder geval zeker niet voor iets wat al in productie is. Kijk eens maar mysql_real_escape_string()


Staat inderdaad ook niet op het uitstellen hiervan hoor! WIl er meteen naar gaan kijken zo als hij er nog maar 1 weergeeft en geen hele lijst. Bedankt voor de tips weer! Kan je ook helpen met die andere vraag?

Verder hoe groot is de kans dat mensen op deze site sql injecties proberen te doen? Het is niet dat het een gigantisch grote site is...

Groeten,
Dennis
Dennis van DUin op 05/12/2014 19:28:52

Verder hoe groot is de kans dat mensen op deze site sql injecties proberen te doen?

Onderschat niet de kracht van botnets en geautomatiseerde taken.


Welke code heb je nu precies?
Dennis van DUin op 05/12/2014 19:28:52

Verder hoe groot is de kans dat mensen op deze site sql injecties proberen te doen? Het is niet dat het een gigantisch grote site is...


Uh, 99%.
Ik geef mijn uitslagen weer met:


<?php

include("stylerecord.css");
include("global.inc.php");

$zjaar = $_GET['jaar'];
$zgeslacht = $_GET['geslacht'];
$zafstand = $_GET['afstand'];
$sql= "SELECT * FROM uitslag WHERE `jaar` = '$zjaar' AND `geslacht` = '$zgeslacht' AND `afstand` = '$zafstand' ";
$res= mysql_query($sql);

?>

<?

while($news = mysql_fetch_array($res)){

//Opmaak van datum
$unixtime = strtotime($news['news_datetime']);

if (false !== $res = mysql_query($sql)) {
    //code om resultaat te tonen
?>

<table width="auto" border="0" align="center">
<tr>
               <td class="top" >
            <?php echo nl2br($news['jaar']) ?>
        </td>
</tr>
    <tr> 
    <td class="bottem" >
            <b>&nbsp;<?php echo $news['geslacht'] ?></b>
        </td>
       </tr>
    <tr> 
        <td class="bottem" >
            <b>&nbsp;<?php echo $news['afstand'] ?></b>
        </td>
        </tr>
    <tr> 
        <td class="bottem" colspan="3">
            <?php echo nl2br($news['score']) ?>
        </td>
    </tr>
</table>
<br>

<?php
}
else {
    echo mysql_error(), '<br>', $sql;
}  
}
mysql_close();
?>      
   


Maar dan komt er dus de gehele lijst obeperkd te staan en hij moet hem maar 1x weergeven. Wordt steeds herhaald.

Bedankt beide voor het benoemen van het risico! Ik zet het meteen bovenaan om ernaar te gaan kijken nadat ik dit heb gefixxt om alles te beveiligen.
Je moet de if op regel 21 voor de while op regel 16 zetten. En regel 10 verwijderen
Dankjewel ;)

Op naar de beveiliging tips zijn welkom!

Ik hoorde al:
mysql_real_escape_string()

Groeten,Dennis

Edit:
En ik heb een vraag hoe ik de spatie opmaak uit de input kan behouden? Regels weet ik nu met nl2br maar hoe de spaties?



PS: Dit is weel en sociaal en hulpvaardigforum! Top mensen ga zo door hier!

Reageren