3

「5」という名前の mysql 列を照会しようとしました。これにより、「22」という名前の間違った列が出力されます。

これは私のphpコードで$pid、Androidアプリから取得している変数であり、常に数値です。で検索すると$pid = 5、artist1 で列「5」を取得する代わりに、eternal1 で列「22」を取得しています。

基本的に、最初の印刷画面で列名と # を混同します。# が存在しない場合は、正しく検索されます。したがって、16 で検索すると、列 16 が表示されます。これを修正するにはどうすればよいですか?

$pid = $_GET["pid"];

$result=mysql_query("SELECT * FROM TableComments WHERE `$pid` IS NOT NULL ");

http://imgur.com/WFsfEtB

http://imgur.com/rZA27XC

4

2 に答える 2

2

これは、私が勝手に思いつく SQL ダイアレクトの設計によるものです。習慣から、アドホック クエリを追加しorder by 0 descたり追加したりする人を何人か知っています。最初に通常は ID 列を選択し、2 番目に「名前」列などを選択することがよくあります。order by 1クエリ内のフィールドの序数位置 (または * の場合はスキーマ) に基づいてクエリを実行しています。

5という名前の列を取得するには、方言と構成に適した SQL クォーティング メカニズムを使用する必要があります。例として、Microsoft Sql と Access は通常select * from tablecomments where [5]=5;を使用します。Postgres と Oracle では を使用select * from tablecomments where "5"=5し、Mysql では引用識別子はバックティックで引用されますselect * from tablecomments where `5`=5。Microsoft SQL では、セッションで SET QUOTED_IDENTIFIER ON が設定されている場合、Oracle や Postgres のようなものを作成することもできます。その場合は、角かっこの代わりに引用符を使用します。

余談ですが、非常に重要なことですが、ユーザー入力を取得して SQL に直接埋め込むべきではありません。誰かが Android アプリと PHP アプリの間の HTTP 送信を傍受した場合 (Charles や Fiddler などのプロキシでは些細なことです)、任意の SQL が挿入された http 要求をリプレイできます。他のコメンターが指摘したように、代わりにパラメーター化されたクエリを使用してください。

パラメータではなくクエリ自体を変更しようとしているため、許可されたフィールド名をホワイトリストに登録することを検討する必要がある場合があります (または、送信された文字列をスキーマで表されたフィールドと比較します)。

于 2013-05-19T00:54:07.607 に答える
1

列名をバッククォートで囲みます:

SELECT * FROM TableComments WHERE `$pid` IS NOT NULL

PDO古い、安全でない、非推奨の代わりに使い始めるmysql_*

于 2013-05-19T00:48:47.153 に答える