SQL LIKEクエリの失敗-準備されたステートメントの致命的なエラー
質問
次のコードがあります:
$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ステートメントで識別子のプレースホルダーを使用することはできません。そのため、テーブル名をクエリに手動で挿入する必要があります。