【问题标题】:Redbeanphp - Query securely with multiple conditionsRedbeanphp - 使用多个条件安全查询
【发布时间】:2016-01-15 03:15:00
【问题描述】:

我的数据库中有一个用户列表,例如带有名字、姓氏和公司,它们都是文本字段。现在我有一个自动完成字段,可以在其中输入名字、姓氏和公司来查找具有相似姓名或公司名称的用户。我想用 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”时,它返回一个空数组,即使它有一个数据库条目。我会知道如何使用普通的 php 来完成,但不知道如何使用 RedBeanPHP 一起搜索这些多个字段(= 多个条件)。

【问题讨论】:

  • 我怀疑你高估了 redbeanPHP find 函数的作用。它获取 sql 字符串并将其附加到 WHERE 语句之后生成的 SQL。然后它准备生成的SQL 查询字符串。所以:要匹配名字和姓氏,请使用 SQL 字符串:' firstname LIKE ? and lastname LIKE ?' 作为 SQL。 where clause 可以是一个复杂的,如你所愿。 exec 函数类似。
  • $userRbList = R::find( 'user', ' (firstname LIKE ?) or (lastname LIKE ?) or (company LIKE ?)', [ '%' . $_POST['autocomplete'] . '%' ] ); 不能像预期的那样工作
  • 好的,谢谢!如果您愿意,您可以回答问题,我会给您投票并将其标记为最佳答案

标签: php mysql redbean


【解决方案1】:

要求:使用redbeanPHPfind function时,在WHERE子句中添加多个条件。

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']   .'%')
       );

确实如此。

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2017-08-06
    • 1970-01-01
    相关资源
    最近更新 更多