Advies nodig mbt mysqli prepared statements in php
Mijn site heeft simpel gezegd een stel gebruikers die allemaal items kunnen plaatsen. De meeste queries zijn gebaseerd op userinput zoals $_GET etc. en dus biedt prepared statements de gewenste beveiliging, zo lees ik. Maar mijn queries worden in bijna elk geval slechts een keer uitgevoerd, is een prepared statement dan weer niet 'overdone'?
Het volgende is een voorbeeld. Van een bepaalde user wil ik alle geplaatste items weergeven en gebruik daarvoor de volgende code.
$sql="SELECT itemnaam, itembeschrijving, itemcategorie, datum FROM items WHERE username= ? ";
$result = $mysqli->prepare($sql);
$result->bind_param('s', $_GET['u']);
$result->execute();
$result->bind_result($itemnaam, $itembeschrijving, $itemcategorie, $datum);
while($result->fetch()){
echo $itemnaam ."--". $itembeschrijving."--".$itemcategorie."--".$datum;
}
$result->close()
$mysqli is hierbij de connectie met de database.
In werkelijkheid vraag ik info uit zo'n 20 kolommen op, en bind_result bevat dus ook 20 variabelen (kan dat sneller?).
Dit werkt allemaal prima, maar ik vraag me gewoon af of dit de beste manier is om het te doen voordat ik mijn hele site op deze manier ga verbouwen..
http://www.php.net/manual/en/mysqli-result.fetch-assoc.php hier voor. Vind ik gemakkelijker dan alles binden. Een prepared statement is niet 'overdone' voor enkele queries. Je geeft namelijk zelf het antwoord al, de paramaters worden geescaped en je code wordt overzichtelijker.
Ik gebruik; @Jaron T, bedankt voor je reactie. Zou je kunnen uitleggen hoe je fetch_assoc hiervoor gebruikt. Als ik het zo op internet lees komt het in combinatie met een prepared statement niet makkelijk over.
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
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
<?php
$mysqli = mysqli_connect("example.com", "user", "password", "database");
// lezen uit de database
$query="SELECT itemnaam, itembeschrijving, itemcategorie, datum FROM items WHERE username= ? ";
$result = $mysqli->query($query);
while($row = $result->fetch_assoc()) {
// gelijkwaardig met jouw voorbeeld
echo $row['itemnaam']."--". $row['itembeschrijving'].
"--".$row['itemcategorie']."--".$row['datum']."<br/><br/>";
//nog eens maar dan met foreach
foreach($row as $key => $value) {
echo $key.": ".$value."<br/>" ;
}
}
$result->close();
// een nieuw item aanmaken
$arr['itemnaam'] = "appel";
$arr['itembeschrijving'] = "bla bla";
$arr['itemcategorie'] = "fruit";
$arr['datum'] = "2012-10-01";
// toevoegen aan de database
$query="INSERT INTO `items` (`itemnaam`, `itembeschrijving`, `itemcategorie`, `datum`)".
" VALUES ('".$arr['itemnaam']."', '".$arr['itembeschrijving']."', '".
$arr['itemcategorie']."', '".$arr['datum']."');";
$result = $mysqli->query($query);
$result->close();
?>
$mysqli = mysqli_connect("example.com", "user", "password", "database");
// lezen uit de database
$query="SELECT itemnaam, itembeschrijving, itemcategorie, datum FROM items WHERE username= ? ";
$result = $mysqli->query($query);
while($row = $result->fetch_assoc()) {
// gelijkwaardig met jouw voorbeeld
echo $row['itemnaam']."--". $row['itembeschrijving'].
"--".$row['itemcategorie']."--".$row['datum']."<br/><br/>";
//nog eens maar dan met foreach
foreach($row as $key => $value) {
echo $key.": ".$value."<br/>" ;
}
}
$result->close();
// een nieuw item aanmaken
$arr['itemnaam'] = "appel";
$arr['itembeschrijving'] = "bla bla";
$arr['itemcategorie'] = "fruit";
$arr['datum'] = "2012-10-01";
// toevoegen aan de database
$query="INSERT INTO `items` (`itemnaam`, `itembeschrijving`, `itemcategorie`, `datum`)".
" VALUES ('".$arr['itemnaam']."', '".$arr['itembeschrijving']."', '".
$arr['itemcategorie']."', '".$arr['datum']."');";
$result = $mysqli->query($query);
$result->close();
?>
Gewijzigd op 30/09/2012 23:22:25 door Frank Nietbelangrijk
Oké, maar nu is het geen prepared statement meer..?
Gewijzigd op 01/10/2012 09:46:28 door Ger van Steenderen
Hopelijk kunnen meer mensen nog wat inbrengen in deze discussie.