$sql = mysql_query("select price from plan where planname =".$_REQUEST['planname']);
Wyszukujesz w nazwie planu kolumn, ale definiując <option>
jest jak
echo "<option value=$row[id]>$row[planname]</option>";
Wysyłasz identyfikator jako wartość.
Twoje zapytanie powinno brzmieć:
$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']));
Przeczytaj także inne komentarze. Mieszasz mysql_* api i PDO, powinieneś używać tylko PDO. Dlaczego nie powinienem używać funkcji mysql_* w PHP? I zobacz to, gdy jesteś przy tym: Jak mogę zapobiec wstrzykiwaniu SQL w PHP?
Struktura twojego kodu sprawi, że utrzymanie go będzie naprawdę kłopotliwe, powinieneś najpierw wykonać całą pracę logiczną, zebrać wszystkie dane, a następnie wyświetlić swój html i dane w następnym kroku.
Jak wdrożyć swój plan
Potrzebujesz / możesz użyć dwóch różnych skryptów, aby uzyskać dynamiczny interfejs użytkownika. (Możesz użyć tego samego pliku, ale może być bałagan i lepiej jest dzielić zadania)
1. Interfejs:
Jak wcześniej wspomniano, powinieneś uporządkować kod w zrozumiałej kolejności. Widać, że najpierw konfiguruję połączenie z bazą danych, potem wykonuję zapytania i już pobieram wynik. W ten sposób mam już wszystkie potrzebne dane, zanim zacznę wyprowadzać inne rzeczy (jeśli coś pójdzie nie tak, jak zauważyłem, coś jest niepoprawne z danymi / cokolwiek, co mogę przekierować na inną stronę, ponieważ nie został wysłany nagłówek) .
Aby rozpocząć wyjście, dodałem do twojego skryptu podstawową strukturę HTML, nie wiem, czy już ją masz, przynajmniej nie ma jej we fragmencie.
Więc dodałem nagłówek i treść, w nagłówku jest kod javascript, który wykona żądanie do zaplecza i otrzyma odpowiedź, aby odpowiednio działać.
Poza tym zmniejszyłem trochę szumu i użyłem innego formatowania kodu niż ty, w zasadzie nie lubię używać echa do wyprowadzania kodu HTML, ponieważ niektóre IDE nie są w stanie podświetlać składni, gdy to zrobią.
Dodałem również <p></p>
w którym komunikat o błędzie może zostać wyświetlony użytkownikowi, jeśli coś w backendzie pójdzie nie tak.
<?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. Backend:(w tym przypadku nazwany ajax.php)
Prosty fragment kodu, nic specjalnego do zrobienia.
Pierwszy krok:walidacja danych wejściowych. W takim przypadku po prostu sprawdzam, czy w $_GET
znajduje się identyfikator -Szyk. Użyłem json_encode()
na tablicy, w której mówię frontendowi, czy operacja się powiodła, czy nie. Pierwszym przypadkiem niepowodzenia byłby brak identyfikatora.
Następnie połącz się z bazą danych, zapytaj o błędy, a jeśli tak, zwróć je natychmiast użytkownikowi (za pomocą echo
), ponownie przez json_encoded
szyk.
Przygotuj zestawienie do wyboru ceny identyfikatora (pominąłem tutaj sprawdzanie błędów, możesz chcieć je dodać). Następnie wykonaj go.
Sprawdź, czy się udało -> zwróć tablicę json_encoded jako sukces i z ceną lub ustaw ponownie success false i zwróć tablicę z komunikatem o błędzie.
<?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;
}