我试图为我的程序创建一个搜索代码,我在PHP中编写,我试图找出一个好方法来使我的代码更紧凑。PHP是我看YouTube学的,饶了我吧;)
开头:
if (empty($_POST['nick-cc'])) {
$sql = "SELECT * FROM pcr WHERE student = $user->id";
} else {
$sql = "SELECT * FROM pcr WHERE student = $user->id AND cc = '%$nccn%'";
}
"if"语句必须对数据库中的每一列重复。所以我开始思考,为什么我不能在字段中使用SQL开头的"*"来显示,如果没有搜索输入,它将返回所有内容。这样,如果有人来到这个页面,或者只是没有输入任何东西,点击"搜索",它仍然会搜索,但它会搜索*(所有),但如果他们输入了什么,它会搜索。这就是我的想法。
但不用说,这对我不起作用。这是徒劳无功吗?有没有更好的办法?
if (empty($_POST['nick-cc'])) {
$nccn = '*';
} else {
$nccn = ''.$_POST['nick-cc'].'';
}
$sql = "SELECT * FROM pcr WHERE student = $user->id AND cc = '%$nccn%'";
我真的看不出有什么理由让你的搜索更复杂。我通常只是像这样附加LIKE
子句:
$sql = "SELECT * FROM pcr WHERE student = $user->id";
if($_POST['nick-cc'] !== ''){
$sql .= " AND cc = '%$nccn%'";
}
更重要的是,使用这种方法容易受到sql注入的攻击。我建议您研究参数化查询和预处理语句。下面是一个使用内置Mysqli
类的简单代码示例。
$sql = 'SELECT * FROM pcr WHERE student = ?';
$mysqli = new Mysqli($host, $username, $password, $database);
if($_POST['nick-cc'] === ''){
$stmt = $mysqli->prepare($sql);
if($stmt === false){
// there was an error
}
$stmt->bind_param('i', $user->id);
}else{
$sql .= ' AND cc = ?';
$stmt = $mysqli->prepare($sql);
if($stmt === false){
// there was an error
}
$stmt->bind_param('is', $user->id, '%' . $_POST['nick-cc'] . '%');
}
$stmt->execute(); // returns true or false
var_dump($stmt->fetch_array()); // return the results
你为什么不试试这个呢:
if (empty($_POST['nick-cc'])) {
$nccn = NULL;
} else {
$nccn = ' AND cc = %'.$_POST['nick-cc'].'%';
}
$sql = "SELECT * FROM pcr WHERE student = $user->id $nccn";