$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