sql >> Database teknologi >  >> RDS >> Mysql

Ønsker at hente data fra databasen baseret på valg af rulleliste ved hjælp af php

$sql = mysql_query("select price from plan where planname =".$_REQUEST['planname']);

Du søger i kolonnen plannavn, men ved at definere <option> er som

echo "<option value=$row[id]>$row[planname]</option>";

Du sender id'et som værdi.

Så din forespørgsel skal være:

$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']));

Læs også de andre kommentarer. Du blander mysql_* api og PDO, du bør kun bruge PDO. Hvorfor skulle jeg ikke bruge mysql_* funktioner i PHP? Og se dette, når du er i gang: Hvordan kan jeg forhindre SQL-injektion i PHP?

Strukturen af ​​din kode vil gøre vedligeholdelsen virkelig besværlig, du bør først gøre alt det logiske arbejde, samle alle data og derefter vise din html og dataene i næste trin.

Sådan implementerer du din plan

Du skal/måske vil bruge to forskellige scripts for at få dit dynamiske brugerflade. (Du kan bruge den samme fil, men tingene kan blive rodet, og det er bedre at opdele opgaver)

1. Frontenden:

Som tidligere sagt, bør du strukturere kode i en meningsfuld rækkefølge. Du kan se, at jeg først sætter databaseforbindelsen op, derefter foretager forespørgslen og allerede henter resultatet. På denne måde har jeg allerede alle de nødvendige data, før jeg begynder at udlæse andre ting (hvis noget går galt, som i, bemærker jeg, at der er noget ugyldigt med dataene/hvad jeg stadig kunne omdirigere til en anden side, da der ikke er sendt en header) .

For at starte outputtet har jeg tilføjet en grundlæggende HTML-struktur til dit script, ved ikke om du allerede havde det, i det mindste er det ikke i dit uddrag.

Så jeg tilføjede header og body, i headeren er javascript-koden, som vil udføre anmodningen til backend og modtage svaret for at handle i overensstemmelse hermed.

Bortset fra det reducerede jeg noget støj og brugte anden kodeformatering end dig, dybest set kan jeg ikke lide at bruge ekko til at udlæse min HTML, da nogle IDE'er ikke er i stand til at fremhæve syntaks, når det er gjort.

Jeg tilføjede også en <p></p> hvor fejlmeddelelsen kan vises til brugeren, hvis noget i backend går galt.

<?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:(i dette tilfælde kaldet ajax.php)

Et simpelt stykke kode, intet særligt at gøre.

Første trin:validering af input. I dette tilfælde tjekker jeg blot, om der er et id i $_GET - Array. Jeg brugte json_encode() på et array, hvor jeg fortæller frontend, om operationen var vellykket eller ej. Det første tilfælde af fejl ville være, hvis der ikke var noget id.

Opret derefter forbindelse til databasen, bed om fejl og returner dem i så fald straks til brugeren (ved at bruge echo ), igen via json_encoded array.

Forbered erklæringen til valg af prisen på id'et (jeg sprunget over fejltjekket her, du vil måske tilføje det). Udfør det derefter.

Tjek, om det var vellykket -> returner det json_encoded-array som succes og med prisen, eller indstil succes false igen og returner arrayet med en fejlmeddelelse.

<?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. Hvordan ændrer jeg SQL Server 2005 til at skelne mellem store og små bogstaver?

  2. SQL Server Error 206:Operand type sammenstød

  3. Hvad er formålet med at bruge mysql_secure_installation?

  4. Indekskolonnestørrelsen er for stor. Den maksimale kolonnestørrelse er 767 bytes. - For INT datatype?