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

Vuoi recuperare i dati dal database in base alla selezione dell'elenco a discesa utilizzando php

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

Stai cercando nella colonna nome del piano, ma definendo il <option> è come

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

Stai inviando l'id come valore.

Quindi la tua domanda dovrebbe essere:

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

Leggi anche gli altri commenti. Stai mescolando mysql_* api e PDO, dovresti usare solo PDO. Perché non dovrei usare le funzioni mysql_* in PHP? E guardalo quando ci sei: Come posso prevenire l'SQL injection in PHP?

La struttura del tuo codice renderà la manutenzione davvero problematica, dovresti prima fare tutto il lavoro logico, raccogliere tutti i dati e quindi visualizzare il tuo html e i dati nel passaggio successivo.

Come implementare il tuo piano

Hai bisogno / potresti voler usare due script diversi per ottenere la tua interfaccia utente dinamica. (Potresti usare lo stesso file ma le cose potrebbero diventare disordinate ed è meglio dividere le attività)

1. Il front-end:

Come detto in precedenza, dovresti strutturare il codice in un ordine significativo. Puoi vedere che sto prima configurando la connessione al database, quindi eseguendo la query e già recuperando il risultato. In questo modo ho già tutti i dati necessari prima di iniziare a produrre altre cose (se qualcosa va storto come in noto che c'è qualcosa di non valido con i dati/qualunque cosa potrei ancora reindirizzare a un'altra pagina poiché non è stata inviata un'intestazione) .

Per iniziare l'output, ho aggiunto una struttura HTML di base al tuo script, non so se lo avevi già, almeno non è nel tuo snippet.

Quindi ho aggiunto intestazione e corpo, nell'intestazione c'è il codice javascript che eseguirà la richiesta al back-end e riceverà la risposta per agire di conseguenza.

A parte questo, ho ridotto un po' di rumore e ho usato una formattazione del codice diversa da te, in pratica non mi piace usare l'eco per generare il mio HTML poiché alcuni IDE non sono in grado di eseguire l'evidenziazione della sintassi una volta fatto.

Ho anche aggiunto un <p></p> in cui il messaggio di errore può essere visualizzato all'utente, se qualcosa nel backend va storto.

<?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. Il backend:(in questo caso chiamato ajax.php)

Un semplice pezzo di codice, niente di speciale da fare.

Primo passo:convalidare l'input. In questo caso, controllo semplicemente se c'è un id nel $_GET -Vettore. Ho usato json_encode() su un array in cui dico al frontend se l'operazione è andata a buon fine o meno. Il primo caso di fallimento sarebbe se non ci fosse id.

Quindi collegarsi al database, chiedere gli errori e in tal caso restituirli immediatamente all'utente (utilizzando echo ), sempre tramite json_encoded Vettore.

Prepara la dichiarazione per selezionare il prezzo dell'ID (ho saltato il controllo degli errori qui, potresti volerlo aggiungere). Quindi eseguilo.

Controlla se ha avuto esito positivo -> restituisce l'array json_encoded come successo e con il prezzo, oppure imposta nuovamente success false e restituisce l'array con un messaggio di errore.

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