想要使用php根据下拉列表选择从数据库中获取数据

时间:2016-07-27 13:36:24

标签: php mysql drop-down-menu html-select dynamic-data

我有一个php文件和mysql数据库,其中包含名为planname和price的字段,我想要一个来自数据库的所有planname的下拉列表,并且根据planname,特定planname的价格应显示在下面的文本框中。 这是我的php文件;

<?php

$servername = xxxxxxx;
$username = xxxxxx;
$password = xxxxxx";


try {
    $conn = new PDO("mysql:host=$servername;dbname=vnet", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected successfully"; 
    }
catch(PDOException $e)
    {
    echo "Connection failed: " . $e->getMessage();
    }




$sql="SELECT id,planname,price FROM plan"; 

/* You can add order by clause to the sql statement if the names are to be displayed in alphabetical order */

echo "<select name=planname value=''>Plan Name</option>"; // list box select command

foreach ($conn->query($sql) as $row){//Array or records stored in $row

echo "<option value=$row[id]>$row[planname]</option>";


/* Option values are added by looping through the array */ 

}

 echo "</select>";// Closing of list box

if(isset($_REQUEST['planname'])){
  // connection should be on this page  
    $sql = mysql_query("select price from plan where planname =".$_REQUEST['planname']);
    $res = mysql_fetch_assoc($sql);
    echo $res['price'];die;
}

echo '<input type="text3" name="price[]" id="price" value="', $row['price'], '" disabled="disabled" />';

?>

我在下拉列表中得到了这个列表但是根据计划名称无法动态获得价格。任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

$sql = mysql_query("select price from plan where planname =".$_REQUEST['planname']);

您正在列planname中搜索,但是将<option>定义为

echo "<option value=$row[id]>$row[planname]</option>";

您要将ID作为值发送。

所以你的查询应该是:

$sql = mysql_query("select price from plan where id =".$_REQUEST['planname']);
// better: pdos prepared statements
$stmt = $conn->prepare("select sub_id from sub where sub_id = ?");
$stmt->execute(array($_GET['planname']));

另请阅读其他评论。你正在混合mysql_ * api和PDO,你应该只使用PDO。 Why shouldn't I use mysql_* functions in PHP?当你在场时看到这个:How can I prevent SQL injection in PHP?

代码的结构会使维护变得非常麻烦,您应该首先完成所有逻辑工作,收集所有数据,然后在下一步中显示您的html和数据。

如何实施您的计划

您需要/可能想要使用两个不同的脚本来获取动态ui。 (您可以使用相同的文件,但事情可能会变得混乱,最好分割任务)

1。前端:

如前所述,您应该以有意义的顺序构造代码。您可以看到我首先设置数据库连接,然后执行查询并已获取结果。这样我在开始输出其他内容之前就已经拥有了所有需要的数据(如果出现问题,因为我注意到数据无效/我还是可以重定向到另一个页面,因为没有发送标题)

要开始输出,我在您的脚本中添加了一些基本的HTML结构,不知道您是否已经拥有它,至少它不在您的代码段中。

所以我添加了标题和正文,标题中是javascript代码,它将执行对后端的请求并接收相应的响应。

  

注意:

     

我对vanilla javascript并不熟悉,所以我只是跟着一个   教程http://www.w3schools.com/ajax/ajax_php.asp

     

我认为你应该查看jQuery,如果你还没有,它会让事情变得非常简单。

除此之外我减少了一些噪音并使用了其他代码格式,基本上我不想使用echo输出我的HTML,因为有些IDE在完成时无法进行语法高亮。

我还添加了一个<p></p>,如果后端出现问题,可以向用户显示错误消息。

<?php
$servername = 'xxxxxxx';
$username = 'xxxxxx';
$password = 'xxxxxx';

try {
    $conn = new PDO("mysql:host=$servername;dbname=vnet", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    trigger_error("Connection failed: " . $e->getMessage());
}
$selectPlans = "SELECT id, planname, price FROM plan";
$rows = $conn->query($selectPlans)->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript">
            function getPrice(id){
                var xmlhttp = new XMLHttpRequest();
                xmlhttp.onreadystatechange = function() {
                    if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
                        var jsonObj = JSON.parse(xmlhttp.responseText);
                        if(jsonObj.success === true){
                            document.getElementById("price").value = jsonObj.price;
                        }else{
                            document.getElementById("price").innerHTML = jsonObj.message;
                        }
                    }
                };
                xmlhttp.open("GET", "ajax.php?id=" + id, true);
                xmlhttp.send();
            }
        </script>
    </head>
<body>
    <select name="planname" id="plannameSelect" onchange="getPrice(this.value)">
    <?php foreach ($rows as $row): ?>
        <option value="<?= $row['id'] ?>"><?= $row['planname'] ?></option>
    <?php endforeach; ?>
    </select>
    <input type="text" name="price[]" value="" id="price" disabled="disabled">
    <p id="error"></p>
</body>

2。后端:(在本例中称为ajax.php)

一段简单的代码,没什么特别的。

第一步:验证输入。在这种情况下,我只是检查$_GET - 数组中是否有id。我在一个数组中使用了json_encode(),我告诉前端操作是否成功。失败的第一种情况是如果没有身份证。

然后连接到数据库,询问错误,如果是,请立即通过echo数组将它们返回给用户(使用json_encoded)。

准备语句以选择id的价格(我在这里跳过了错误检查,你可能想要添加它)。然后执行它。

检查是否成功 - &gt;返回json_encoded数组作为成功和价格,或再次设置成功false并返回带有错误消息的数组。

<?php
$servername = 'xxxxxxx';
$username = 'xxxxxx';
$password = 'xxxxxx';

if(!isset($_GET['id'])){
    echo json_encode(array('success' => false, 'price' => '', 'message' => 'no id given'));
    exit;
}

try {
    $conn = new PDO("mysql:host=$servername;dbname=vnet", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    trigger_error("Connection failed: " . $e->getMessage());
    echo json_encode(array('success' => false, 'price' => '', 'message' => 'shit happened' . $e->getMessage()));
    exit;
}

$stmt = $conn->prepare("SELECT price FROM plan WHERE id = ?");
$stmt->execute(array($_GET['id']));
$result = $stmt->fetch(PDO::FETCH_ASSOC);

if($result === false){
    trigger_error('Query failed: ' . $conn->errorInfo());
    echo json_encode(array('success' => false, 'price' => '', 'message' => 'shit happened'));
    exit;
} else {
    echo json_encode(array('success' => true, 'price' => $result['price'], 'message' => ''));
    exit;
}