Frage

Ich habe Probleme eine vorbereitete Erklärung über mysqli ausgeführt wird.

Zuerst wurde ich Befehl immer aus Synchronisierungsfehler. Ich bin das Ergebnis zu speichern und die Verbindung geschlossen wird, und ich habe immer diese Fehlermeldung angehalten, so dass hoffentlich das Problem zum Stillstand gekommen ist.

Allerdings ist der Fehler in meiner SQL-Syntax-Fehler, was in Ordnung war arbeiten, während die Befehle nicht synchron waren, wurde wieder auf. Hier ist mein aktueller Code:

Ich habe viele verschiedene Ansätze versucht, dieses snytax Fehler zu korrigieren, Arbeiten mit CONCAT, die, wie es ausgefallen ist, kommentierte aus Zuweisung% Zeichen an die Variable vor der Bindung etc..nothing funktioniert.

Der Versuch, zu verwenden:

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

Ergebnisse in einem Fehler durch Verweis übergeben.

<?php
$con = mysqli_connect("localhost", "blah", "blah", "blah");
if (!$con) {
    echo "Can't connect to MySQL Server. Errorcode: %s\n". mysqli_connect_error();
    exit;
}
$con->query("SET NAMES 'utf8'");
$brand = "o";
$brand = "% ".$brand." %";
echo "\n".$brand;
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE ?";
//CONCAT('%', ?, '%')";
echo "\ntest";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s",  $brand);
    echo "\ntest bind";
    $numRecords->execute();
    echo "\ntest exec";
    $numRecords->store_result();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = $data->num_rows;
    $numRecords->free_result();
    $numRecords->close();
    echo "/ntest before rows";
    $rows = getRowsByArticleSearch("test", "Auctions", " ");
    $last = ceil($rowcount/$page_rows);
} else {
    print_r($con->error);
}
foreach ($rows as $row) {
    $pk = $row['ARTICLE_NO'];
    echo '<tr>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['USERNAME'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['shortDate'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="deleterec(\'Layer2\', \'' . $pk . '\')">DELETE RECORD</a></td>' . "\n";
    echo '</tr>' . "\n";
}
function getRowsByArticleSearch($searchString, $table, $max) {
    $con = mysqli_connect("localhost", "blah", "blah", "blah");
    //global $con;
    $recordsQuery = "SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y' ) AS shortDate FROM $table WHERE upper(ARTICLE_NAME) LIKE '%?%' ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s')" . $max;
    if ($getRecords = $con->prepare($recordsQuery)) {
        $getRecords->bind_param("s", $searchString);
        $getRecords->execute();
        $getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate);
        while ($getRecords->fetch()) {
            $result = $con->query($recordsQuery);
            $rows = array();
            while($row = $result->fetch_assoc()) {
                $rows[] = $row;
            }
            return $rows;
        }
    }
}

Der genaue Fehler ist:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 11

Zeile 11 ist die Linie definiert $ countQuery.

Wie Sie sehen können, Marke assined als "o";

So ist die SQL-Anweisung sollte

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

Welche funktioniert gut, wenn ich es manuell ein.

War es hilfreich?

Lösung

mysqli_stmt::bind_param kann nur eine bestimmte Variable binden, keinen Ausdruck. Die mitgelieferte Variable wird zu ‚binden‘ durch einen Verweis übergeben, und nicht von Wert, was bedeutet, dass die zugrunde liegende SQL bekommt, was Wert, Variable zu der Zeit hat der Befehl ausgeführt wird, nicht, wenn es gebunden ist.

Verwendung:

WHERE field LIKE CONCAT('%', ?, '%")

oder tun:

$brand = '%' . $brand . '%'

, unmittelbar bevor der Befehl ausgeführt wird.

Was Sie nicht tun können ist:

WHERE field LIKE '%?%

, weil das ? gebunden Variable auf einen einzelnen String oder numerischen Wert, nicht zu einem Teil (oder Feldnamen) entspricht.

Bearbeiten in diesem Fall erscheint Ihr eigentliches Problem vorbereitete Anweisungen zu vermischen (wie durch mysqli::prepare und mysqli_stmt::execute() ) mit einfachen alten Abfragen (wie bei mysqli::query() ). Sie sollten sich auch fragen, nur für die Anzahl der Zeilen direkt aus dem DB-Server, anstatt die Daten zu ziehen und num_rows verwenden:

$countQuery = "SELECT COUNT(ARTICLE_NO) FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s",  $brand);
    $numRecords->execute();
    $numRecords->bind_result($num_rows);
    $numRecords->fetch();
    $numRecords->free_result();
    $numRecords->close();
    $last = ceil($rowcount/$page_rows);
} else {
    print_r($con->error);
}

Andere Tipps

Das Problem ist nicht in der vorbereiteten Anweisung, aber in dem Aufruf der ‚query‘ Methode, die nicht dort sein sollen -. Wie es verwendet wird „Standard“ (nicht bereit) Anweisungen auszuführen

$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = $data->num_rows;

sollte

$rowcount = $numRecords->num_rows;

in der getRowsByArticleSearch Funktion, sollten Sie erneut die Abfrage fallen und die Variablen übergeben verwenden für die Ausgabe bind_result:

  $getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate);
  while ($getRecords->fetch()) {
    $pk = $ARTICLE_NO;
    echo '<tr>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$USERNAME.'</a></td>' . "\n";
    // etc...
  }

für ein bisschen mehr Informationen, überprüfen PHP Handbuch bind_result: http : //php.net/manual/en/mysqli-stmt.bind-result.php

Dieser Beitrag auf mysql.com scheint, dass CONCAT() vorschlagen sollte funktionieren: http://forums.mysql.com/read.php? 98,111039,111060 # msg-111060

Haben Sie versucht, den Namen params mit?

Sie versuchen zu nennen:

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

Aber Ihr SQL ist:

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

Sollte es nicht sein? (Man beachte die LIKE ?s)

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE ?s";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top