我有这个SQL查询:
$sql2 = "SELECT * FROM MyTable WHERE time1='".$_POST['time']."' AND type1='".$_POST['type']."';
结果:$result1 = $conn->query($sql2);
if ($result1->num_rows > 0) {
// output data of each row
while($row = $result1->fetch_assoc()) {
echo $row["name1"];
-
name1
行为数据库中活动的名称。
HTML表单有以下两个选择列表:
<select id="time" name="time" required="" data-do-validate="true">
<option value="">Select ...</option> // this is the NULL value
<option value="time1">Type 1</option>
<option value="time2">Type 2</option>
<option value="time3">Type 3</option>
<option value="time4">Type 4</option>
</select>
<select id="type" name="type" required="" data-do-validate="true">
<option value="">Select ...</option> // this is the NULL value
<option value="type1">Type 1</option>
<option value="type1">Type 2</option>
<option value="type1">Type 3</option>
<option value="type1">Type 4</option>
</select>
所以我尝试做的是从数据库中选择所有活动的名称与HTML表单提交的匹配数据。
BUT我另外想要的是忽略SQL选择的时间(例如),如果用户留下的值为空(选择…),在这种情况下,结果将是仅基于类型的所有活动的名称。如果他选择了一个时间和一个类型,在这种情况下的结果将根据 time 和 type 的活动更加指定。
我能做什么?
谢谢!
为什么要运行一个完整的动态构建查询?
SELECT * FROM MyTable WHERE (1=? AND time1=?) AND type1=?;
具有参数值:isset($_POST['time']) ? 1 : 0
、isset($_POST['time']) ? $_POST['time'] : null
、$_POST['type']
。
MySQL将处理不做(1=0 AND time1=?)
部分的优化
您可以根据$_POST值构建语句(顺便说一下,在生产中您不应该直接在SQL语句中使用$_POST值)。
$connect = "";
$sql2 = "SELECT * FROM MyTable ";
if($_POST['time']!='' || $_POST['type']!='') {
$sql2 .= "WHERE ";
if($_POST['time']!='') {
$sql2 .= "time1='".$_POST['time']."'";
$connect = " AND ";
}
if($_POST['type']!='') {
$sql2 .= $connect . "type1='".$_POST['type']."'";
}
}
if(isset($_POST["time"])){ // Not Empty
$sql2 = "SELECT * FROM MyTable WHERE time1='".$_POST['time']."' AND type1='".$_POST['type']."';
}
else{ //Only select the type
$sql2 = "SELECT * FROM MyTable WHERE type1='".$_POST['type']."';
}
$result1 = $conn->query($sql2);
if ($result1->num_rows > 0) {
// output data of each row
while($row = $result1->fetch_assoc()) {
echo $row["name1"];