我试着解释这个好人,
我有一个包含20个问题的数据库,有两个原则:1)心脏病学和2)内分泌。您可以选择使用HTML选择菜单中的任何一个概念,也可以选择3)全部。
在我的html页面上,我有一个包含3个选项的选择菜单,每个选项都有一个值:
<div id="selectContainer1">
<select id="selectedPrinciple" name="selectedPrinciple">
<option value="" disabled="disabled" selected="selected">Select a System</option>
<option value="">All</option>
<option value="VASCULAR">Cardiology, Vascular System</option>
<option value="ENDOCRINE">Endocrine</option>
</select>
</div>
<input type="submit" value="Start">
我在php上有这个代码:
$selectedPrinciple = $_POST['selectedPrinciple'];
$sql = ("SELECT * FROM qbanktable WHERE Principle = '$selectedPrinciple'"
现在,当我选择“心脏病学”或“内分泌”选项时,所有与这些相关的行都从我的数据库中挑选出来并显示在下一页上。但是,当我选择“全部”时,我得到一个语法错误,因为它当然没有值,我的数据库中找不到该行。我可以为“All”的选项值添加什么,mysql会返回所有行吗?
答案 0 :(得分:1)
您可以检查$selectedPrinciple
是否为empty()
并相应地修改查询。
$selectedPrinciple = $_POST['selectedPrinciple'];
if(!empty($selectedPrinciple)) {
// this line indicates that you don't use prepared statements
$sql = "SELECT * FROM `qbanktable` WHERE `Principle` = '$selectedPrinciple'";
} else {
$sql = "SELECT * FROM `qbanktable`";
}
使用mysqli预备语句的完整示例
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$selectedPrinciple = $_POST['selectedPrinciple'];
if(!empty($selectedPrinciple)) {
// prepare and bind
$stmt = $conn->prepare("SELECT * FROM `qbanktable` WHERE `Principle` = ?");
$stmt->bind_param("s", $selectedPrinciple);
} else {
// prepare
$stmt = $conn->prepare("SELECT * FROM `qbanktable`");
}
// execute
$stmt->execute();
// fetch data
if (!($res = $stmt->get_result())) {
echo "Failed to fetch the result set: (" . $stmt->errno . ") " . $stmt->error;
}
// print data
print_r($res->fetch_all());
// close prepared statement
$stmt->close();
// close connection
$conn->close();
答案 1 :(得分:1)
就个人而言,我喜欢使用一些技巧来构建&#34;我的查询,如下:
注意:强>
我演示了如何使用PDO和参数绑定来实现这一点,因为您的查询对SQL注入攻击是开放的。
$sql = "SELECT * FROM `qbanktable`";
$where = [];
$params = [];
if ( ! empty( $_POST['selectedPrinciple'] ) ) {
$where[] = '`Principle` = ?';
$params[] = $_POST['selectedPrinciple'];
}
if ( /* some other condition */ ) {
// add to the $where / $params as appropriate
}
// Glue the $where into a string
$where = implode( ' AND ', $where );
// Append where to the $sql statement
$sql .= ( $where ) ? ' WHERE ' . $where : '';
// assumes $conn is already a set-up PDO connection
$stmt = $conn->prepare( $sql );
$stmt->execute( $params );
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
答案 2 :(得分:0)
我认为最好的方法是在PHP中检查selectedPrinciple的值是否为ALL或为空,然后不添加查询的WHERE部分。
如果真的想为All选项使用一些值,你可以尝试使用一个或两个百分号'%'或'%%',但我不记得它是否有效。但是,我不推荐这种方法。关注SQL注入。