2012-01-09 5 views
4

を文字列を数値に変換しないMySQLを行いますfoobar123などのIDなどのユーザ名を与えられたとき私はIDによって、またはユーザ名でテーブルからユーザーを選択し、自分のアプリケーションでクエリを持って

SELECT * FROM users WHERE id = '$x' OR username = '$x' 

これが働いています1,123。 しかし、2fooのようなユーザー名を入力すると、ユーザー2fooとユーザーid=2の両方が選択されます。したがって、22fooになり、ユーザーが見つかります。さらに、警告メッセージが表示されます。1292:間違ったDOUBLE値の切り捨て:2foo

この変換を行わないようにMySQLに指示する方法はありますか(このクエリではなく、データベース全体ではありません)。または、偽の結果を破棄するためにクエリの後ろにフィルタリングを行う必要がありますか?

+1

実際のクエリを作成する関連するコードを共有できますか?これはmysqlの問題ではなく、生成された質問にある可能性が高いです。 –

+0

私はこのクエリをMySQL Query Browserに入力しました: 'SELECT * FROM users WHERE id = '2foo' OR username = '2foo''。私はこの質問を私のアプリケーションから問題のあるものと特定したので、周囲のコードはありません。 MySQLバージョン:5.1.41-3ubuntu12.10 – arnep

+2

正しいことは、$ xが数字であるかどうかを確認し、それに応じてクエリを構築することです: 'if(is_numeric($ x)){ $ sql =" SELECT *ユーザid = $ xまたはユーザ名= '$ x' " } else { $ safeX = mysql_real_escape_string($ x); //準備されたステートメント、または他のものを好むもの。 $ sql = "WHERE username = '$ x'" } 'SELECT * FROM users ' –

答えて

5

あなたのクエリは、MySQLで「this-is-a-feature-not-a-bug」の動作を引き起こす方法で形成されます:同じ文字列( '$ x')を数字フィールド( id)とvarcharフィールド(ユーザー名)に割り当てます。

私は確信していますが、SQLでこの作業を行う方法はありますが、正しい方法はクエリを作成するPHPを修正することだけです。何かのように

if (is_numeric($x)) $sql="SELECT * FROM users WHERE id = '$x' OR username = '$x'"; 
else $sql="SELECT * FROM users WHERE username = '$x'"; 

助けてください。ここで

は、SQLのバージョンは、単に完全性のために、次のとおりです。

SELECT * FROM users WHERE id = IF('$x' REGEXP '^[0-9]+$','$x',0) OR username = '$x' 

注:、私は仮定OQを形成することを$ xはすでにエスケープされます。

+1

(1)REGEXPは '2foo'にマッチします。両端にアンカーする必要があります。 (2)OPのテーブルに0に等しい 'id'があるかもしれないので、' IF(val REGEXP ...、val、NULL) 'を提案しますが、NULLに等しいidはありません。 – pilcrow

+0

私の悪い、正規表現を修正しました。 0/nullについては、私はかなりユーザーのテーブルにID int auto_incrementを持っていると確信しています... –

+0

どのように確かめることができますか?あなたはOPのDDLを見ましたか? [NO_AUTO_VALUE_ON_ZERO](http://dev.mysql.com/doc/refman/5.6/en/server-sql-mode.html#sqlmode_no_auto_value_on_zero)は、正確にはAUTO_INCREMENT列にゼロを格納するためのものですか? – pilcrow

関連する問題