我的数据库中有一个用户列表,例如有名字、姓氏和公司,它们都是文本字段。现在我有一个自动完成字段,可以在其中输入名字、姓氏和公司来查找具有相似姓名或公司名称的用户。我想用 RedbeanPHP 来完成这个。不幸的是,文档没有解释如何将多个条件实现到它们的“查找器”功能中。此外,“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函数
时,在WHERE
子句中添加多个条件。
find
函数需要一个有效的 SQL
WHERE
子句。它可以是任何有效的 SQL。通常,需要一些多列过滤器。
示例:匹配 firstname
OR lastname
OR company
。
SQL 查询字符串类似于:
' (firstname LIKE ?) or (lastname LIKE ?) or (company LIKE ?)'
现在,有三个占位符
,所以当执行查询时,它需要在parameters
数组中包含三个运行时值。
例子:
array( '%'. $_POST['firstname'] .'%',
'%'. $_POST['lastname'] .'%',
'%'. $_POST['company'] .'%'
)
现在,redbeanPHP
获取您提供的 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'] .'%')
);
确实如此。
关于php - Redbeanphp - 多条件安全查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33169273/