2009-03-02 17 views
1

Ich habe den folgenden Code:SQL LIKE Abfrage Fehler - fatale Fehler in vorbereiteter Anweisung

$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE '% ? %'"; 
if ($numRecords = $con->prepare($countQuery)) { 
    $numRecords->bind_param("ss", $table, $brand); 
    $numRecords->execute(); 
    $data = $con->query($countQuery) or die(print_r($con->error)); 
    $rowcount = mysql_num_rows($data); 
    $rows = getRowsByArticleSearch($query, $table, $max); 
    $last = ceil($rowcount/$page_rows); 
} 

Welche sollte gut funktionieren. Jedoch erhalte ich den folgenden Fehler:

Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version entspricht, um die richtige Syntax in der Nähe von '? WHERE obere (ARTICLE_NAME) LIKE '%?%'‘At line 1

Wenn ich

setzen
SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '% o %'; 

Die Abfrage funktioniert gut. $ table ist oben definiert und die Abfrage wird von GET empfangen und beide sind korrekte gültige Werte. Warum scheitert das?

edit: Wechsel zu:

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE '% ? %'"; 

if ($numRecords = $con->prepare($countQuery)) { 

    $numRecords->bind_param("s", $query); 

Ergebnisse in dem Fehler:

Warnung: mysqli_stmt :: bind_param() [mysqli-stmt.bind-param]: Anzahl der Variablen nicht Vergleich der Anzahl der Parameter in der vorbereiteten Anweisung in C: \ Programme \ EasyPHP 3.0 \ www \ prog \ get_records.php in Zeile 38

Befehle nicht synchron; jetzt

wo als

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?"; 

if ($numRecords = $con->prepare($countQuery)) { 

    $numRecords->bind_param("s", "%".$query."%"); 

Ergebnisse in

Fatal error Sie können diesen Befehl nicht ausführen: nicht Parameter 2 durch Verweis in C passieren kann: \ Programme \ EasyPHP 3.0 \ www \ prog \ get_records.php on line 38

und schließlich

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ? "; 

if ($numRecords = $con->prepare($countQuery)) { 

    $numRecords->bind_param("s", $query); 

nur geben:

Befehle nicht synchronisiert; Sie können diesen Befehl jetzt nicht ausführen

Ist es unmöglich, einen Parameter für eine LIKE Statement zu verwenden?

+0

möglich Duplikat [SQL-Ausnahme, wenn eine vorbereitete Anweisung machen versuchen] (http://stackoverflow.com/questions/460920/sql-exception-when-trying-make-an-prepared (Anweisung) – outis

Antwort

7

Für LIKE Klausel, verwenden Sie diese:

SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ?, '%') 

Wie für die Tabellennamen, es ist eine extrem schlechte Praxis Tabellennamen als Parameter zu haben.

es Wenn Sie noch aus irgendeinem Grund tun müssen, Sie werden es in den Abfragetext einbetten müssen, bevor die Abfrage vorbereiten:

$countQuery = "SELECT ARTICLE_NO FROM $table_name WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ? ,'%')"; 
if ($numRecords = $con->prepare($countQuery)) { 
    $numRecords->bind_param("s", $brand); 
    $numRecords->execute(); 
    $data = $con->query($countQuery) or die(print_r($con->error)); 
    $rowcount = mysql_num_rows($data); 
    $rows = getRowsByArticleSearch($query, $table, $max); 
    $last = ceil($rowcount/$page_rows); 
} 
+1

Andere Leute haben das gesagt, aber die Übergabe des Tabellennamens als Parameter funktioniert gut? Ist es eine schlechte Übung, dies zu tun? –

+0

Wenn der Tabellenname als Parameter übergeben wird, kann MySQL diese Anweisung nicht erstellen. Sie können keine vorbereitete Anweisung mit einem Tabellennamen als Parameter haben. – Quassnoi

0

Versuchen Sie Folgendes statt:

$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE ?"; 
if ($numRecords = $con->prepare($countQuery)) { 
    $numRecords->bind_param("ss", $table, "%$brand%"); 
    $numRecords->execute(); 
    $data = $con->query($countQuery) or die(print_r($con->error)); 
    $rowcount = mysql_num_rows($data); 
    $rows = getRowsByArticleSearch($query, $table, $max); 
    $last = ceil($rowcount/$page_rows); 
} 
+0

nein, das hat es nicht gelöst, oder ähnliche Tricks. –

0

Afaik Sie keine Platzhalter für Bezeichner mit mysqli und bereiten Anweisungen verwenden können. Sie müssten also den Tabellennamen manuell in die Abfrage interpolieren.

+0

huh. Sie haben vorher gescheitert, als ich den Tabellennamen nicht als Parameter hatte. –

2

Sie

mysqli_free_result($result); 

nach dem ausgestellt letzte Abfrage? Das ist der Befehl, der nicht synchron ist.

jedoch Dies sollte

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?"; 
if ($numRecords = $con->prepare($countQuery)) { 
    $numRecords->bind_param("s", "%".$query."%"); 

Wondering arbeiten, was in dem $ query variabel ist. Versuchen Sie, diese stattdessen

$query = '%'.$query.'%'; 
$numRecords->bind_param("s", $query); 
+0

Ich habe keine Ahnung, wo ich das herausbringen kann. Ich habe alles soweit befreit, wie ich sehen kann, und immer noch diesen Fehler bekommen. –

+0

Dies kann zum Beispiel passieren, wenn Sie mysql_use_result() verwenden und versuchen, eine neue Abfrage auszuführen, bevor Sie mysql_free_result() aufgerufen haben. Es kann auch vorkommen, wenn Sie versuchen, zwei Abfragen auszuführen, die Daten zurückgeben, ohne mysql_use_result() oder mysql_store_result() dazwischen aufzurufen. –