MySql を使用した C# のプリペアド ステートメントの問題のトラブルシューティング
C# プログラムでプリペアド ステートメントを実装する際につまずきます。通常のステートメントに移行すると、コードはシームレスに動作するため、戸惑うことになります。この矛盾の背後にある潜在的な原因を調査してみましょう。
指定したコード スニペット内:
cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username='@val1' AND admin_password=PASSWORD('@val2')", MySqlConn.conn); //cmd.Prepare(); //cmd.Parameters.AddWithValue("@val1", tboxUserName.Text); //cmd.Parameters.AddWithValue("@val2", tboxPassword.Text); cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username='"+tboxUserName.Text+"' AND admin_password=PASSWORD('"+tboxPassword.Text+"')", MySqlConn.conn);
主な違いは、SQL クエリでの一重引用符 (' ') の使用にあります。プリペアド ステートメントはパラメーター プレースホルダー (@val1、@val2) を利用して SQL インジェクション攻撃を防ぎます。通常のステートメントを使用する場合は、クエリ自体内で一重引用符をエスケープする必要があります。
この問題を解決するには、次のようにコードを変更することを検討してください。
cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username=@val1 AND admin_password=PASSWORD(@val2)", MySqlConn.conn); cmd.Parameters.AddWithValue("@val1", tboxUserName.Text); cmd.Parameters.AddWithValue("@val2", tboxPassword.Text); cmd.Prepare();
から一重引用符 ' を削除します。クエリを実行し、パラメーターを追加した後に cmd.Prepare() を使用すると、準備されたステートメントが機能することを確認できます。このアプローチにより、コードが悪意のあるインジェクションから保護され、セキュリティが強化されます。
以上が通常のステートメントは機能するのに、MySQL での C# プリペアド ステートメントが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。