sql >> Databáze >  >> RDS >> Mysql

Chcete načíst data z databáze na základě výběru rozevíracího seznamu pomocí php

$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;
}



  1. špatný záznam Chyba MAC SSL mezi Java a PortgreSQL

  2. Proč SQLAlchemy spustit Aktualizace nefunguje

  3. Jak zrušit tabulky a sloupce pomocí SQL

  4. Připojte se ke vzdálené databázi MySQL pomocí VB.NET 2010