SQL LIKEクエリの失敗-準備されたステートメントの致命的なエラー

StackOverflow https://stackoverflow.com/questions/601992

  •  03-07-2019
  •  | 
  •  

質問

次のコードがあります:

$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構文にエラーがあります。近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください '? WHERE upper(ARTICLE_NAME)LIKE '%?%' '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の準備されたステートメントの変数の数が一致しません。 38行目のphp

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

where as

$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ステートメントにパラメーターを使用することは不可能ですか?

役に立ちましたか?

解決

LIKE 句には、これを使用します:

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

テーブル名に関しては、テーブル名をパラメータとして使用することは非常に悪い習慣です。

何らかの理由でそれを行う必要がある場合、クエリを準備する前にクエリテキストに埋め込む必要があります。

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

他のヒント

発行しました

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

代わりに次を試してください:

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top