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