什么是正确的MySQL数据库语句,其中变量定义为所有行

时间:2017-01-13 21:42:49

标签: php mysql

我试着解释这个好人,

我有一个包含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会返回所有行吗?

3 个答案:

答案 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注入。