2015-10-16 41 views
2

我有我的數據庫中的用戶列表,例如與名字,姓氏和公司,這些都是文本字段。現在我有一個自動填充字段,可以輸入名字,姓氏和公司名稱來查找具有類似名稱或公司名稱的用戶。我想用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

回答

1

要求:當使用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'] .'%') 
     ); 

實際上做。