0

MySQL データベースの値を含むリストがあります。値はリストとともに転送されますが、変数を確認すると (デバッグ モードで)。「更新された」値ではなく、古い値だけが PHP ファイルに送信されていることがわかります。

ここで、「いいね」の古い値を取得します。

  protected String doInBackground(String... params) {

        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                // Check for success tag
                int success;
                try {
                    // Building Parameters
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("id", cid));

                    // getting product details by making HTTP request
                    // Note that product details url will use GET request
                    JSONObject json = jParser.makeHttpRequest(url_details, "GET", params);

                    // check your log for json response
                    Log.d("Details Song", json.toString());

                    // json success tag
                    success = json.getInt(TAG_SUCCESS);
                    if (success == 1) {
                        // successfully received product details
                        JSONArray chartsObj = json.getJSONArray(TAG_CHARTS); // JSON Array

                        // get first product object from JSON Array
                        JSONObject charts = chartsObj.getJSONObject(0);

                        // product with this id found
                        // Edit Text
                        txtInterpret = (TextView)findViewById(R.id.tblInterpret);
                        txtTitel = (TextView)findViewById(R.id.tblTitel);
                        txtAlbum = (TextView)findViewById(R.id.tblAlbum);
                        txtLikes = (TextView)findViewById(R.id.like);
                        thumb_image = (ImageView)findViewById(R.id.albumcover); 

                        imageLoader = new ImageLoader(getApplicationContext());
                        imageLoader.DisplayImage(charts.getString(TAG_ALBUMCOVER), thumb_image);
                        txtInterpret.setText(charts.getString(TAG_INTERPRET));
                        txtTitel.setText(charts.getString(TAG_TITEL));
                        txtAlbum.setText(charts.getString(TAG_ALBUM));
                        txtLikes.setText(Integer.toString(charts.getInt(TAG_LIKES)));
                        likes = charts.getInt(TAG_LIKES);

                    }else{
                        // product with id not found
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });

        return null;
    }

この関数は私の OnCreate 関数にあります。ボタンをクリックすると、int 値が 1 増加します。

        like.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                System.out.println("Vorher: " +likes);
                likes = (likes++);
                System.out.println("Nachher: " +likes);
                new Like().execute();
            }
        });

それが私のリストの機能です。

protected String doInBackground(String... args) {

         List<NameValuePair> params = new ArrayList<NameValuePair>();
         params.add(new BasicNameValuePair("id", cid));
         params.add(new BasicNameValuePair(TAG_LIKES, Integer.toString(likes)));

    // getting JSON Object
    // Note that create product url accepts POST method
         JSONObject json = jParser.makeHttpRequest(url_like,"POST", params);

    // check log cat for response
    Log.d("Create Response", json.toString());

    return null;
    }

これは私の JSONParser です:

if(method == "POST"){
            // request method is POST
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            json = EntityUtils.toString(httpEntity, HTTP.UTF_8);
            System.out.println("JSON: " + json);

そして最後に私のPHPファイル:

<?php

/*
 * Following code will update a product information
 * A product is identified by product id (pid)
 */

// array for JSON response
$response = array();

// check for required fields
if (isset($_POST['likes']) && isset($_POST['id'])) {

$id = $_POST['id'];
$likes = $_POST['likes'];

// include db connect class
require_once (connection);

// connecting to db
$db = new DB_CONNECT();

// mysql update row with matched pid
$result = mysql_query("UPDATE Charts SET likes = '$likes' WHERE id = '$id'");

// check if row inserted or not
if ($result) {
    // successfully updated
    $response["success"] = 1;
    $response["message"] = "Like erfolgreich";

    // echoing JSON response
    echo json_encode($response);
} else {

}
} else {
// required field is missing
$response["success"] = 0;
$response["message"] = "Ein Fehler ist aufgetreten";

// echoing JSON response
echo json_encode($response);
}
?>
4

2 に答える 2

1

SQL インジェクション攻撃に対して脆弱であり、JSON テキストにさらに 2 文字が含まれ'、SQL クエリが「壊れる」ことがほぼ確実です。本質的には、独自の SQL クエリを挿入しています。

また、クエリにはエラー処理がなく、成功したと想定しています。これは非常に悪いです。SQL 構文が 100% 完璧だったとしても、クエリがエラーのチェックに失敗するその他の理由が多すぎます。

最低限、あなたは持っているべきです

$safe_json = mysql_real_escape_string($_POST['likes']);
$sql = "UPDATE .... WHERE likes='$safe_json' ...";
$result = mysql_query($sql) or die(mysql_error());

また、一般的なヒントとして、これらのmysql_*()関数は PHP 5.4 で非推奨になりました。mysqli、またはできればPDOへの切り替えを検討する必要があります。

于 2012-07-22T15:22:01.990 に答える
1

まず第一に、 JSONParserの if 条件が実行されなかったので、

あなたのif条件は、

if(method.equals("POST"))

ではなく、

if(method == "POST")

二つ目、

また、runOnUiThreaddoInBackground() で使用する代わりに、UI 更新コードを AsyncTask のonPostExecute()メソッドに入れます。

于 2012-07-22T15:28:47.583 に答える