Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Deseja buscar dados do banco de dados com base na seleção da lista suspensa usando php

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

Você está pesquisando na coluna planname, mas definindo o <option> é como
echo "<option value=$row[id]>$row[planname]</option>";

Você está enviando o id como valor.

Portanto, sua consulta deve 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']));

Leia também os outros comentários. Você está misturando a api mysql_* e o PDO, você deve usar apenas o PDO. Por que eu não deveria usar funções mysql_* em PHP? E veja isso quando estiver nisso: Como posso evitar a injeção de SQL em PHP?

A estrutura do seu código tornará a manutenção realmente problemática, você deve primeiro fazer todo o trabalho lógico, reunir todos os dados e exibir seu html e os dados na próxima etapa.

Como implementar seu plano

Você precisa / pode querer usar dois scripts diferentes para obter sua interface do usuário dinâmica. (Você pode usar o mesmo arquivo, mas as coisas podem ficar confusas e é melhor dividir as tarefas)

1. A interface:

Como dito anteriormente, você deve estruturar o código em uma ordem significativa. Você pode ver que primeiro estou configurando a conexão com o banco de dados, depois fazendo a consulta e já buscando o resultado. Dessa forma, já tenho todos os dados necessários antes de começar a produzir outras coisas (se algo der errado, como noto que há algo inválido com os dados/o que quer que eu ainda possa redirecionar para outra página, pois não houve um cabeçalho enviado) .

Para iniciar a saída, adicionei alguma estrutura HTML básica ao seu script, não sei se você já tinha, pelo menos não está no seu snippet.

Então eu adicionei header e body, no header está o código javascript que irá executar a requisição para o backend e receber a resposta para agir de acordo.

Fora isso, reduzi um pouco de ruído e usei outra formatação de código diferente de você, basicamente não gosto de usar echo para gerar meu HTML, pois alguns IDEs não são capazes de fazer realce de sintaxe quando o fazem.

Também adicionei um <p></p> em que a mensagem de erro pode ser exibida ao usuário, se algo no backend der errado.
<?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. O backend:(neste caso chamado ajax.php)

Um simples pedaço de código, nada de especial para fazer.

Primeiro passo:validar a entrada. Neste caso, simplesmente verifico se existe um id no $_GET -Variedade. Eu usei json_encode() em uma matriz na qual eu digo ao frontend se a operação foi bem-sucedida ou não. O primeiro caso de falha seria se não houvesse id.

Em seguida, conecte-se ao banco de dados, pergunte por erros e, em caso afirmativo, devolva-os imediatamente ao usuário (usando echo ), novamente por meio do json_encoded variedade.

Prepare a declaração para selecionar o preço do id (eu ignorei a verificação de erros aqui, você pode querer adicioná-lo). Em seguida, execute-o.

Verifique se foi bem sucedido -> retorne o array json_encoded como sucesso e com o preço, ou defina success false novamente e retorne o array com uma mensagem de erro.
<?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;
}