$sql = mysql_query("select price from plan where planname =".$_REQUEST['planname']);
Hledáte ve sloupci planname, ale definováním <option>
je jako
echo "<option value=$row[id]>$row[planname]</option>";
Odesíláte id jako hodnotu.
Váš dotaz by tedy měl znít:
$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']));
Přečtěte si také ostatní komentáře. Mixujete mysql_* api a PDO, měli byste používat pouze PDO. Proč bych neměl používat funkce mysql_* v PHP? A podívejte se na to, až budete u toho: Jak mohu zabránit vkládání SQL v PHP?
Struktura vašeho kódu způsobí, že údržba bude opravdu problematická, měli byste nejprve provést veškerou logickou práci, shromáždit všechna data a poté zobrazit svůj html a data v dalším kroku.
Jak implementovat svůj plán
Potřebujete / možná budete chtít použít dva různé skripty, abyste získali své dynamické uživatelské rozhraní. (Mohli byste použít stejný soubor, ale věci by se mohly zamotat a je lepší úkoly rozdělit)
1. Frontend:
Jak již bylo řečeno, kód byste měli strukturovat ve smysluplném pořadí. Můžete vidět, že nejprve nastavuji připojení k databázi, pak provádím dotaz a již načítám výsledek. Tímto způsobem již mám všechna potřebná data, než začnu vydávat další věci (pokud se něco pokazí jako v, všiml jsem si, že je s daty něco neplatné / cokoli, co bych mohl stále přesměrovat na jinou stránku, protože nebyla odeslána hlavička) .
Pro spuštění výstupu jsem do vašeho skriptu přidal nějakou základní HTML strukturu, nevím, jestli jste ji už měli, alespoň to není ve vašem úryvku.
Takže jsem přidal záhlaví a tělo, v záhlaví je kód javascriptu, který provede požadavek na backend a obdrží odpověď, aby podle toho jednal.
Kromě toho jsem snížil nějaký šum a použil jsem jiné formátování kódu než vy, v zásadě nerad používám echo pro výstup mého HTML, protože některá IDE nejsou schopna zvýrazňovat syntaxi, když to uděláte.
Také jsem přidal <p></p>
ve kterém se může uživateli zobrazit chybová zpráva, pokud se něco v backendu pokazí.
<?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:(v tomto případě s názvem ajax.php)
Jednoduchý kus kódu, nic zvláštního.
První krok:ověření vstupu. V tomto případě jednoduše zkontroluji, zda je v $_GET
id -Pole. Použil jsem json_encode()
na poli, ve kterém řeknu frontendu, zda byla operace úspěšná nebo ne. Prvním případem selhání by bylo, kdyby neexistovalo žádné ID.
Poté se připojte k databázi, zeptejte se na chyby a pokud ano, okamžitě je vraťte uživateli (pomocí echo
), opět prostřednictvím json_encoded
pole.
Připravte si výpis pro výběr ceny id (tu jsem přeskočil kontrolu chyb, možná budete chtít přidat). Poté jej spusťte.
Zkontrolujte, zda to bylo úspěšné -> vraťte pole json_encoded jako úspěšné a s cenou, nebo znovu nastavte success false a vraťte pole s chybovou zprávou.
<?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;
}