【问题标题】:Changing password of user - Update Database Table PHP/JAVA更改用户密码 - 更新数据库表 PHP/JAVA
【发布时间】:2015-08-10 19:54:52
【问题描述】:

我一直在尝试自己制作“更改密码”功能。这意味着当用户想要更改他的密码时,会弹出一个对话框并显示三个字段:旧密码、新密码和确认新密码。旧密码使用SharedPreferences 处理。

public void invokeChangePass 工作。所以你不必看那个。

问题出在php文件和private void updateDataBase 不会改变数据库中用户的密码。

除了 php 文件和 updateDatabase 函数之外的所有东西都可以正常工作,所以不用担心。

实用说明:

  • 我知道它容易受到 mysql 注入的影响。目前不是我的首要任务。
  • EmailKeyPassKey 在用户登录时在SharedPreferences 中生成。
  • 应该在数据库中找到EmailKey,以便更改该用户的密码。
  • 这是不久前我做的,所以它可能有愚蠢的错误或我刚刚忘记添加的东西。

非常感谢。

JAVA 文件:

 public class ChangePassDialog extends Activity {

    private EditText setOldPass;

    private EditText setNewPass;

    private EditText setNewPass2;

    public static final String MyPREFERENCES = "MyPrefs";
    SharedPreferences sharedpreferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_changepass);

        setOldPass = (EditText) findViewById(R.id.setOldPass);
        setNewPass = (EditText) findViewById(R.id.setNewPass);
        setNewPass2 = (EditText) findViewById(R.id.setNewPass2);

    }

    public void invokeChangePass(View view) {
        String oldpass = setOldPass.getText().toString();
        String pass = setNewPass.getText().toString();
        String pass2 = setNewPass2.getText().toString();

        sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
        String passKey = sharedpreferences.getString("passKey", "DEFAULT");
        String name = sharedpreferences.getString("emailKey", "DEFAULT");
//        onPreExecute();

        if (oldpass.equals(passKey) && pass.length() >= 6 && pass.length() <= 30 && (pass2.length() >= 0 && (pass.equals(pass2)) && (!pass.equals(pass.toLowerCase()) &&
                !pass.equals(pass.toUpperCase()) &&
                pass.matches(".*\\d+.*")))) {
            updateDatabase(pass, name);
            setNewPass2.requestFocus();
            setNewPass2.setError("TEST WORKING.");
        } else {
            errorTest(oldpass, pass, pass2);

        }
    }

    private void updateDatabase(String pass, String name) {
        class SendPostReqAsyncTask extends AsyncTask<String, Void, String> {
            @Override
            protected String doInBackground(String... params) {
                String name = params[0];
                String pass = params[1];
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("pass", pass));
                nameValuePairs.add(new BasicNameValuePair("name", name));
                try {
                    HttpClient httpClient = new DefaultHttpClient();
                    HttpPost httpPost = new HttpPost("http://calisapp.esy.es/changepass.php");
                    httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                    HttpResponse response = httpClient.execute(httpPost);
                    InputStream entity = response.getEntity().getContent();
                    InputStreamReader inputStream = new InputStreamReader(entity);
                    BufferedReader bufferedReader = new BufferedReader(inputStream);
                    StringBuilder stringBuilder = new StringBuilder();
                    String bufferedStrChunk = null;
                    while ((bufferedStrChunk = bufferedReader.readLine()) != null) {
                        stringBuilder.append(bufferedStrChunk);
                    }
                    return stringBuilder.toString();
                } catch (ClientProtocolException e) {
                } catch (IOException e) {
                }
                return "";
            }
            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
                String s = result.trim();

                if(s.equalsIgnoreCase("success")){
                        Intent intent = new Intent(ChangePassDialog.this, Settings.class);
                        startActivity(intent);
                        Toast.makeText(ChangePassDialog.this, "Registered successfully", Toast.LENGTH_LONG).show();
                        finish();
                    }


                        //                loadingDialog.dismiss();

            }
            }
        SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask();
        sendPostReqAsyncTask.execute(name,pass);
        }

PHP 文件:

<?php
define('HOST','X');
define('USER','X');
define('PASS','X');
define('DB','X');

$con = mysqli_connect(HOST,USER,PASS,DB);

$name = $_POST['name'];
$pass = $_POST['pass'];


 $sql = "UPDATE tbl_user SET password='$pass' WHERE username = '$name'";
  if(mysqli_query($con,$sql)){
       echo 'success';
  }

mysqli_close($con);
?>

【问题讨论】:

  • 您将如何阻止随机连接到此服务的人将人们的密码更改为他们选择的密码?他们需要做的就是知道某人的用户名。
  • 另外,您以纯文本形式存储密码 - 最好不要这样做。使用强哈希算法。
  • Logcat 不显示错误?服务器端的错误日志?尝试error_log($name)error_log($pass) 并检查错误日志。看看帖子能不能通过。并在您的 java httpPost.addHeader("Content-Type","application/x-www-form-urlencoded"); 中设置内容类型
  • 连接到?您必须在应用程序上登录并知道您当前的密码吗?为了存储密码,我稍后会做安全性。一步一步来。第一种至少想要这个工作。
  • 哦!感谢您的提醒!稍后我会调查的!

标签: java php android sql-update


【解决方案1】:

首先。我认为为此使用AsyncTask 不是一个好主意,因为它可能会导致一些问题。这是讨论here

但是,这不是你的首要任务,也不是你的问题,所以让我们相处吧。

改变这个

httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

为此

httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8"));

然后改变这个

InputStreamReader inputStream = new InputStreamReader(entity);
BufferedReader bufferedReader = new BufferedReader(inputStream);
StringBuilder stringBuilder = new StringBuilder();
String bufferedStrChunk = null;
while ((bufferedStrChunk = bufferedReader.readLine()) != null) {
    stringBuilder.append(bufferedStrChunk);
}
return stringBuilder.toString();

到这里

HttpResponse response = httpClient.execute(httpPost);
String resp = EntityUtils.toString(response.getEntity(),"UTF-8");

return resp;

并尝试将您的 php 文件更改为此

<?php
    define('HOST','X');
    define('USER','X');
    define('PASS','X');
    define('DB','X');

    $name = $_POST['name'];
    $pass = $_POST['pass'];

    if (isset($name) && isset($pass)) {
        $mysqli = new mysqli(HOST,USER,PASS,DB);

        if ($mysqli->connect_error) {
            die('Error while connecting to database!');
        }

        $sql = "UPDATE tbl_user SET password='" .$pass ."' WHERE username ='" . $name . "'";

        $res = $mysqli->query($sql);

        if ($res) {
            echo "success";
        }

        $mysqli->close();
    }
?>

【讨论】:

  • 这有什么变化?使用了您的代码更改,但它完全相同。无论如何,忘了提,当我点击提交密码更改按钮时,它一直到“注册成功”。让我觉得php文件有问题?
  • 我已经简化了代码。估计问题根本不存在。那么,如果您尝试将该查询直接运行到您的数据库会发生什么?
  • 哦,谢谢!我想我找到了问题所在。我将 emailKey 传递给函数(..Database)并将其引用为“名称”。现在测试一下,我会告诉你的
  • 现在,随着您的 php 更改,它根本不会“成功注册”。我迷路了。
  • @Calis:另外,您可以在 Android/模拟器之外测试您的 API。在命令行使用 curl 或类似的。
猜你喜欢
  • 2022-01-14
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多