2017-07-06 4 views
1

/// das ist der Formularteil .wobei ich versuche, Daten aus der Datenbank zu bekommen und es in "txt" part.the zu zeigen, ist der Teil in der gleichen Akte und getService.php ist im selben Verzeichnis wie diese Datei. Warum zeige ich nichts, wenn ich etwas wähle.php ajax error ... zeigt die Daten nicht an

<form> 
<select name="parent"> 
<option selected="users" onchange="showService(this.value)">Select a Service:</option> 
<?php 
$res=$mysqli->query("SELECT * FROM service"); 
while($row=$res->fetch_array()) 
{ 
    ?> 
    <option value="<?php echo $row['id']; ?>"><?php echo $row['name']; ?></option> 
    <?php 
} 
?> 
</select> 
</br> 

</form> 



<div id="txt"><b>Service info will be show here...</b></div> 


    </center> 

    </div> 

// Skript Teil. in derselben Datei.

<script> 
function showService(str) { 
    if (str == "") { 
     document.getElementById("txtHint").innerHTML = ""; 
     return; 
    } else { 
     if (window.XMLHttpRequest) { 
      // code for IE7+, Firefox, Chrome, Opera, Safari 
      xmlhttp = new XMLHttpRequest(); 
     } else { 
      // code for IE6, IE5 
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     xmlhttp.onreadystatechange = function() { 
      if (this.readyState == 4 && this.status == 200) { 
       document.getElementById("txt").innerHTML = this.responseText; 
      } 
     }; 
     xmlhttp.open("GET","getService.php?q="+str,true); 
     xmlhttp.send(); 
    } 
} 
</script> 

//getService.php

<?php 

session_start(); 
include_once'db_connect.php'; 


?> 

<!DOCTYPE html> 
<html> 
<head> 
<style> 
table { 
    width: 100%; 
    border-collapse: collapse; 
} 

table, td, th { 
    border: 1px solid black; 
    padding: 5px; 
} 

th {text-align: left;} 
</style> 
</head> 
<body> 

<?php 
$q = intval($_GET['q']); 

$sql="SELECT * FROM service WHERE id = '".$q."'"; 
$result = mysqli_query($mysqli,$sql); 

echo "<table> 
<tr> 

<th>id</th> 
<th>Service name</th> 
<th>Detail</th> 

</tr>"; 
while($row = mysqli_fetch_array($result)) { 
    echo "<tr>"; 
    echo "<td>" . $row['id'] . "</td>"; 
    echo "<td>" . $row['name'] . "</td>"; 
    echo "<td>" . $row['detail'] . "</td>"; 
    echo "</tr>"; 
} 
echo "</table>"; 
mysqli_close($mysqli); 
?> 

</body> 
</html> 
+0

Ihre getService.php sollte nicht eine ganz neue HTML-Seite zurückgeben, um in eine andere einzufügen, das ist nicht wirklich gültige Markup. Geben Sie stattdessen nur den '

' Teil zurück, der tatsächlich benötigt wird, um innerhalb des spezifischen Teils der Seite – ADyson

+0

in der Zwischenzeit zu gehen. Überprüfen Sie die Konsolen- und Netzwerkregisterkarten Ihres Browsers in den Entwicklertools, um festzustellen, ob HTTP-Fehler aufgetreten sind Sie haben den Parameter korrekt an den Server übergeben und welche (falls vorhanden) Antwort ist aufgetreten. Auch Ihre SQL ist sehr anfällig für Injektionsattacken - Sie sollten parametrisierte Abfragen verwenden, Sie können dies leicht googlen. – ADyson

+0

Schließlich ist "ID" eine Ganzzahl? Weil Sie es in Ihrer Anfrage in Anführungszeichen wie eine Zeichenkette an mySQL senden, so dass es nicht mit einer Ganzzahl in der Tabelle übereinstimmt. Auch wenn Sie geeignete parametrisierte Abfragen verwendet haben, wird diese Art von Problem einfach verschwinden. – ADyson

Antwort

1

Es gibt eine Reihe von Problemen mit Ihrem Code. In der Reihenfolge der direkten Relevanz für Ihre Frage:

1) onchange="showService(this.value)" sollte ein Attribut der <select> nicht die erste <option> sein. Daher wird das Änderungsereignis überhaupt nicht ausgelöst, was bedeutet, dass Ihr Ajax-Aufruf niemals ausgeführt wird.

2) document.getElementById("txtHint") ist falsch (an zwei Stellen) - Sie haben kein Element mit dieser ID in Ihrem HTML. document.getElementById("txt") sollte funktionieren.

3) Ihre getService.php sollte nicht eine ganz neue HTML-Seite (mit DocType, HTML, Body-Tags usw.) in ein Div in einer anderen Seite einfügen, das ist nicht wirklich gültige Markup. Stattdessen geben Sie nur den <table> Teil zurück, der tatsächlich benötigt wird, um in den spezifischen Teil der Hauptseite zu gelangen. Wenn Sie das CSS in getService.php benötigen, verschieben Sie es in Ihre Hauptseite oder eine separate CSS-Datei, die auf der Hauptseite enthalten ist.

4) Sie verarbeiten q als int (unter Verwendung intval()), aber dann übergeben Sie es an mySQL, als ob es eine Zeichenfolge ist (indem Sie in der SQL-Anweisung einfache Anführungszeichen setzen). Wenn das Feld id in Ihrer Datenbank eine Ganzzahl ist, werden die Werte nicht als gleich betrachtet und daher werden keine Ergebnisse zurückgegeben. Wenn dies der Fall ist, sollten Sie die einfachen Anführungszeichen entfernen.

5) Punkt 4 oben ist jedoch ein Symptom für ein anderes Problem, in dem Sie keine Variablen in Ihre Abfrage einfügen sollten, einfach indem Sie PHP-Strings zusammenfügen. Dadurch sind Sie anfällig für SQL Injection-Angriffe, bei denen ein böswilliger Benutzer Ihre Daten stehlen, korrumpieren oder löschen kann, indem er SQL in die Variable selbst einfügt. Stattdessen sollten Sie parametrisierte Abfragen verwenden, um dies zu verhindern, und auch das Potenzial für Probleme wie in Punkt 4 beschrieben beseitigen. http://bobby-tables.com/ ist eine gute Ressource, die sowohl die Gefahren von Injektionsangriffen erklärt und Ressourcen enthält, die erklären, wie parametrisierte Abfragen und andere Techniken zu verwenden wehren Sie sich davor, einschließlich Beispiele mit PHP. Dies ist eine gute Angewohnheit, auf die Sie jetzt eingehen werden, und wird die Daten in Ihrer Anwendung schützen.