sql >> Base de Datos >  >> RDS >> Mysql

Quiere obtener datos de la base de datos según la selección de la lista desplegable usando php

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

Está buscando en la columna planname, pero definiendo el <option> es como

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

Estás enviando la identificación como valor.

Entonces su consulta debería ser:

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

Lea también los otros comentarios. Está mezclando mysql_* api y PDO, solo debe usar PDO. ¿Por qué no debería usar funciones mysql_* en PHP? Y vea esto cuando esté en ello: ¿Cómo puedo evitar la inyección de SQL en PHP?

La estructura de su código hará que el mantenimiento sea realmente problemático, primero debe hacer todo el trabajo lógico, recopilar todos los datos y luego mostrar su html y los datos en el siguiente paso.

Cómo implementar su plan

Necesita / puede querer usar dos scripts diferentes para obtener su interfaz de usuario dinámica. (Podría usar el mismo archivo pero las cosas podrían complicarse y es mejor dividir las tareas)

1. La interfaz:

Como se dijo anteriormente, debe estructurar el código en un orden significativo. Puede ver que primero estoy configurando la conexión de la base de datos, luego haciendo la consulta y ya obteniendo el resultado. De esta manera, ya tengo todos los datos necesarios antes de comenzar a generar otras cosas (si algo sale mal, noto que hay algo no válido con los datos/lo que sea que aún podría redirigir a otra página ya que no se ha enviado un encabezado) .

Para comenzar la salida, agregué una estructura HTML básica a su secuencia de comandos, no sé si ya la tenía, al menos no está en su fragmento.

Así que agregué encabezado y cuerpo, en el encabezado está el código javascript que ejecutará la solicitud al backend y recibirá la respuesta para actuar en consecuencia.

Aparte de eso, reduje algo de ruido y usé otro formato de código que no sea el tuyo, básicamente no me gusta usar echo para generar mi HTML ya que algunos IDE no pueden resaltar la sintaxis cuando lo hacen.

También agregué un <p></p> en el que se puede mostrar el mensaje de error al usuario, si algo en el backend sale mal.

<?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. El backend:(en este caso llamado ajax.php)

Una simple pieza de código, nada especial que hacer.

Primer paso:validar la entrada. En este caso, simplemente verifico si hay una identificación en el $_GET -Formación. Usé json_encode() en una matriz en la que le digo a la interfaz si la operación fue exitosa o no. El primer caso de falla sería si no hubiera identificación.

Luego conéctese a la base de datos, solicite errores y, de ser así, devuélvalos inmediatamente al usuario (usando echo ), nuevamente a través de json_encoded formación.

Prepare la declaración para seleccionar el precio de la identificación (me salté la verificación de errores aquí, es posible que desee agregarla). Luego ejecútelo.

Verifique si fue exitoso -> devuelva la matriz json_encoded como exitosa y con el precio, o configure el éxito como falso nuevamente y devuelva la matriz con un mensaje de error.

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