【问题标题】:Warning: Invalid parameter number: number of bound variables does not match number of tokens警告:参数号无效:绑定变量的数量与标记的数量不匹配
【发布时间】:2014-06-11 00:56:09
【问题描述】:

在我的 news.php 文件中,我有以下代码,如果用户发送此字段,则使用我的 $search 变量读取我的函数 Paginator。如果用户没有发布我的输入,我会打电话给我的 Paginator 没有$search 变量。

if(isset($_POST['search']) && $_POST['search'] != 'Search:'){
    $search = $_POST['search'];
    Paginator('news', "WHERE title LIKE ? ORDER BY date DESC", $max, $link, $pag, $search);
}
else{
    Paginator('news', "ORDER BY date DESC", $max, $link, $pag);
}

然后在我的函数 Paginator 中,我想做一个不同的选择,这取决于我是否传递了我的变量 $search(如果用户发布了这个变量)。

所以下面是我做分页器的功能:(但我只把对我的问题重要的部分功能放在这里)

function Paginator($table, $cond, $max, $link, $pag, $search = NULL){
    $pdo = conect();
    if($search){
        $read = $pdo->prepare("SELECT * FROM {$table} {$cond}");
        $read->bindValue(1,"%$search%",PDO::PARAM_STR);
        $read->bindParam(2,$table,PDO::PARAM_STR);
        $read->bindParam(3,$cond,PDO::PARAM_STR);       
    }
    else{
        $read = $pdo->prepare("SELECT * FROM {$table} {$cond}");
        $read->bindParam(1,$table,PDO::PARAM_STR);
        $read->bindParam(2,$cond,PDO::PARAM_STR);
    }

    $read->execute();
}

这是我的表格:

<form name="searchpost" action="" method="post">
     <input type="text" name="search" onclick="if(this.value=='Search:')this.value=''" onblur="if(this.value=='')this.value='Search:'" value="Search:" />
     <input type="submit" value="Search"  name="sendForm" />
</form>

但我总是遇到这个错误:

警告:PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number:绑定变量的数量与我的函数 Paginator in $read->execute() 中的标记数量不匹配;

你能帮忙找出我做错了什么吗?

【问题讨论】:

  • $table$cond 不应绑定到查询。
  • 那么,当您的查询只有一个变量时,为什么还要绑定 3 个变量呢?表名不能绑定

标签: php sql pdo


【解决方案1】:

您只能在 PDO 语句中绑定值,而不是表名或列名或 sql 的完整部分。

除此之外,您甚至没有为表名和条件字符串使用占位符(我假设 $tabela 只是一个错字)。

所以您只在if 语句中绑定一个变量,而在else 部分中没有绑定一个变量(无论如何您都不需要...):

$read = $pdo->prepare("SELECT * FROM {$table} {$cond}");
if($search){
    $read->bindValue(1,"%$search%",PDO::PARAM_STR);
}

为避免 sql 注入问题,您应该对直接在 sql 中注入的变量使用白名单。

【讨论】:

  • 感谢您的回答 jeroen。但是,如果我不提交我的表单,我的分页结果会很好,所以看起来工作将我的表格和我的条件与 pdo 绑定在一起!而且我认为我需要我的 else,因为如果我不提交我的表单,我想在没有我的 like 声明的情况下选择!
  • 我的查询也没问题,如果提交表单并且我 print_r my $read 我得到 PDOStatement 对象([queryString] => SELECT * FROM news WHERE title LIKE ? ORDER BY date DESC )如果我不要提交我得到 PDOStatement 对象( [queryString] => SELECT * FROM news ORDER BY date DESC )。
  • 好吧,但我试过你的代码,它可以工作!现在我没有我的错误!但这很奇怪,因为在我做这个搜索表单之前,我已经在使用我的 Paginator 函数在我的 news.php 中进行分页,并且我正在绑定我的表格,所以我不明白为什么现在不起作用!但是我的分页不能正常工作,但您的解决方案有效,谢谢!
  • @OzzC 奇怪,由于绑定了太多值,我看不出您的任何原始 sql 语句如何工作。但如果它现在有效,我想这不再重要了......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多