SQL LIKE Abfrage andernfalls - schwerwiegende Fehler in vorbereiteter Erklärung
Frage
Ich habe den folgenden Code:
$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 funktionieren. Allerdings erhalte ich den Fehler, dass:
Sie haben einen Fehler in der SQL-Syntax; Sie in die Bedienungsanleitung zu Ihrer MySQL-Server-Version für die richtige Syntax entspricht in der Nähe zu verwenden ‚? WHERE obere (ARTICLE_NAME) LIKE '%?%'‘In Zeile 1
Wenn ich put
SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '% o %';
Die Abfrage funktioniert gut. $ Tabelle oben definiert ist, und Abfrage von GET empfangen, und beide sind korrekt gültige Werte. Warum ist das Versagen?
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:
Achtung: mysqli_stmt :: bind_param () [mysqli-stmt.bind-param]: Anzahl der Variablen nicht mit Anzahl von Parametern in vorbereiteter Anweisung in C: \ Programmen \ EasyPHP 3.0 \ www \ prog \ get_records. php on line 38
Befehle nicht synchron; Sie können diesen Befehl jetzt nicht ausgeführt
Dabei gilt 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: Can not Parameter übergeben 2 durch Verweis in C: \ 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);
gibt nur:
Befehle nicht synchron; Sie können diesen Befehl jetzt nicht ausgeführt
Ist es unmöglich, eine Paramter für eine LIKE statament zu benutzen?
Lösung
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.
Wenn aus irgendeinem Grund müssen Sie noch, es zu tun, müssen Sie es in die Abfrage Text einzubetten, 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);
}
Andere Tipps
Haben Sie ausgegeben
mysqli_free_result($result);
nach der letzten Abfrage? Das ist der Befehl aus Synchronisierungsfehler.
Dies sollte jedoch funktionieren
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", "%".$query."%");
Sie fragen sich, was in dem $ query variabel ist. Versuchen Sie, diese stattdessen
$query = '%'.$query.'%';
$numRecords->bind_param("s", $query);
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);
}
Afaik Sie keine Platzhalter für Bezeichner mit mysqli und bereiten Anweisungen verwenden können. So müßten Sie manuell die Tabellennamen in die Abfrage einfügen.