$sql = mysql_query("select price from plan where planname =".$_REQUEST['planname']);
您正在寻找在列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代码,它将执行请求到后端并接收相应的响应。
注:
我并不真正熟悉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的价格(我跳过错误检查在这里,你可能想要添加它)。然后执行它。
检查它是否成功 - >将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;
}
你不能混用MySQL APis。所以这个'if(isset($ _ REQUEST ['planname'])){...}'永远不会发生。 –
这是什么'echo“
因为,串联,'mysql_query'和基本的HTML,很酷。 – user5173426