Redbeanphp-使用多个条件安全查询

Redbeanphp-使用多个条件安全查询,php,mysql,redbean,Php,Mysql,Redbean,我的数据库中有一个用户列表,例如firstname、lastname和company,它们都是文本字段。现在我有了一个自动完成字段,可以在其中输入firstname、lastname和company来查找具有类似名称或公司名称的用户。我想用RedbeanHP完成这项工作。不幸的是,文档没有解释如何在“finder”函数中实现多个条件。另外,“exec”函数也没有很好地解释,因为在那里我不知道如何将表单中的值准备到手动语句中 以下是我的解决方案,当输入firstname、lastname或comp

我的数据库中有一个用户列表,例如firstname、lastname和company,它们都是文本字段。现在我有了一个自动完成字段,可以在其中输入firstname、lastname和company来查找具有类似名称或公司名称的用户。我想用RedbeanHP完成这项工作。不幸的是,文档没有解释如何在“finder”函数中实现多个条件。另外,“exec”函数也没有很好地解释,因为在那里我不知道如何将表单中的值准备到手动语句中

以下是我的解决方案,当输入firstname、lastname或company时,它确实可以查找用户:

        if (!empty($_POST['autocomplete'])) {
            $userListbyFirstname = R::find( 'user', ' firstname LIKE ?', [ '%' . $_POST['autocomplete'] . '%' ] );
            $userListbyLastname = R::find( 'user', ' lastname LIKE ?', [ '%' . $_POST['autocomplete'] . '%' ] );
            $userListbyCompany = R::find( 'user', ' company LIKE ?', [ '%' . $_POST['autocomplete'] . '%' ] );
            $userRbList = array_merge($userListbyFirstname, $userListbyLastname, $userListbyCompany);
            $userList = array();
            foreach ($userRbList as $userRb) {
                $userList[] = $userRb['firstname'] . ' ' . $userRb['lastname'] . ' ' . (!empty($userRb['company']) ? $userRb['company'] : '');
            }
            return json_encode($userList);
        }
        else
        {
            return json_encode(array());
        }

当有人输入“johnwilliams”时,它返回一个空数组,即使它有一个数据库条目。我知道如何使用普通php,但不知道如何使用RedbeanHP一起搜索这些多个字段(=多个条件)。

要求:在使用
RedbeanHP
查找函数时,向
WHERE
子句添加多个条件

find
函数需要一个有效的
SQL
WHERE
子句。它可以是任何有效的SQL。通常,需要一些多列过滤器

示例:匹配
firstname
lastname
公司

SQL查询字符串类似于:

' (firstname LIKE ?) or (lastname LIKE ?) or (company LIKE ?)'
现在,有三个
占位符
,因此当执行查询时,
参数
数组中需要三个运行时值

例如:

array( '%'. $_POST['firstname'] .'%',
       '%'. $_POST['lastname']  .'%',
       '%'. $_POST['company']   .'%' 
    ) 
现在,
redbeanppp
获取您提供的SQL
where
子句,并将其附加到生成的查询中。然后,它准备生成的SQL,如下所示:

SELECT * 
FROM user
WHERE  (firstname LIKE ?) or (lastname LIKE ?) or (company LIKE ?);
然后,它使用您提供的运行时参数数组执行查询

这就是:

R::find('user', 
        ' (firstname LIKE ?) or (lastname LIKE ?) or (company LIKE ?)',             
         array( '%'. $_POST['firstname'] .'%',
                '%'. $_POST['lastname']  .'%',
                '%'. $_POST['company']   .'%')
       );

事实上是这样

我怀疑您高估了
redbeanppp
find
函数的功能。它获取sql字符串并将其附加到
WHERE
语句后面生成的sql。然后它准备生成的
SQL
查询字符串。所以:要匹配名字和姓氏,请使用SQL字符串:
'firstname LIKE?和lastname类似?“
作为SQL。
where子句
可以是一个复杂的语句。
exec
函数类似。
$userRbList=R::find('user','(类似于名字?)或(类似于姓氏?)或(类似于公司?),['%'。$\u POST['autocomplete'.%')不工作,例如像expectedokay,谢谢你的工作!如果你愿意,你可以回答这个问题,我会给你投票,并把它列为最佳答案