$sql = mysql_query("select price from plan where planname =".$_REQUEST['planname']);
U zoekt in de kolom plannaam, maar door de <option>
. te definiëren is als
echo "<option value=$row[id]>$row[planname]</option>";
U verzendt de id als waarde.
Dus uw vraag zou moeten zijn:
$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']));
Lees ook de andere reacties. U mixt de mysql_* api en PDO, u mag alleen PDO gebruiken. Waarom zou ik dat niet doen mysql_*-functies gebruiken in PHP? En zie dit als je bezig bent: Hoe kan ik SQL-injectie in PHP voorkomen?
De structuur van uw code zal het onderhoud erg lastig maken, u moet eerst al het logische werk doen, alle gegevens verzamelen en vervolgens uw html en de gegevens weergeven in de volgende stap.
Hoe implementeer je je plan
Je hebt twee verschillende scripts nodig / wilt misschien gebruiken om je dynamische ui te krijgen. (Je zou hetzelfde bestand kunnen gebruiken, maar het kan rommelig worden en het is beter om taken te splitsen)
1. De frontend:
Zoals eerder gezegd, moet u code in een zinvolle volgorde structureren. U kunt zien dat ik eerst de databaseverbinding opzet, vervolgens de query uitvoer en het resultaat al ophaal. Op deze manier heb ik al alle gegevens die nodig zijn voordat ik andere dingen ga uitvoeren (als er iets misgaat zoals in Ik merk dat er iets ongeldig is met de gegevens / wat ik nog steeds zou kunnen omleiden naar een andere pagina omdat er geen header is verzonden) .
Om de uitvoer te starten, heb ik een basis HTML-structuur aan je script toegevoegd, ik weet niet of je het al had, het staat in ieder geval niet in je fragment.
Dus ik heb header en body toegevoegd, in de header is de javascript-code die het verzoek naar de backend zal uitvoeren en het antwoord zal ontvangen om dienovereenkomstig te handelen.
Afgezien daarvan heb ik wat ruis verminderd en andere code-opmaak gebruikt dan jij, eigenlijk hou ik er niet van om echo te gebruiken om mijn HTML uit te voeren, omdat sommige IDE's geen syntaxisaccentuering kunnen doen wanneer ze dit hebben gedaan.
Ik heb ook een <p></p>
. toegevoegd waarin de foutmelding aan de gebruiker kan worden getoond als er iets misgaat in de backend.
<?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. De backend:(in dit geval ajax.php genoemd)
Een simpel stukje code, niets bijzonders om te doen.
Eerste stap:de invoer valideren. In dit geval controleer ik gewoon of er een id in de $_GET
. staat -Array. Ik gebruikte json_encode()
op een array waarin ik de frontend vertel of de operatie succesvol was of niet. Het eerste geval van mislukking zou zijn als er geen id was.
Maak vervolgens verbinding met de database, vraag om fouten en stuur deze onmiddellijk terug naar de gebruiker (met behulp van echo
), opnieuw via de json_encoded
reeks.
Bereid de verklaring voor het selecteren van de prijs van de id voor (ik heb de foutcontrole hier overgeslagen, misschien wilt u deze toevoegen). Voer het dan uit.
Controleer of het succesvol was -> retourneer de json_encoded array als succes en met de prijs, of stel success opnieuw in op false en retourneer de array met een foutmelding.
<?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;
}