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一起搜索(=多个条件)。
答
要求:当使用redbeanPHP
find function
时,将多个条件添加到WHERE
子句。
find
函数期望有效的SQL
WHERE
子句。它可以是任何有效的SQL。通常,这是一些多列过滤器,是必需的。
示例:匹配firstname
或lastname
或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'] .'%')
);
实际上做。
我怀疑你是在估计'redbeanPHP'''''函数的作用。它接受sql字符串并将其附加到'WHERE'语句之后生成的SQL中。然后准备产生的SQL查询字符串。所以:要匹配名字和姓氏,请使用SQL字符串:''firstname LIKE?和姓氏LIKE?''作为SQL。如你所愿,'where子句'可能很复杂。 'exec'功能类似。 –
'$ userRbList = R :: find('user','(firstname LIKE?)or(lastname LIKE?)or(company LIKE?)',['%'。$ _POST ['autocomplete']。'%' ]);'不起作用,例如预期 – hardking
好吧,谢谢你的作品!如果你想,你可以回答这个问题,我会给你一个投票,并将其标记为最佳答案 – hardking