$sql = mysql_query("select price from plan where planname =".$_REQUEST['planname']);
Вие търсите в колоната име на план, но като дефинирате <option>
е като
echo "<option value=$row[id]>$row[planname]</option>";
Изпращате идентификатора като стойност.
Така че вашата заявка трябва да бъде:
$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. Защо не трябва използвате mysql_* функции в PHP? И вижте това, когато сте там: Как мога да предотвратя SQL инжектиране в PHP?
Структурата на вашия код ще направи поддръжката наистина неприятна, първо трябва да извършите цялата логическа работа, да съберете всички данни и след това да покажете своя html и данните в следващата стъпка.
Как да приложите плана си
Трябва/може да искате да използвате два различни скрипта, за да получите своя динамичен потребителски интерфейс. (Можете да използвате един и същ файл, но нещата може да се объркат и е по-добре да разделите задачите)
1. Предният интерфейс:
Както казахме по-рано, трябва да структурирате кода в смислен ред. Можете да видите, че първо настройвам връзката с базата данни, след това правя запитване и вече извличам резултата. По този начин вече имам всички необходими данни, преди да започна да извеждам други неща (ако нещо се обърка, тъй като забелязвам, че има нещо невалидно с данните/каквото и да е, което все още мога да пренасоча към друга страница, тъй като не е изпратен хедър) .
За да започна изхода, добавих някаква основна HTML структура към вашия скрипт, не знам дали вече сте я имали, поне я няма във вашия фрагмент.
Така че добавих заглавка и тяло, в заглавката е javascript кодът, който ще изпълни заявката към бекенда и ще получи отговора, за да действа съответно.
Освен това намалих малко шума и използвах друго форматиране на кода от вашето, по принцип не обичам да използвам ехо за извеждане на моя 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
-Масив. Използвах json_encode()
върху масив, в който казвам на интерфейса дали операцията е била успешна или не. Първият случай на неуспех би бил, ако няма идентификатор.
След това се свържете с базата данни, попитайте за грешки и ако е така, незабавно ги върнете на потребителя (с помощта на echo
), отново чрез json_encoded
масив.
Подгответе изявлението за избор на цената на идентификатора (пропуснах проверката за грешки тук, може да искате да го добавите). След това го изпълнете.
Проверете дали е било успешно -> върнете 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;
}