警告:参数号无效:绑定变量数与令牌数不匹配

时间:2014-06-10 16:00:20

标签: php sql pdo

在我的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]:参数号无效:绑定变量的数量与我的函数Paginator中的令牌数量不匹配$ read-&gt; execute();

你能帮我找一些帮我找错的吗?

1 个答案:

答案 0 :(得分:1)

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

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

所以你只在if语句中绑定一个变量而在else部分中没有绑定(你不需要它......):

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

为了避免sql注入问题,你应该使用白名单来直接在sql中注入变量。