$sql = mysql_query("select price from plan where planname =".$_REQUEST['planname']);
列plannameを検索していますが、<option>
を定義しています。 として
echo "<option value=$row[id]>$row[planname]</option>";
IDを値として送信しています。
したがって、クエリは次のようになります。
$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']));
他のコメントも読んでください。 mysql_ * apiとPDOを混在させているので、PDOのみを使用する必要があります。 なぜ私はすべきではないのですかPHPでmysql_*関数を使用しますか? そして、あなたがそれにいるときにこれを見てください: PHPでSQLインジェクションを防ぐにはどうすればよいですか?
コードの構造により、メンテナンスが非常に面倒になります。最初にすべての論理的な作業を行い、すべてのデータを収集してから、次のステップでHTMLとデータを表示する必要があります。
計画を実装する方法
動的UIを取得するには、2つの異なるスクリプトを使用する必要があります。 (同じファイルを使用することもできますが、処理が煩雑になる可能性があるため、タスクを分割することをお勧めします)
1。フロントエンド:
前に述べたように、意味のある順序でコードを構造化する必要があります。最初にデータベース接続を設定し、次にクエリを実行して結果を既にフェッチしていることがわかります。このようにして、他のものを出力し始める前に、必要なすべてのデータをすでに持っています(データに何か無効なものがあることに気付いた場合など、ヘッダーが送信されていないために別のページにリダイレクトできるものは何でも) 。
出力を開始するために、スクリプトにいくつかの基本的なHTML構造を追加しました。既にあるかどうかはわかりませんが、少なくともスニペットには含まれていません。
そこで、ヘッダーと本文を追加しました。ヘッダーには、バックエンドへのリクエストを実行し、それに応じて動作する応答を受け取るjavascriptコードがあります。
それ以外は、ノイズを減らし、あなた以外のコードフォーマットを使用しました。基本的に、エコーを使用してHTMLを出力するのは好きではありません。これは、一部のIDEが構文の強調表示を実行できないためです。
<p></p>
も追加しました バックエンドで問題が発生した場合に、エラーメッセージをユーザーに表示できます。
<?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。バックエンド:(この場合はajax.phpと呼ばれます)
単純なコードで、特別なことは何もありません。
最初のステップ:入力を検証します。この場合、$_GET
にIDがあるかどうかを確認するだけです。 -配列。 json_encode()
を使用しました 操作が成功したかどうかをフロントエンドに通知する配列。失敗の最初のケースは、IDがなかった場合です。
次に、データベースに接続し、エラーを要求し、エラーが発生した場合は、すぐにユーザーに返します(echo
を使用) )、再びjson_encoded
経由 配列。
IDの価格を選択するためのステートメントを準備します(ここではエラーチェックをスキップしました。追加することをお勧めします)。次に実行します。
成功したかどうかを確認します->json_encoded配列を成功として、価格とともに返すか、成功を再度falseに設定して、エラーメッセージとともに配列を返します。
<?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;
}