php - 来自表单输入的数组 - 选择语句 MySQLi 参数化
问题描述
将在表单输入中输入的短语转换为数组,以使用 MySQLi 传递到 MySQL 选择语句 where 子句。我拥有的 php 代码实现了这一点,但我无法锻炼如何参数化查询以防止 sql 注入攻击。我已经查看了这个网站上的一些问题,但我很难将它与我的代码联系起来。
if(!empty($_POST['Message']))
{
$searchStr = get_post($con,'Message');
$aKeyword = explode(" ", $searchStr);
$query ="SELECT m.ID, m.MessageText FROM MessageMain m LEFT OUTER JOIN Likes l on m.ID = l.PostID WHERE MessageText LIKE '%" . $aKeyword[0] . "%'";
for($i = 1; $i < count($aKeyword); $i++) {
if(!empty($aKeyword[$i])) {
$query .= " OR MessageText like '%" . $aKeyword[$i] . "%'";
}
}
$query .= " GROUP BY m.ID, m.MessageText ORDER BY count(m.id) desc";
$result = $con->query($query);
$rowcount=mysqli_num_rows($result);
解决方案
如果您想WHERE
根据要匹配的关键字的数量动态构建子句,您可以这样做:
if (!empty($_POST['Message'])) {
$searchStr = get_post($con, 'Message');
$aKeyword = explode(" ", $searchStr);
$whereClauseArr = [];
foreach ($aKeyword as $keyword) {
if ($keyword) {
$whereClauseArr[] = "MessageText LIKE ?";
$whereValues[] = '%'.$keyword.'%';
}
}
$stmt = $con->prepare(
'SELECT m.ID, m.MessageText
FROM MessageMain m
LEFT OUTER JOIN Likes l on m.ID = l.PostID
WHERE '.implode(' OR ', $whereClauseArr).'
GROUP BY m.ID, m.MessageText ORDER BY count(m.id) desc'
);
$stmt->bind_param(str_repeat('s', count($whereValues)), ...$whereValues);
$stmt->execute();
$result = $stmt->get_result();
}
尽管在您的情况下,使用正则表达式可能会更好地针对多个值检查同一列。这将使您的查询更简单,并且可能更快,具体取决于您拥有的关键字数量。
if (!empty($_POST['Message'])) {
$searchStr = get_post($con, 'Message');
$aKeyword = explode(" ", $searchStr);
$aKeyword = array_filter($aKeyword); // Remove empty values
$stmt = $con->prepare(
'SELECT m.ID, m.MessageText
FROM MessageMain m
LEFT OUTER JOIN Likes l on m.ID = l.PostID
WHERE MessageText REGEXP ?
GROUP BY m.ID, m.MessageText ORDER BY count(m.id) desc'
);
$regexString = implode('|', $aKeyword);
$stmt->bind_param('s', $regexString);
$stmt->execute();
$result = $stmt->get_result();
}
推荐阅读
- r - 如何在数据集中创建布尔变量?
- python - 梯度错误地返回无
- android - 资源是一种复杂的地图类型
- python - 在不超过总价值 500000 的情况下找到最大奖学金数量
- deep-learning - 对于计算机视觉中的图像标题问题,如果训练后的模型遇到一些从未在数据集中出现过的对象会发生什么?
- php - How to split array into all possible combinations
- git - 将提交从一个分支移动到 GitHub 中的另一个分支?
- javascript - 如何将标签添加到谷歌地图标记?(错误:InvalidValueError:setLabel:不是字符串;并且没有文本属性)
- java - 反转具有多个值的行
- javascript - React 将项目添加到列表中