$sql = mysql_query("select price from plan where planname =".$_REQUEST['planname']);
Bạn đang tìm kiếm trong tên kế hoạch cột, nhưng bằng cách xác định <option>
là
echo "<option value=$row[id]>$row[planname]</option>";
Bạn đang gửi id dưới dạng giá trị.
Vì vậy, truy vấn của bạn phải là:
$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']));
Cũng đọc các bình luận khác. Bạn đang kết hợp mysql_ * api và PDO, bạn chỉ nên sử dụng PDO. Tại sao tôi không nên sử dụng các hàm mysql_ * trong PHP? Và xem điều này khi bạn ở đó: Làm cách nào để ngăn chặn việc đưa vào SQL trong PHP?
Cấu trúc mã của bạn sẽ khiến việc bảo trì thực sự trở nên rắc rối, trước tiên bạn nên thực hiện tất cả các công việc logic, thu thập tất cả dữ liệu và sau đó hiển thị html của bạn và dữ liệu trong bước tiếp theo.
Cách thực hiện kế hoạch của bạn
Bạn cần / có thể muốn sử dụng hai tập lệnh khác nhau, để có được ui động của mình. (Bạn có thể sử dụng cùng một tệp nhưng mọi thứ có thể lộn xộn và tốt hơn là nên chia nhỏ các nhiệm vụ)
1. Giao diện người dùng:
Như đã nói trước đây, bạn nên cấu trúc mã theo một thứ tự có ý nghĩa. Bạn có thể thấy trước tiên tôi đang thiết lập kết nối cơ sở dữ liệu, sau đó thực hiện truy vấn và đã tìm nạp kết quả. Bằng cách này, tôi đã có tất cả dữ liệu cần thiết trước khi bắt đầu xuất những thứ khác (nếu có vấn đề như trong tôi nhận thấy có điều gì đó không hợp lệ với dữ liệu / bất cứ điều gì tôi vẫn có thể chuyển hướng đến trang khác vì chưa có tiêu đề được gửi) .
Để bắt đầu đầu ra, tôi đã thêm một số cấu trúc HTML cơ bản vào tập lệnh của bạn, không biết bạn đã có nó chưa, ít nhất nó không có trong đoạn mã của bạn.
Vì vậy, tôi đã thêm tiêu đề và nội dung, trong tiêu đề là mã javascript sẽ thực thi yêu cầu tới phần phụ trợ và nhận phản hồi để hành động tương ứng.
Ngoài ra, tôi đã giảm một số nhiễu và sử dụng định dạng mã khác với bạn, về cơ bản tôi không thích sử dụng echo để xuất HTML của mình vì một số IDE không thể làm nổi bật cú pháp khi làm như vậy.
Tôi cũng đã thêm một <p></p>
trong đó thông báo lỗi có thể được hiển thị cho người dùng, nếu có gì đó trong phần phụ trợ gặp sự cố.
<?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. Phần phụ trợ:(trong trường hợp này được gọi là ajax.php)
Một đoạn mã đơn giản, không có gì đặc biệt để làm.
Bước đầu tiên:xác thực đầu vào. Trong trường hợp này, tôi chỉ cần kiểm tra xem có id trong $_GET
không -Mảng. Tôi đã sử dụng json_encode()
trên một mảng trong đó tôi cho giao diện người dùng biết liệu hoạt động có thành công hay không. Trường hợp thất bại đầu tiên sẽ là nếu không có id.
Sau đó kết nối với cơ sở dữ liệu, yêu cầu lỗi và nếu có thì trả lại ngay cho người dùng (bằng cách sử dụng echo
), một lần nữa qua json_encoded
mảng.
Chuẩn bị báo cáo để chọn giá của id (Tôi đã bỏ qua kiểm tra lỗi ở đây, bạn có thể muốn thêm nó). Sau đó, thực thi nó.
Kiểm tra xem nó có thành công hay không -> trả về mảng json_encoded là thành công và kèm theo giá, hoặc đặt lại thành công là false và trả về mảng có thông báo lỗi.
<?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;
}