想要使用 php 根据下拉列表选择从数据库中获取数据
Want to fetch data from database based on dropdown list selection using php
我有一个 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" />';
?>
我在下拉列表中找到了列表,但无法根据计划名称获取价格dynamically.can有人帮我解决这个问题吗?
$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? And see this when you are at it: How can I prevent SQL injection in PHP?
你的代码结构会让维护很麻烦,你应该先做所有的逻辑工作,收集所有的数据,然后在下一步显示你的html和数据。
如何实施你的计划
您需要/可能想要使用两个不同的脚本来获取动态 ui。 (您可以使用相同的文件,但事情可能会变得混乱,最好拆分任务)
1.前端:
如前所述,您应该按照有意义的顺序构建代码。您可以看到我首先设置数据库连接,然后进行查询并获取结果。这样我在开始输出其他东西之前就已经拥有了所有需要的数据(如果出现问题,我注意到 data/whatever 有一些无效的东西我仍然可以重定向到另一个页面,因为没有 header已发送)。
为了开始输出,我在你的脚本中添加了一些基本的 HTML 结构,不知道你是否已经有了,至少它不在你的代码片段中。
所以我添加了header和body,在header中是javascript代码,它将向后端执行请求并接收响应以采取相应的行动.
Note:
I am not really familiar with vanilla javascript, so I just followed a
tutorial http://www.w3schools.com/ajax/ajax_php.asp
I think you should check out jQuery if you haven't yet, it makes things really really easy.
除此之外,我减少了一些噪音并使用了与您不同的代码格式,基本上我不喜欢使用 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
-Array 中是否有 id。我在一个数组上使用了 json_encode()
,我在其中告诉前端操作是否成功。第一种失败的情况是没有id。
然后连接到数据库,询问错误,如果是,则立即 return 将错误再次通过 json_encoded
数组发送给用户(通过使用 echo
)。
准备选择id的价格的语句(这里我跳过了错误检查,你可能需要添加它)。然后执行。
检查是否成功 -> return json_encoded 数组为成功并带有价格,或者再次将成功设置为 false 并 return 带有错误消息的数组。
<?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;
}
我有一个 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" />';
?>
我在下拉列表中找到了列表,但无法根据计划名称获取价格dynamically.can有人帮我解决这个问题吗?
$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? And see this when you are at it: How can I prevent SQL injection in PHP?
你的代码结构会让维护很麻烦,你应该先做所有的逻辑工作,收集所有的数据,然后在下一步显示你的html和数据。
如何实施你的计划
您需要/可能想要使用两个不同的脚本来获取动态 ui。 (您可以使用相同的文件,但事情可能会变得混乱,最好拆分任务)
1.前端:
如前所述,您应该按照有意义的顺序构建代码。您可以看到我首先设置数据库连接,然后进行查询并获取结果。这样我在开始输出其他东西之前就已经拥有了所有需要的数据(如果出现问题,我注意到 data/whatever 有一些无效的东西我仍然可以重定向到另一个页面,因为没有 header已发送)。
为了开始输出,我在你的脚本中添加了一些基本的 HTML 结构,不知道你是否已经有了,至少它不在你的代码片段中。
所以我添加了header和body,在header中是javascript代码,它将向后端执行请求并接收响应以采取相应的行动.
Note:
I am not really familiar with vanilla javascript, so I just followed a tutorial http://www.w3schools.com/ajax/ajax_php.asp
I think you should check out jQuery if you haven't yet, it makes things really really easy.
除此之外,我减少了一些噪音并使用了与您不同的代码格式,基本上我不喜欢使用 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
-Array 中是否有 id。我在一个数组上使用了 json_encode()
,我在其中告诉前端操作是否成功。第一种失败的情况是没有id。
然后连接到数据库,询问错误,如果是,则立即 return 将错误再次通过 json_encoded
数组发送给用户(通过使用 echo
)。
准备选择id的价格的语句(这里我跳过了错误检查,你可能需要添加它)。然后执行。
检查是否成功 -> return json_encoded 数组为成功并带有价格,或者再次将成功设置为 false 并 return 带有错误消息的数组。
<?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;
}