Redbeanphp - 多条件安全查询
Redbeanphp - Query securely with multiple conditions
我的数据库中有一个用户列表,例如有名字、姓氏和公司,它们都是文本字段。现在我有一个自动完成字段,可以在其中输入名字、姓氏和公司来查找具有相似姓名或公司名称的用户。我想用 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" 它 returns 一个空数组时,即使它有一个数据库条目。我会知道如何使用简单的 php 来完成它,但不知道如何完成这些多个字段可以与 RedBeanPHP 一起搜索(= 多个条件)。
要求:在WHERE
子句中使用redbeanPHP
find function
.
时,添加多个条件
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'] .'%')
);
确实如此。
我的数据库中有一个用户列表,例如有名字、姓氏和公司,它们都是文本字段。现在我有一个自动完成字段,可以在其中输入名字、姓氏和公司来查找具有相似姓名或公司名称的用户。我想用 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" 它 returns 一个空数组时,即使它有一个数据库条目。我会知道如何使用简单的 php 来完成它,但不知道如何完成这些多个字段可以与 RedBeanPHP 一起搜索(= 多个条件)。
要求:在WHERE
子句中使用redbeanPHP
find function
.
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'] .'%')
);
确实如此。