sql >> Databasteknik >  >> RDS >> Mysql

Vill du hämta data från databasen baserat på val av rullgardinslista med php

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

Du söker i kolumnen plannamn, men genom att definiera <option> är som

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

Du skickar id:t som värde.

Så din fråga bör vara:

$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 även de andra kommentarerna. Du blandar mysql_* api och PDO, du bör bara använda PDO. Varför skulle jag inte använda mysql_*-funktioner i PHP? Och se detta när du är igång: Hur kan jag förhindra SQL-injektion i PHP?

Strukturen på din kod kommer att göra underhållet riktigt besvärligt, du bör först göra allt det logiska arbetet, samla all data och sedan visa din HTML och data i nästa steg.

Hur du implementerar din plan

Du behöver / kanske vill använda två olika skript för att få ditt dynamiska användargränssnitt. (Du kan använda samma fil men det kan bli rörigt och det är bättre att dela upp uppgifter)

1. Frontend:

Som tidigare sagt bör du strukturera koden i en meningsfull ordning. Du kan se att jag först ställer in databasanslutningen, sedan gör frågan och redan hämtar resultatet. På så sätt har jag redan all data som behövs innan jag börjar mata ut andra saker (om något går fel som i märker jag att det är något ogiltigt med data/vad jag fortfarande kan omdirigera till en annan sida eftersom det inte har skickats en header) .

För att starta utdata lade jag till lite grundläggande HTML-struktur i ditt skript, jag vet inte om du redan hade det, åtminstone finns det inte i ditt utdrag.

Så jag lade till header och body, i headern finns javascript-koden som kommer att exekvera begäran till backend och få svaret för att agera därefter.

I övrigt minskade jag en del brus och använde annan kodformatering än du, i princip gillar jag inte att använda eko för att mata ut min HTML eftersom vissa IDE:er inte kan göra syntaxmarkering när det är gjort.

Jag har också lagt till en <p></p> där felmeddelandet kan visas för användaren, om något i backend går fel.

<?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 det här fallet kallat ajax.php)

En enkel kod, inget speciellt att göra.

Första steget:validera inmatningen. I det här fallet kontrollerar jag helt enkelt om det finns ett id i $_GET -Array. Jag använde json_encode() på en array där jag berättar för frontend om operationen var framgångsrik eller inte. Det första fallet av misslyckande skulle vara om det inte fanns något id.

Anslut sedan till databasen, fråga efter fel och i så fall returnera dem omedelbart till användaren (genom att använda echo ), igen via json_encoded array.

Förbered uttalandet för val av pris på id (jag hoppade över felkontrollen här, du kanske vill lägga till den). Kör sedan det.

Kontrollera om det var framgångsrikt -> returnera arrayen json_encoded som framgångsrik och med priset, eller ställ in success false igen och returnera arrayen med ett felmeddelande.

<?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. Använder HHVM med WordPress

  2. Laravel :Odefinierat index:drivrutin

  3. Kan jag räkna sessioner för att bestämma antalet personer online?

  4. Fylla i JFreechart TimeSeriesCollection från Mysql DB?