Parameterized SQL query werkt niet?
Ik heb drie verschillende velden die men in kan vullen (of niet!) en vervolgens wordt er op basis van welke velden er wel of niet zijn ingevuld een SQL query opgebouwd die later uitgevoerd wordt. Nu wil ik deze beveiligen tegen SQL injection dmv parameterizing. Ik krijg echter de foutmelding 'Wrong parameter count' en ik begrijp niet waarom. Hieronder eerst mijn code, vervolgens het resultaat van de Echo van de SQL en daaronder weer de Echo van mijn array $params.
Hopelijk weten jullie hier raad mee!
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
$sql = "SELECT * FROM profiles";
if($bedrijfvariabele != " zoek op bedrijfsnaam.." && $bedrijfvariabele != "") {
$params = array($bedrijfvariabele);
$sql .= " WHERE bedrijfsnaam = ?";
}
if($rubriekvariabele != " zoek op rubriek.." && $rubriekvariabele != "" && $bedrijfvariabele != " zoek op bedrijfsnaam.." && $bedrijfvariabele != "") {
array_push($params, $rubriekvariabele);
array_push($params, $rubriekvariabele);
$sql .= " AND (hoofdrubriek = ? OR subrubrieken LIKE '%' + ? + '%')";
}
if($rubriekvariabele != " zoek op rubriek.." && $rubriekvariabele != "" && ($bedrijfvariabele == " zoek op bedrijfsnaam.." || $bedrijfvariabele == "")) {
$params = array($rubriekvariabele, $rubriekvariabele);
$sql .= " WHERE (hoofdrubriek = ? OR subrubrieken LIKE '%' + ? + '%')";
}
if($plaatsvariabele != " zoek op plaatsnaam.." && $plaatsvariabele != "" && (($bedrijfvariabele != " zoek op bedrijfsnaam.." && $bedrijfvariabele != "") || ($rubriekvariabele != " zoek op rubriek.." &&
$rubriekvariabele != ""))) {
array_push($params, $plaatsvariabele);
$sql .= " AND plaats = ?";
}
if($plaatsvariabele != " zoek op plaatsnaam.." && $plaatsvariabele != "" && (($bedrijfvariabele == " zoek op bedrijfsnaam.." || $bedrijfvariabele == "") && ($rubriekvariabele == " zoek op rubriek.." ||
$rubriekvariabele == ""))) {
$params = array($plaatsvariabele);
$sql .= " WHERE plaats = ?";
}
$sql .= " ORDER BY
(
(case when ID is not null then 1 else 0 end) +
(case when username is not null then 1 else 0 end) +
(case when password is not null then 1 else 0 end) +
(case when voornaam is not null then 1 else 0 end) +
(case when achternaam is not null then 1 else 0 end) +
(case when telefoonnummerP is not null then 1 else 0 end) +
(case when emailP is not null then 1 else 0 end) +
(case when functie is not null then 1 else 0 end) +
(case when bedrijfsnaam is not null then 1 else 0 end) +
(case when bedrijfsslogan is not null then 1 else 0 end) +
(case when bedrijfslogo is not null then 1 else 0 end) +
(case when bedrijfsfoto is not null then 1 else 0 end) +
(case when bedrijfsfoto2 is not null then 1 else 0 end) +
(case when bedrijfsfoto3 is not null then 1 else 0 end) +
(case when bedrijfsfoto4 is not null then 1 else 0 end) +
(case when bedrijfsomschrijving is not null then 1 else 0 end) +
(case when bedrijfsspecialiteiten is not null then 1 else 0 end) +
(case when bedrijfsgeschiedenis is not null then 1 else 0 end) +
(case when openingstijden is not null then 1 else 0 end) +
(case when kvk is not null then 1 else 0 end) +
(case when straatnaam is not null then 1 else 0 end) +
(case when huisnummer is not null then 1 else 0 end) +
(case when postcode is not null then 1 else 0 end) +
(case when plaats is not null then 1 else 0 end) +
(case when nevenvestigingen is not null then 1 else 0 end) +
(case when telefoonnummer is not null then 1 else 0 end) +
(case when fax is not null then 1 else 0 end) +
(case when email is not null then 1 else 0 end) +
(case when website is not null then 1 else 0 end) +
(case when twitter is not null then 1 else 0 end) +
(case when facebook is not null then 1 else 0 end) +
(case when youtube is not null then 1 else 0 end) +
(case when linkedin is not null then 1 else 0 end) +
(case when hoofdrubriek is not null then 1 else 0 end) +
(case when subrubrieken is not null then 1 else 0 end) +
(case when merken is not null then 1 else 0 end) +
(case when diensten is not null then 1 else 0 end) +
(case when productsoorten is not null then 1 else 0 end) +
(case when brancheverenigingen is not null then 1 else 0 end)
) DESC, bedrijfsnaam LIMIT $start_from, 10";
echo $sql;
print_r($params);
$rs_result = mysql_query($conn, $sql, $params);
if($bedrijfvariabele != " zoek op bedrijfsnaam.." && $bedrijfvariabele != "") {
$params = array($bedrijfvariabele);
$sql .= " WHERE bedrijfsnaam = ?";
}
if($rubriekvariabele != " zoek op rubriek.." && $rubriekvariabele != "" && $bedrijfvariabele != " zoek op bedrijfsnaam.." && $bedrijfvariabele != "") {
array_push($params, $rubriekvariabele);
array_push($params, $rubriekvariabele);
$sql .= " AND (hoofdrubriek = ? OR subrubrieken LIKE '%' + ? + '%')";
}
if($rubriekvariabele != " zoek op rubriek.." && $rubriekvariabele != "" && ($bedrijfvariabele == " zoek op bedrijfsnaam.." || $bedrijfvariabele == "")) {
$params = array($rubriekvariabele, $rubriekvariabele);
$sql .= " WHERE (hoofdrubriek = ? OR subrubrieken LIKE '%' + ? + '%')";
}
if($plaatsvariabele != " zoek op plaatsnaam.." && $plaatsvariabele != "" && (($bedrijfvariabele != " zoek op bedrijfsnaam.." && $bedrijfvariabele != "") || ($rubriekvariabele != " zoek op rubriek.." &&
$rubriekvariabele != ""))) {
array_push($params, $plaatsvariabele);
$sql .= " AND plaats = ?";
}
if($plaatsvariabele != " zoek op plaatsnaam.." && $plaatsvariabele != "" && (($bedrijfvariabele == " zoek op bedrijfsnaam.." || $bedrijfvariabele == "") && ($rubriekvariabele == " zoek op rubriek.." ||
$rubriekvariabele == ""))) {
$params = array($plaatsvariabele);
$sql .= " WHERE plaats = ?";
}
$sql .= " ORDER BY
(
(case when ID is not null then 1 else 0 end) +
(case when username is not null then 1 else 0 end) +
(case when password is not null then 1 else 0 end) +
(case when voornaam is not null then 1 else 0 end) +
(case when achternaam is not null then 1 else 0 end) +
(case when telefoonnummerP is not null then 1 else 0 end) +
(case when emailP is not null then 1 else 0 end) +
(case when functie is not null then 1 else 0 end) +
(case when bedrijfsnaam is not null then 1 else 0 end) +
(case when bedrijfsslogan is not null then 1 else 0 end) +
(case when bedrijfslogo is not null then 1 else 0 end) +
(case when bedrijfsfoto is not null then 1 else 0 end) +
(case when bedrijfsfoto2 is not null then 1 else 0 end) +
(case when bedrijfsfoto3 is not null then 1 else 0 end) +
(case when bedrijfsfoto4 is not null then 1 else 0 end) +
(case when bedrijfsomschrijving is not null then 1 else 0 end) +
(case when bedrijfsspecialiteiten is not null then 1 else 0 end) +
(case when bedrijfsgeschiedenis is not null then 1 else 0 end) +
(case when openingstijden is not null then 1 else 0 end) +
(case when kvk is not null then 1 else 0 end) +
(case when straatnaam is not null then 1 else 0 end) +
(case when huisnummer is not null then 1 else 0 end) +
(case when postcode is not null then 1 else 0 end) +
(case when plaats is not null then 1 else 0 end) +
(case when nevenvestigingen is not null then 1 else 0 end) +
(case when telefoonnummer is not null then 1 else 0 end) +
(case when fax is not null then 1 else 0 end) +
(case when email is not null then 1 else 0 end) +
(case when website is not null then 1 else 0 end) +
(case when twitter is not null then 1 else 0 end) +
(case when facebook is not null then 1 else 0 end) +
(case when youtube is not null then 1 else 0 end) +
(case when linkedin is not null then 1 else 0 end) +
(case when hoofdrubriek is not null then 1 else 0 end) +
(case when subrubrieken is not null then 1 else 0 end) +
(case when merken is not null then 1 else 0 end) +
(case when diensten is not null then 1 else 0 end) +
(case when productsoorten is not null then 1 else 0 end) +
(case when brancheverenigingen is not null then 1 else 0 end)
) DESC, bedrijfsnaam LIMIT $start_from, 10";
echo $sql;
print_r($params);
$rs_result = mysql_query($conn, $sql, $params);
ECHO SQL:
Code (php)
1
SELECT * FROM profiles WHERE (hoofdrubriek = ? OR subrubrieken LIKE '%' + ? + '%') ORDER BY ( (case when ID is not null then 1 else 0 end) + (case when username is not null then 1 else 0 end) + (case when password is not null then 1 else 0 end) + (case when voornaam is not null then 1 else 0 end) + (case when achternaam is not null then 1 else 0 end) + (case when telefoonnummerP is not null then 1 else 0 end) + (case when emailP is not null then 1 else 0 end) + (case when functie is not null then 1 else 0 end) + (case when bedrijfsnaam is not null then 1 else 0 end) + (case when bedrijfsslogan is not null then 1 else 0 end) + (case when bedrijfslogo is not null then 1 else 0 end) + (case when bedrijfsfoto is not null then 1 else 0 end) + (case when bedrijfsfoto2 is not null then 1 else 0 end) + (case when bedrijfsfoto3 is not null then 1 else 0 end) + (case when bedrijfsfoto4 is not null then 1 else 0 end) + (case when bedrijfsomschrijving is not null then 1 else 0 end) + (case when bedrijfsspecialiteiten is not null then 1 else 0 end) + (case when bedrijfsgeschiedenis is not null then 1 else 0 end) + (case when openingstijden is not null then 1 else 0 end) + (case when kvk is not null then 1 else 0 end) + (case when straatnaam is not null then 1 else 0 end) + (case when huisnummer is not null then 1 else 0 end) + (case when postcode is not null then 1 else 0 end) + (case when plaats is not null then 1 else 0 end) + (case when nevenvestigingen is not null then 1 else 0 end) + (case when telefoonnummer is not null then 1 else 0 end) + (case when fax is not null then 1 else 0 end) + (case when email is not null then 1 else 0 end) + (case when website is not null then 1 else 0 end) + (case when twitter is not null then 1 else 0 end) + (case when facebook is not null then 1 else 0 end) + (case when youtube is not null then 1 else 0 end) + (case when linkedin is not null then 1 else 0 end) + (case when hoofdrubriek is not null then 1 else 0 end) + (case when subrubrieken is not null then 1 else 0 end) + (case when merken is not null then 1 else 0 end) + (case when diensten is not null then 1 else 0 end) + (case when productsoorten is not null then 1 else 0 end) + (case when brancheverenigingen is not null then 1 else 0 end) ) DESC, bedrijfsnaam LIMIT 0, 10
ECHO ARRAY $params:
En die parameterized query, als je die wilt gebruiken moet je met een prepared statement werken. Dat vereist het gebruik van mysqli of PDO.
Gewijzigd op 17/10/2012 13:19:37 door Ivo Breeden