Redbeanphp - 安全地查询多个条件

问题描述:

我有我的数据库中的用户列表,例如与名字,姓氏和公司,这些都是文本字段。现在我有一个自动填充字段,可以输入名字,姓氏和公司名称来查找具有类似名称或公司名称的用户。我想用RedbeanPHP来完成这个任务。不幸的是,文档没有解释如何在他们的“finder”函数中实现多个条件。另外,“exec”功能没有解释得很好,因为我不知道如何从表单中准备值到手动语句中。Redbeanphp - 安全地查询多个条件

这里是我的解决方案,它进入任一名字或姓氏或公司时,发现用户:

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

当有人进入“约翰·威廉斯”它返回一个空数组,即使有一个数据库条目它。我会知道如何使用普通的PHP来做到这一点,但不知道如何完成,这些多个字段可以与RedBeanPHP一起搜索(=多个条件)。

+0

我怀疑你是在估计'redbeanPHP'''''函数的作用。它接受sql字符串并将其附加到'WHERE'语句之后生成的SQL中。然后准备产生的SQL查询字符串。所以:要匹配名字和姓氏,请使用SQL字符串:''firstname LIKE?和姓氏LIKE?''作为SQL。如你所愿,'where子句'可能很复杂。 'exec'功能类似。 –

+0

'$ userRbList = R :: find('user','(firstname LIKE?)or(lastname LIKE?)or(company LIKE?)',['%'。$ _POST ['autocomplete']。'%' ]);'不起作用,例如预期 – hardking

+0

好吧,谢谢你的作品!如果你想,你可以回答这个问题,我会给你一个投票,并将其标记为最佳答案 – hardking

要求:当使用redbeanPHPfind function时,将多个条件添加到WHERE子句。

find函数期望有效的SQLWHERE子句。它可以是任何有效的SQL。通常,这是一些多列过滤器,是必需的。

示例:匹配firstnamelastnamecompany

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

实际上做。