Как и во многих других случаях, это было бы намного проще с 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 " . explode(" 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()) {
// ....
}
}
Обратите внимание, что этот код позволяет кому-то перечислить всю базу данных;если это не ваше намерение, оберните все в оператор 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 " . explode(" 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);
}