Mysql
 sql >> Base de données >  >> RDS >> Mysql

Vous souhaitez récupérer les données de la base de données en fonction de la sélection de la liste déroulante à l'aide de php

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

Vous cherchez dans la colonne planname, mais en définissant le <option> est comme

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

Vous envoyez l'identifiant en tant que valeur.

Votre requête devrait donc être :

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

Lisez aussi les autres commentaires. Vous mélangez l'api mysql_* et PDO, vous ne devez utiliser que PDO. Pourquoi ne devrais-je pas utiliser les fonctions mysql_* en PHP ? Et voyez ceci quand vous y êtes : Comment puis-je empêcher l'injection SQL dans PHP ?

La structure de votre code rendra la maintenance vraiment gênante, vous devez d'abord faire tout le travail logique, rassembler toutes les données, puis afficher votre code HTML et les données à l'étape suivante.

Comment mettre en œuvre votre plan

Vous avez besoin/voulez peut-être utiliser deux scripts différents pour obtenir votre interface utilisateur dynamique. (Vous pouvez utiliser le même fichier, mais les choses peuvent devenir compliquées et il est préférable de diviser les tâches)

1. L'interface :

Comme indiqué précédemment, vous devez structurer le code dans un ordre significatif. Vous pouvez voir que je configure d'abord la connexion à la base de données, puis que je fais la requête et que je récupère déjà le résultat. De cette façon, j'ai déjà toutes les données nécessaires avant de commencer à produire d'autres éléments (si quelque chose ne va pas, car je remarque qu'il y a quelque chose d'invalide avec les données/tout ce que je pourrais encore rediriger vers une autre page car il n'y a pas eu d'en-tête envoyé) .

Pour démarrer la sortie, j'ai ajouté une structure HTML de base à votre script, je ne sais pas si vous l'aviez déjà, du moins ce n'est pas dans votre extrait.

J'ai donc ajouté un en-tête et un corps, dans l'en-tête se trouve le code javascript qui exécutera la requête au backend et recevra la réponse pour agir en conséquence.

En dehors de cela, j'ai réduit le bruit et utilisé un formatage de code autre que le vôtre. En gros, je n'aime pas utiliser echo pour générer mon code HTML, car certains IDE ne sont pas capables de mettre en évidence la syntaxe lorsqu'ils le font.

J'ai également ajouté un <p></p> dans lequel le message d'erreur peut être affiché à l'utilisateur, si quelque chose ne va pas dans le backend.

<?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. Le backend :(dans ce cas appelé ajax.php)

Un simple morceau de code, rien de spécial à faire.

Première étape :valider l'entrée. Dans ce cas, je vérifie simplement s'il y a un identifiant dans le $_GET -Déployer. J'ai utilisé json_encode() sur un tableau dans lequel je dis à l'interface si l'opération a réussi ou non. Le premier cas d'échec serait s'il n'y avait pas d'identifiant.

Connectez-vous ensuite à la base de données, demandez les erreurs et si c'est le cas, renvoyez-les immédiatement à l'utilisateur (en utilisant echo ), toujours via le json_encoded déployer.

Préparez la déclaration pour sélectionner le prix de l'identifiant (j'ai ignoré la vérification des erreurs ici, vous voudrez peut-être l'ajouter). Puis exécutez-le.

Vérifiez s'il a réussi -> renvoyez le tableau json_encoded comme succès et avec le prix, ou définissez à nouveau success false et renvoyez le tableau avec un message d'erreur.

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