2017-03-29 18 views
0

私はこのコードをDelphi 10.2で使用し、アンドロイドで動作します。 データはリモートのmysqlサーバにあります。クエリでSQL文字列を追加

Query1.SQL.Text := ''; 
Query1.SQL.Add('SELECT userid, userphoto, username'); 
Query1.SQL.Add('FROM users'); 
Query1.SQL.Add('WHERE usermail = ' + #39 + Text1.Text + #39); 
Query1.Execute; 

問題クエリでSQLはSQLが空のフィールドをバック与えることをこのように

SELECT userid, userphoto, username 
FROM users 
WHERE usermail = 'THE TEXT 
' 

が追加されます。 最後の文字が改行するのはなぜですか? あなたの答えをありがとう。

+0

デバッグこのコードを無関係な、代わりのあなたを連結text1.Textを –

+5

に埋め込まれた改行文字があるかどうかを確認そのような節は、私は強くパラメータを使用することをお勧めします。現在のコードはSQLインジェクションの影響を受けやすいです。 –

+2

パラメータクエリを使用していない場合は、少なくとも手動クォートの代わりに 'QuotedStr()'を使用してください: 'Query1.SQL.Add( 'WHERE usermail =' + QuotedStr(Text1.Text) );これはSQLインジェクション攻撃を防ぎます。 –

答えて

1

Text1はどのようなコンポーネントですか?改行を受け入れますか? Text1.Textにアクセスすると、'THE TEXT'#10が返されます。

最後の文字が#10(または可能であれば#13または最後の2文字が#13#10)であるかどうかを確認して削除してください。

また、Bruce McGeeの言葉通りに:パラメータ付きのクエリを使用してください。私たちは、SQLインジェクション攻撃の影響を受けやすい別のアプリを必要としません。

+0

文字列を 'Trim()'するだけです。しかし、 'Text1'が本当に複数行の入力を許しているのであれば、' Text'の途中に改行があることもあります。最初の文字だけでは十分ではありません。代わりに 'StringReplace()'を使う必要があります。または、複数行入力コントロールを使用しないでください。 –

0

お試しQuery機能Parameters.ParamByName

その後、同じようstring値を割り当て、SQLクエリに名前:emailでパラメータを作成します。

Query1.SQL.Clear; 
Query1.SQL.Text('SELECT userid, userphoto, username From users where useremail = :email'); 
Query1.SQL.ParamByName('useremail').Value := 'THE TEXT'; 
関連する問題