Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Chcesz pobrać dane z bazy danych na podstawie wyboru z listy rozwijanej za pomocą php

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

Wyszukujesz w nazwie planu kolumn, ale definiując <option> jest jak

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

Wysyłasz identyfikator jako wartość.

Twoje zapytanie powinno brzmieć:

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

Przeczytaj także inne komentarze. Mieszasz mysql_* api i PDO, powinieneś używać tylko PDO. Dlaczego nie powinienem używać funkcji mysql_* w PHP? I zobacz to, gdy jesteś przy tym: Jak mogę zapobiec wstrzykiwaniu SQL w PHP?

Struktura twojego kodu sprawi, że utrzymanie go będzie naprawdę kłopotliwe, powinieneś najpierw wykonać całą pracę logiczną, zebrać wszystkie dane, a następnie wyświetlić swój html i dane w następnym kroku.

Jak wdrożyć swój plan

Potrzebujesz / możesz użyć dwóch różnych skryptów, aby uzyskać dynamiczny interfejs użytkownika. (Możesz użyć tego samego pliku, ale może być bałagan i lepiej jest dzielić zadania)

1. Interfejs:

Jak wcześniej wspomniano, powinieneś uporządkować kod w zrozumiałej kolejności. Widać, że najpierw konfiguruję połączenie z bazą danych, potem wykonuję zapytania i już pobieram wynik. W ten sposób mam już wszystkie potrzebne dane, zanim zacznę wyprowadzać inne rzeczy (jeśli coś pójdzie nie tak, jak zauważyłem, coś jest niepoprawne z danymi / cokolwiek, co mogę przekierować na inną stronę, ponieważ nie został wysłany nagłówek) .

Aby rozpocząć wyjście, dodałem do twojego skryptu podstawową strukturę HTML, nie wiem, czy już ją masz, przynajmniej nie ma jej we fragmencie.

Więc dodałem nagłówek i treść, w nagłówku jest kod javascript, który wykona żądanie do zaplecza i otrzyma odpowiedź, aby odpowiednio działać.

Poza tym zmniejszyłem trochę szumu i użyłem innego formatowania kodu niż ty, w zasadzie nie lubię używać echa do wyprowadzania kodu HTML, ponieważ niektóre IDE nie są w stanie podświetlać składni, gdy to zrobią.

Dodałem również <p></p> w którym komunikat o błędzie może zostać wyświetlony użytkownikowi, jeśli coś w backendzie pójdzie nie tak.

<?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. Backend:(w tym przypadku nazwany ajax.php)

Prosty fragment kodu, nic specjalnego do zrobienia.

Pierwszy krok:walidacja danych wejściowych. W takim przypadku po prostu sprawdzam, czy w $_GET znajduje się identyfikator -Szyk. Użyłem json_encode() na tablicy, w której mówię frontendowi, czy operacja się powiodła, czy nie. Pierwszym przypadkiem niepowodzenia byłby brak identyfikatora.

Następnie połącz się z bazą danych, zapytaj o błędy, a jeśli tak, zwróć je natychmiast użytkownikowi (za pomocą echo ), ponownie przez json_encoded szyk.

Przygotuj zestawienie do wyboru ceny identyfikatora (pominąłem tutaj sprawdzanie błędów, możesz chcieć je dodać). Następnie wykonaj go.

Sprawdź, czy się udało -> zwróć tablicę json_encoded jako sukces i z ceną lub ustaw ponownie success false i zwróć tablicę z komunikatem o błędzie.

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy istnieje sposób, aby zainstalować tylko klienta mysql (Linux)?

  2. Powolne zapytanie o information_schema.tables

  3. Sprawdź i zoptymalizuj bazę danych MySQL automatycznie za pomocą Crontab/Cron

  4. MySQL pokazuje sumę różnicy dwóch wartości

  5. Jak sprawdzić, czy wkładanie się nie udaje?