所以我正在尝试为 sql 表创建一个过滤器。所以本质上,用户选择多个下拉菜单,然后我根据这些值运行对 sql 的查询。
这就是我填充下拉菜单的方式:
<?php
$conn = sqlsrv_connect( $serverName, $connectionInfo);
$sql = "SELECT [EQUIP TYPE] as EQUIPTYPE, PROPERTY, AUTOMATEDSYSTEM FROM TrimTable";
$query = sqlsrv_query($conn,$sql);
if ($query === false)
{
echo "Could not link to SQL Server";
}
while ($row = sqlsrv_fetch_array($query))
{
$EQUIPTYPE[] = "$row[EQUIPTYPE]";
$PROPERTY[] = "$row[PROPERTY]";
$AUTOMATEDSYSTEM[] = "$row[AUTOMATEDSYSTEM]";
}
echo "<div><table class='SearchBox'>";
echo "<thead></thead>";
echo "<tbody>";
echo "<tr>";
$EQUIPTYPE_unique = array_unique($EQUIPTYPE);
sort($EQUIPTYPE_unique);
echo "<td>Equip Type</td>";
echo "<td><select style='width: 110px;' name='EquipType'>";
echo "<option selected='selected' value='%'>Select</option>";
foreach($EQUIPTYPE_unique as $key => $value):
echo '<option value="'.$value.'">'.$value.'</option>';
endforeach;
echo "</select></td>";
$PROPERTY_unique = array_unique($PROPERTY);
sort($PROPERTY_unique);
echo "<td>Property</td>";
echo "<td><select style='width: 110px;' name='PropertyOption'>";
echo "<option selected='selected' value='%'>Select</option>";
foreach($PROPERTY_unique as $key => $value):
echo '<option value="'.$value.'">'.$value.'</option>';
endforeach;
echo "</select></td>";
$AUTOMATEDSYSTEM_unique = array_unique($AUTOMATEDSYSTEM);
sort($AUTOMATEDSYSTEM_unique);
echo "<td>Automated System</td>";
echo "<td><select style='width: 110px;' name='AutomatedSystem'>";
echo "<option selected='selected' value='%'>Select</option>";
foreach($AUTOMATEDSYSTEM_unique as $key => $value):
echo '<option value="'.$value.'">'.$value.'</option>';
endforeach;
echo "</select></td>";
echo "</tr>";
echo "</tbody>";
echo "</table>";
?>
现在,一旦选择了下拉菜单,我就会有一个搜索按钮,它会执行如下所示的新 php 代码:
<?php
session_start();
$_SESSION['AutomatedSystem'] = $_POST['AutomatedSystem'];
$AutomatedSystemOp = $_SESSION['AutomatedSystem'];
$_SESSION['PropertyOption'] = $_POST['PropertyOption'];
$PropertyOp = $_SESSION['PropertyOption'];
$_SESSION['EquipType'] = $_POST['EquipType'];
$EquipTypeOp = $_SESSION['EquipType'];
$conn = new PDO('sqlsrv:Server=mzrefd39,1433;Database=ger_mapv', $username, $password);
$sth = $conn->prepare("SELECT TAG,DESCRIPTION FROM TrimTable WHERE [AUTOMATED SYSTEM] LIKE ? AND [EQUIP TYPE] LIKE ? AND PROPERTY LIKE ? ORDER BY TAG");
$sth->execute(array($AutomatedSystemOp, $EquipTypeOp, $PropertyOp));
$data = $sth->fetchAll();
$length = count($data);
for($i=0; $i<$length; $i++)
{
// This is where i just arrange the data way I want to?
}
?>
现在问题来了,可能是我在第一组代码中的下拉菜单没有被选中,所以它保持默认状态“Select”,value=“%”。这意味着在对表(第二 block )中的数据运行查询时,它会查看所有内容 (%)。有没有办法,我可以给它一个值,它根本不寻找它(因为不关心这个领域)。我会觉得那样会更快吗?那可能吗?
更新
我想我不是很清楚。我有三个选择。假设我为 EQUIPTYPE 和 AUTOMATEDSYSTEM 选择了值。我将 PROPERTY 保留为其默认值,即 select。所以当我的第二 block 代码运行时,它只针对EQUIPTYPE和AUTOMATEDSYSTEM运行,而第三个值PROPERTY是%,不需要运行。
最佳答案
当然这是一个简单的例子(未经测试)
假设我们有这些选择:
<select name="id" >
<option value="" > - Pick an ID- </option> <!-- default value -->
<option value="1" > ID One </option>
</select>
<select name="color" >
<option value="" > - Pick an Color- </option> <!-- default value -->
<option value="red" > Red </option>
</select>
然后在php中我们可以做到这一点
$sql = 'SELECT * FROM table WHERE';
$where = array();
$param = array();
if ( !empty( $_POST['id'] ) ){
//id is empty '' by default
$where[] = 'id = :id';
$param[':id'] = $_POST['id'];
}
if ( !empty( $_POST['color'] ) ){
//color is empty '' by default
$where[] = 'color = :color';
$param[':color'] = $_POST['color'];
}
///etc ...
$result = array();
if( !empty( $where ) ){
$stmt = $sth->prepare( $sql . implode( ' AND ', $where ));
$stmt->execute( $param );
$result = $stmt->fetchAll( PDO::FETCH_ASSOC );
}else{
//do some thing for no search>?
}
return $result;
添加额外的 $where
元素更加简洁和容易,唯一的缺点是如果您有更复杂的查询,或者同时需要 AND
和 或
。
关于php - 如何在未选择 WHERE 值的 php 中运行查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32742500/