2017-03-03 3 views
0

Ich mache einen Shop und benutze eine Eingabe, um Ergebnisse zu erhalten, jetzt habe ich den AJAX, der das PHP-Skript aufruft es nennt es in Ordnung, aber ich erhalte eine Fehlermeldung:Schwerwiegender Fehler: Nicht abgefangene Ausnahme 'PDOException' mit Nachricht 'SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1064

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064

HINWEIS: die Fehlerzeile ist die $query->execute(array(':input'=>$input)) Linie

hier ist das AJAX-Skript (+ HTML Aufruf der Funktion)

     <input type="text" name="search_item" onkeyup="showItems(this.value)" id="search_item"> 
        <script> 
         function showItems(str) { 
          if (str.length == 0) { 

          } else { 
           var xmlhttp = new XMLHttpRequest(); 
           xmlhttp.onreadystatechange = function() { 
            if (this.readyState == 4 && this.status == 200) { 
             document.getElementById("items").innerHTML = this.responseText; 
            } 
           }; 
           xmlhttp.open("GET", "searchScript.php?iName=" + str, true); 
           xmlhttp.send(); 
          } 
         } 
        </script> 

und hier ist der angerufene PHP:

$input = $_REQUEST["iName"]; 
    $input = "%".$input."%"; 
$dsn = 'mysql:host=xxx.com;dbname=dbNameHidden;charset=utf8mb4'; 
$username = 'hidden'; 
$password = 'hidden'; 

try{ 
    // connect to mysql 
    $con = new PDO($dsn,$username,$password); 
    $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch (Exception $ex) { 
    echo 'Not Connected '.$ex->getMessage(); 
} 
$query = $con->prepare("SELECT * FROM store AS s INNER JOIN product_pictures AS pp ON s.product_id = pp.id INNER JOIN product_name AS pn ON s.product_id = pn.id WHERE product_name LIKE %:input% LIMIT 9 "); 
$query->execute(array(':input' => $input)); 
$items = $query->fetchAll(); 
+0

Ergebnisse in 'LIKE% 'etwas'%' was nicht korrekt ist. Fügen Sie der Variablen '' '' '' '' '' '' '' '' '' '' '' '' '' ' – AbraCadaver

+0

Sie können keine Platzhalter außerhalb Ihrer Bindung platzieren. Legen Sie es um Ihre Eingabe, bevor Sie es übergeben. – aynber

+0

Ich bekomme immer noch einen Fehler –

Antwort

1

Fügen Sie die Platzhalter auf den Parameter:

$query = $con->prepare("SELECT ... WHERE product_name LIKE :input LIMIT 9 "); 
$query->execute(array(':input' => '%' . $input. '%')); 

So werden die Platzhalter in dem Wert enthalten sind, im Wesentlichen die Abfrage wie folgt zu machen:

SELECT .... WHERE product_name LIKE '%name%' 
+0

ohh da, okay im Versuch –

+0

Es funktioniert! Vielen Dank! –

+0

Großartig - wenn Sie glauben, dies ist die beste Lösung, bitte [Antwort akzeptieren] (http://StackOverflow.com/Help/accepted-answer). Weitere Informationen finden Sie unter [Was soll ich tun, wenn jemand meine Frage beantwortet?] (Http://stackoverflow.com/help/someone-answers) –

0

Ihre Abfrage führt zu LIKE %'something'%, die nicht korrekt ist. Fügen Sie der Variablen % nicht die Abfrage hinzu. Sie möchten etwas wie:

$input = "%$input%"; 

$query = $con->prepare("SELECT * FROM store AS s 
         INNER JOIN product_pictures AS pp ON s.product_id = pp.id 
         INNER JOIN product_name AS pn ON s.product_id = pn.id 
         WHERE product_name LIKE :input LIMIT 9 "); 
$query->execute(array(':input' => $input)); 
Verwandte Themen