1

次のコードがあります。

$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);
}

これはうまくいくはずです。ただし、次のエラーが表示されます。

SQL 構文にエラーがあります。near '? を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。WHERE upper(ARTICLE_NAME) LIKE '%?%'' at line 1

私が入れたら

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

クエリは正常に機能します。$table は上記で定義され、クエリは GET から受信され、両方とも正しい有効な値です。なぜこれが失敗するのですか?

編集: に変更:

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

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

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

エラーが発生します:

警告: mysqli_stmt::bind_param() [mysqli-stmt.bind-param]: 変数の数が、C:\Program Files\EasyPHP 3.0\www\prog\get_records.php の準備されたステートメントのパラメーターの数と一致しません。 38

コマンドが同期していません。現在、このコマンドを実行することはできません

一方

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

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

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

結果は

致命的なエラー: 38 行目の C:\Program Files\EasyPHP 3.0\www\prog\get_records.php で参照によってパラメーター 2 を渡すことはできません

そして最後に

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

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

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

のみを与えます:

コマンドが同期していません。現在、このコマンドを実行することはできません

LIKEステートメントにパラメーターを使用することは不可能ですか?

4

4 に答える 4

2

発行しましたか

mysqli_free_result($result);

最後のクエリの後?それがコマンド同期エラーです。

ただし、これは機能するはずです

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

$query 変数に何が入っているのだろうか。代わりにこれをやってみてください

$query = '%'.$query.'%';
$numRecords->bind_param("s", $query);
于 2009-03-03T13:26:34.037 に答える
0

代わりに次のことを試してください。

$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);
}
于 2009-03-02T11:28:55.980 に答える
0

私の知る限り、mysqli および prepare ステートメントで識別子にプレースホルダーを使用することはできません。そのため、テーブル名を手動でクエリに補間する必要があります。

于 2009-03-02T11:36:17.867 に答える