Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Möchten Sie Daten aus der Datenbank basierend auf der Dropdown-Listenauswahl mit PHP abrufen

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

Sie suchen in der Spalte planname, aber über die Definition von <option> ist wie

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

Sie senden die ID als Wert.

Ihre Abfrage sollte also lauten:

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

Lesen Sie auch die anderen Kommentare. Sie mischen mysql_* api und PDO, Sie sollten nur PDO verwenden. Warum sollte ich nicht mysql_*-Funktionen in PHP verwenden? Und sehen Sie sich das an, wenn Sie schon dabei sind: Wie kann ich SQL-Injection in PHP verhindern?

Die Struktur Ihres Codes macht die Wartung wirklich mühsam, Sie sollten zuerst die ganze logische Arbeit erledigen, alle Daten sammeln und dann im nächsten Schritt Ihr HTML und die Daten anzeigen.

So setzen Sie Ihren Plan um

Sie benötigen / möchten möglicherweise zwei verschiedene Skripte verwenden, um Ihre dynamische Benutzeroberfläche zu erhalten. (Sie könnten dieselbe Datei verwenden, aber die Dinge könnten chaotisch werden und es ist besser, Aufgaben aufzuteilen)

1. Das Frontend:

Wie bereits gesagt, sollten Sie den Code in einer sinnvollen Reihenfolge strukturieren. Sie können sehen, dass ich zuerst die Datenbankverbindung einrichte, dann die Abfrage durchführe und bereits das Ergebnis abrufe. Auf diese Weise habe ich bereits alle benötigten Daten, bevor ich anfange, andere Dinge auszugeben (wenn etwas schief geht, wie ich merke, dass etwas mit den Daten ungültig ist / was auch immer ich noch auf eine andere Seite umleiten könnte, da kein Header gesendet wurde) .

Um die Ausgabe zu starten, habe ich Ihrem Skript eine grundlegende HTML-Struktur hinzugefügt, ich weiß nicht, ob Sie sie bereits hatten, zumindest ist sie nicht in Ihrem Snippet enthalten.

Also habe ich Header und Body hinzugefügt, im Header befindet sich der Javascript-Code, der die Anfrage an das Backend ausführt und die Antwort erhält, um entsprechend zu handeln.

Abgesehen davon habe ich etwas Rauschen reduziert und eine andere Codeformatierung als Sie verwendet. Im Grunde mag ich Echo nicht, um meinen HTML-Code auszugeben, da einige IDEs nicht in der Lage sind, Syntax hervorzuheben, wenn dies getan wird.

Ich habe auch einen <p></p> hinzugefügt in dem die Fehlermeldung dem Benutzer angezeigt werden kann, wenn etwas im Backend schief geht.

<?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. Das Backend:(in diesem Fall ajax.php genannt)

Ein einfaches Stück Code, nichts Besonderes zu tun.

Erster Schritt:Validierung der Eingabe. In diesem Fall überprüfe ich einfach, ob es eine ID im $_GET gibt -Array. Ich habe json_encode() verwendet auf einem Array, in dem ich dem Frontend mitteile, ob die Operation erfolgreich war oder nicht. Der erste Fehlerfall wäre, wenn es keine ID gäbe.

Verbinden Sie sich dann mit der Datenbank, fragen Sie nach Fehlern und geben Sie diese gegebenenfalls sofort an den Benutzer zurück (mithilfe von echo ), wieder über den json_encoded Reihe.

Bereiten Sie die Anweisung zur Auswahl des Preises der ID vor (ich habe die Fehlerprüfung hier übersprungen, Sie möchten sie vielleicht hinzufügen). Führen Sie es dann aus.

Überprüfen Sie, ob es erfolgreich war -> geben Sie das json_encoded-Array als Erfolg und mit dem Preis zurück, oder setzen Sie den Erfolg erneut auf falsch und geben Sie das Array mit einer Fehlermeldung zurück.

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