params数组MySQLi的动态绑定

时间:2016-07-06 17:38:32

标签: php mysql mysqli

我正在为我的网站构建搜索功能,用户可以使用3个参数进行搜索。用户可以选择输入全部3来过滤表或根本不输入并接收整个表。我想出了如何动态构建查询,具体取决于用户输入的内容,但我无法使用正确数量的参数和正确的顺序调用bind_params()

代码:

$sql = "SELECT position, rank, fullname, phonenumber, email, division 
FROM `table` WHERE 1=1 ";


if(!empty($_POST['fname'])){
   $firstname = $_POST['fname'];
   $sql .= " AND `fullname` LIKE '%?%'";
}


if($_POST['div'] !== "All"){
   $division = $_POST['div'];
   $sql .= " AND `division` LIKE '%?%'";
}


if(!empty($_POST['pos'])){
   $position = $_POST['pos'];
   $sql .= " AND `position` LIKE '%?%'";
}


$stmnt = $db->prepare($sql);
$stmnt -> bind_param('sss', $firstname, $division, $position); 
$stmnt -> bind_result($position, $rank, $fullname, $phonenumber, $email,$division);
$stmnt -> execute();

我总是收到这个错误:Number of variables doesn't match number of parameters in prepared statement我理解为什么我会得到它但我尝试了多项但却没有成功。任何提示或文档链接都是有用的。感谢

1 个答案:

答案 0 :(得分:2)

您可以将数据和参数作为数组传递:

$data = array();
$format = array();

if(!empty($_POST['fname'])){
    $firstname = $_POST['fname'];
    $sql .= " AND `fullname` LIKE '%?%'";
    $format[] = 's';
    $data[] = $firstname;
}

然后通过引用传递它们并使用call_user_func_array

绑定
if(!empty($format) && !empty($data)):

            $format = implode( '', $format );
            $format = str_replace( '%', '', $format );

            array_unshift( $data, $format );
            call_user_func_array( array( $stmnt , 'bind_param' ), (referenceValues( $data ) );

        endif;

传递参考函数:

public function referenceValues($array)
    {
        $refs = array();

        foreach ($array as $key => $value):

            $refs[$key] = &$array[$key];

        endforeach;

        return $refs; 
    }