4

これにはもう一組の目が必要です。どんな助けでも大歓迎です。これは非常に単純な検索クエリですが、何らかの理由でバグを見つけることができません。まあ、私はバグがどこにあるか知っています。私はそれを乗り越えることができません。ともかく.....

POST変数から検索値を取得し、その変数を設定してから、次のように列変数を設定しています...

$term = "'%".$_POST['searchTerm']."%'";
$field = "columnName";

これらをエコーすると、完全に表示されます。したがって、フォームに「a」と入力すると、「%a%」とcolumnNameがエコーされます。

次に、クエリを準備し、次のようにパラメータをバインドします...

$suquery=$dbCon->prepare("select * from Table where ? LIKE ?");
$suquery->bind_param('ss', $field, $term);
$suquery->execute();

結果は常に0行を返します。これで遊んでいるときに私が見つけたのは、バインドされたパラメーターが正しくエコーされていても、どちらも正しく機能していないということです。たとえば、列がハードコーディングされ、検索語のみをバインドするようにクエリを変更すると、...

$suquery=$dbCon->prepare("select * from Table where columnName LIKE ?");
$suquery->bind_param('s', $term);
$suquery->execute();

返される行はまだゼロです。これは、$fieldが'%a%'としてエコーしても、何かがまだオフになっていることを示しています。私は本当にそれで途方に暮れています。同様に、検索語を配線して列をバインドすると...

$suquery=$dbCon->prepare("select * from Table where ? LIKE '%a%'");
$suquery->bind_param('s', $field);
$suquery->execute();

返される行が多すぎます。実際には、任意の列の値に文字「a」が含まれているテーブルから行をプルしています。したがって、列も用語も正しくバインドされていません。メーデー!

4

3 に答える 3

6
$suquery=$dbCon->prepare("select * from Table where ? LIKE ?");

期待どおりに動作しません。次のように翻訳されます。

SELECT * from table WHERE 'columnName' LIKE '%a%'

「columnName」に「a」が含まれているため、すべての行が返されます。'columnName' は文字列であり、実際の列名ではありません。

用語に余分な引用符があることを除いて、2 回目の試みは正しいです。パラメータを使用する場合、引用符は必要ありません。解決策は次のとおりです。

$term = "%".$_POST['searchTerm']."%";
$suquery=$dbCon->prepare("select * from Table where columnName LIKE ?");
$suquery->bind_param('s', $term);
$suquery->execute();
于 2009-10-02T01:49:55.827 に答える
2

編集:元の回答は誤った仮定に基づいていました(mysqliではなくPDOと仮定)。それに応じて答えを変更しました。

列名にパラメータ置換を使用することは許可されていないようです。mysqli :: prepareドキュメントから:

注:マーカーは、SQLステートメントの特定の場所でのみ有効です。たとえば、INSERTステートメントのVALUES()リスト(行の列値を指定するため)、またはWHERE句の列との比較で比較値を指定することができます。ただし、SELECTステートメントによって返される列に名前を付ける選択リスト内の識別子(テーブル名や列名など)、または...には使用できません。

クエリで列/フィールド名をハードコーディングし、パラメータを介して比較値を置き換えることで、これを確認することをお勧めします...

于 2009-10-01T14:19:56.380 に答える
0

これに出くわした人のために明確にするために。問題はかなり単純でしたが、それを追跡することがクマであるというのは十分に奇妙でした. ヘンリックは部分的に正しかった。LIKE ステートメントで使用する変数 $term を解析するとき、次のことを行っていました。

$term = "'%".$_POST['searchterm']."%'";

Henrik は、変数を一重引用符で囲む必要はないことを指摘しました。これは、単に次のようにクエリを準備して実行する場合に当てはまります。

$query=$connection->prepare("select * from DATABASE where $field like '$term'");
$query->execute();

それはうまくいきます。ただし、実際にはバインドされたパラメーターとして $term を使用していました。これは、ステートメント自体が検索用語を「%term%」のようにする必要があるため、実際に一重引用符が必要であることを意味します。一重引用符が必要です。バインドされたパラメーターの疑問符のプレースホルダーを一重引用符で囲もうとすると、構文エラーが発生します。また、バインドされたパラメーターとして使用している変数内に一重引用符を配置しないと、結果は常に次のようになります。 0 行が見つかりました。つまり、要するに、これに遭遇した他の人のために....クエリを直接送信する場合、選択ステートメントに直接配置できるため、一重引用符は必要ありません。バインドされたパラメーターを使用している場合、クエリが正しく機能するためには、変数の一部として一重引用符が必要です。

于 2009-10-14T23:27:07.647 に答える