【问题标题】:php dynamic mysql query for filters [duplicate]过滤器的php动态mysql查询[重复]
【发布时间】:2017-06-15 14:19:10
【问题描述】:

我正在尝试实现动态 sql 查询,以便用户可以灵活地使用一个或多个过滤器来挖掘出他想要的数据。我正在使用准备好的语句来确保没有 SQL 注入。我正在使用 WAMP 服务器 64 位。 写代码参考了这篇文章:Sample

以下是我的代码:

$myqry="SELECT * FROM students WHERE ";
$initflag=0; //controls the first clause without AND and rest with AND
$paramtypes=array();
$paramvalues=array();
$params=array();
if(!empty($_POST['awr_admyear']))
{
    $myqry.= "YEAR(adm_date)=? ";
    $initflag=1;
    $paramtypes[]='s';
    $paramvalues[]=$_POST['awr_admyear'];
}
if(!empty($_POST['awr_admfrom']) && !empty($_POST['awr_admto']))
{
    if($initflag==0)
        $myqry.= "YEAR(adm_date) BETWEEN ? AND ? ";
    else
        $myqry.= "AND YEAR(adm_date) BETWEEN ? AND ? ";
    $initflag=1;
    $paramtype[]='s';
    $paramtype[]='s';
    $paramvalues[]=$_POST['awr_admfrom'];
    $paramvalues[]=$_POST['awr_admto'];
}
if(!empty($_POST['awradm_no']))
{
    if($initflag==0)
        $myqry.= "adm_no LIKE ? ";
    else
        $myqry.= "AND adm_no LIKE ? ";
    $initflag=1;
    $paramtype[]='s';
    $paramvalues[]=$_POST['awradm_no'];
}
$params = array_merge($paramtype,$paramvalues);
if(isset($myqry) && !(empty($myqry)))
{
    if($result1 = $mysqli->prepare($myqry))
    {
        call_user_func_array(array($result1, 'bind_param'), $params);
        if($result1->execute())
        {
            $finrest=$result1->get_result();
            while($row= $finrest->fetch_assoc()) 
            {
  //and so on

我收到以下错误:

Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in..................

我哪里出错了,解决办法是什么?

【问题讨论】:

  • 查看link
  • 你的php版本是多少?
  • @hungrykoala 成功了。但是在上面的代码中,第二个 if 部分传递了两个参数而不是只传递一个,这会带来错误:mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables
  • @YourCommonSense 5.6.25
  • 检查 bind_param() 定义以及您发送的内容。看在上帝的份上,切换到 PDO

标签: php mysql mysqli dynamic-programming


【解决方案1】:

1) 关注这个答案,这里提到:mysqli bind_param() expected to be a reference, value given

2) 进行以下更改:

$params = array_merge($paramtype,$paramvalues);

替换为:

$params[] = implode("", $paramtype);

$params = array_merge($params, $paramvalues);

$paramtype 是数组,但是 bind_param 需要的第一个参数应该是字符串。

【讨论】:

    猜你喜欢
    • 2019-03-10
    • 2011-08-02
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2011-01-06
    • 2013-05-08
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多