参数化查询不能正常使用PHP

时间:2012-10-16 19:05:36

标签: php sql parameters

我有一个非常复杂的if / else语句系统,它最终生成一个SQL。但是,最后,我得到一个'错误的参数计数'消息,我不知道出了什么问题?希望你们能帮忙!我的代码:

$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);  
$sql .= " AND (hoofdrubriek = ? OR subrubrieken LIKE '%' + ? + '%')";

}


if($rubriekvariabele != " zoek op rubriek.." && $rubriekvariabele != "" && ($bedrijfvariabele == " zoek op bedrijfsnaam.." || $bedrijfvariabele == "")) {

$params = array($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);

如果我填写一个字段,SQL的ECHO会给出这个:

SELECT * FROM profiles WHERE plaats = ? 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

打印$ params给出了这个:

Array ( [0] => \'s-Gravenmoer )

1 个答案:

答案 0 :(得分:1)

在几个地方:

array_push($params, $rubriekvariabele);  
$sql .= " AND (hoofdrubriek = ? OR subrubrieken LIKE '%' + ? + '%')";

}

查询中有两个参数,但只将一个值推入params数组。每个参数都必须推送一次。