Redbeanphp - 多条件安全查询

Redbeanphp - Query securely with multiple conditions

我的数据库中有一个用户列表,例如有名字、姓氏和公司,它们都是文本字段。现在我有一个自动完成字段,可以在其中输入名字、姓氏和公司来查找具有相似姓名或公司名称的用户。我想用 RedbeanPHP 来完成这个。不幸的是,文档没有解释如何将多个条件实现到它们的 "finder" 函数中。 "exec"-函数也没有很好地解释,因为我不知道如何将表单中的值准备到手动语句中。

这是我的解决方案,可以在输入名字、姓氏或公司时找到用户:

        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());
        }

当有人输入 "John Williams" 它 returns 一个空数组时,即使它有一个数据库条目。我会知道如何使用简单的 php 来完成它,但不知道如何完成这些多个字段可以与 RedBeanPHP 一起搜索(= 多个条件)。

要求:在WHERE子句中使用redbeanPHPfind function.

时,添加多个条件

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

示例:匹配 firstname OR lastname OR company.

SQL 查询字符串类似于:

' (firstname LIKE ?) or (lastname LIKE ?) or (company LIKE ?)'

现在,有三个 placeholders,所以当执行查询时,parameters 数组中需要三个运行时值。

示例:

array( '%'. $_POST['firstname'] .'%',
       '%'. $_POST['lastname']  .'%',
       '%'. $_POST['company']   .'%' 
    ) 

现在,redbeanPHP 采用您提供的 SQL where 子句并将其附加到生成的查询中。然后 prepares 结果 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']   .'%')
       );

确实如此。