2016-08-01 17 views
-1

Der Plan ist, einen öffentlich zugänglichen Internetdienst zu erstellen, der Wörter aus einer Datenbank automatisch vervollständigen kann. Ich hatte es funktioniert erfolgreich mit einer regulären MySQL-Abfrage, aber ich bin besorgt, weil ich diese Verbindung in ein Wordpress-Plugin aufnehmen werde, dass es meinen Server verwundbar.SQL Injection Proof SELECT mit LIKE und Platzhalter in assoziative Array

Ich habe einen neuen Benutzer in MYSQL mit nur ausgewählten Berechtigungen für diese Tabelle erstellt, so dass ich nicht besorgt über die Offenlegung des Kennworts im Skript bin, wie ich glaube, es wird trotzdem beim Debuggen helfen. Es gibt verschiedene Echos usw., die ich zu Debuggingzwecken dort platziert habe. Schließlich wird die Ausgabe von dieser in eine JSON-Datei gehen und durch JQuery UI Autocomplete abgerufen werden.

Im Wesentlichen das Problem, das ich habe, ist, dass ich die Abfrage nicht zum Funktionieren bringen kann. Ich habe versucht, den Code Zeile für Zeile hinzuzufügen, aber die Verbindung funktioniert nicht. Fühlen Sie sich frei, die Anmeldeinformationen auf mysql workbench die IP-Adresse 46.101.8.220 zu testen. Was das Debugging noch schwieriger macht, ist, dass jemand im Code verhindert, dass auf der Ausgabe der Seite etwas angezeigt wird, wenn er von einem Webbrowser aus betrachtet wird. Jede Hilfe würde sehr geschätzt werden, da ich viele Stunden damit verbracht habe, Mysqli, PDO, objektorientierte und prozedurale Versuche zu versuchen, dies zum Laufen zu bringen.

$term = isset($_GET['term']) ? $_GET['term'] . '%': 'test%'; 
echo $term; 

$conn = new mysqli('localhost', 'search-words','','admin_soup'); 
print ($conn ? 'connected' : 'cant con'); 
$query = 'SELECT id as value, word as label FROM word where word LIKE ?;'; 
    $stmt = $conn->prepare($query); 
    $stmt->bind_param("s", $term) 
    if ($stmt->execute()){ 
     $result = $stmt->get_result(); 
     while($row = $result->fetch_array(MYSQLI_ASSOC)){ 
      $row_set[] = $row; 
     } 
    } 
echo json_encode($row_set);//format the array into json data 
$stmt->close(); 
$conn->close(); 
print_r($row_set); 

Nach der ersten Beratung Code geändert und funktioniert. Vielen Dank!

Der Code gibt immer noch nichts zurück. Überprüfen Sie die Benutzerinformationen doppelt. Die einzige Sache, die ich ändern muss, wenn ich die sql Aussage teste, ist, dass ich Quoations um das "Test%" addieren muss, aber ich denke, das bind_param benötigt Anführungszeichen nicht. Wenn ich den gesamten Code aus der $ Abfrage lösche, wird die verbundene Nachricht auf dem Bildschirm angezeigt, wenn ich darunter noch einmal hinzufüge. Der Bildschirm zeigt nichts an.

Gibt es vielleicht etwas aktualisiert auf meinem Server oder etwas?

Antwort

0
$stmt->bind_param("s", $term) 

Fehlende ";"

Die Methode get_result() ist nicht immer verfügbar. Überprüfen Sie php.net: http://php.net/manual/en/mysqli-stmt.get-result.php

Nur mit mysqlnd verfügbar.

Das ist einer der Gründe ist, warum gU so viel bequemer ist ...

Aber ich denke, man bind_result() und dann fetch() die Daten wie in den Beispielen gezeigt, können http://php.net/manual/en/mysqli-stmt.fetch.php

if ($stmt->execute()){ 
    $stmt->bind_result($value, $label); 
    while($row = $stmt->fetch()){ 
     $row_set[] = array('value' => $value, 'label' => $label); 
    } 
} 

Mit Hilfe von PDO könnte der Code wie folgt aussehen:

$stmt = $dbh->prepare('SELECT id as value, word as label FROM word where word LIKE ?'); 
$stmt->execute(array($term)); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
+0

Ich versuchte die mysqli Lösung und stilll Nichts, ich habe die Frage mit einigen neuen Ideen aktualisiert. Ich frage mich, ob das etwas mit dem Code zu tun hat. –

+0

@StephenMclaughlin '$ row_set [] = array ('wert' => $ wert, 'label' => $ label)' Missing; nochmal. – Philipp

+0

kann den Wald für die Bäume nicht sehen: '( –