dro*_*ooh 0 php mysql mysqli prepared-statement
我有一个包含学生记录的数据库,大约有 50 列左右,所有这些都需要可搜索。我熟悉如何通过附加字段来构建动态搜索查询。我似乎找不到任何关于使用本质上是动态的准备好的语句搜索 MySQL 数据库的示例。例如,在搜索时您只会输入您需要搜索的字段,因此,您如何根据用户输入构建动态准备好的语句?
这是一个如何在没有准备好的语句的情况下执行此操作的示例,但是这很容易发生 SQL 注入。我需要用一个函数“清理”每个变量。但是,使用准备好的声明会更安全。
function clean($con,$var){
$var = trim($var);
$var = strtolower($var);
$var = mysqli_real_escape_string($con,$var);
return $var;
}
if(isset($_REQUEST['sub'])){
if(isset($_REQUEST['student_fname'])){
$student_fname = null;
if($_REQUEST['student_fname'] != ''){
$student_fname = '&& `student_fname` = \''.clean($con,$_REQUEST['student_fname']).'\' ';
}
}
if(isset($_REQUEST['student_lname'])){
$student_lname = null;
if($_REQUEST['student_lname'] != ''){
$student_lname = '&& `student_lname` = \''.clean($con,$_REQUEST['student_lname']).'\' ';
}
}
$sql = "SELECT * FROM `student_records`
WHERE 1=1
$student_fname
$student_lname
ORDER BY class ASC, student_lname ASC";
echo $sql;
}
Run Code Online (Sandbox Code Playgroud)
与许多事情一样,使用 PDO 会容易得多。但是,就在我的脑海中,这就是我将如何处理它。你需要在这里建造3个结构。SQL、参数类型列表(“s”或“i”)和参数列表本身。这一切都非常简单。
bind_param()如果您以前没有这样做过,将它放入函数可能会有点棘手,但正如其他地方详述的那样,一旦您将所有参数都放入数组中,参数解包运算符就可以很好地工作。
对于您的 POST 变量,请记住empty()检查数组元素是否存在,以及它是否为非空。这将为您节省额外的检查,唯一的警告是empty("0") === true.
<?php
if (isset($_REQUEST['sub'])) {
$types = "";
$where = [];
$params = [];
if (!empty($_REQUEST['student_fname'])) {
$types .= 's';
$where[] = 'student_fname = ?';
$params[] = $_REQUEST['student_fname'];
}
if (!empty($_REQUEST['student_lname'])) {
$types .= 's';
$where[] = 'student_lname = ?';
$params[] = $_REQUEST['student_lname'];
}
if (count($where)) {
$where = "AND " . implode(" AND ", $where);
} else {
$where = "";
}
$sql = "SELECT * FROM student_records
WHERE 1=1
$where
ORDER BY class ASC, student_lname ASC";
$stmt = $con->prepare($sql);
$stmt->bind_param($types, ...$params);
$stmt->execute();
while ($res = $stmt->get_result()) {
// ....
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,此代码允许某人列出整个数据库;如果这不是您的意图,请将所有内容都包含在if (count($where))声明中。
在 PDO 中,事情要容易得多,不需要绑定并且参数已经作为数组传递了。
<?php
if(isset($_REQUEST['sub'])){
$where = [];
$params = [];
if(!empty($_REQUEST['student_fname'])) {
$where[] = 'student_fname = ?';
$params[] = $_REQUEST['student_fname'];
}
if(!empty($_REQUEST['student_lname'])){
$where[] = 'student_lname = ?';
$params[] = $_REQUEST['student_lname'];
}
if (count($where)) {
$where = "AND " . implode(" AND ", $where);
} else {
$where = "";
}
$sql = "SELECT * FROM student_records
WHERE 1=1
$where
ORDER BY class ASC, student_lname ASC";
$stmt = $con->prepare($sql);
$stmt->execute($params);
$data = $stmt->fetchAll(\PDO::FETCH_ASSOC);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
604 次 |
| 最近记录: |