Android ช่วยด้วยครับ ทำ Login จากที่ศึกษา Android Edit/Update Data to Web Server Database (Web Server) แต่ทำไมมันส่งค่าสลับกัน
ผมศึกษาการทำ Android จากเว็บนี้ บอกได้เต็มปากว่าสุดยอดที่สุด เวิร์กที่สุดเท่าที่ดูจากหลายๆเว็บครับ เมื่อศึกษาแล้วก็เลยอยากต่อยอด แต่ก็เกิดปัญหาครับ ปัญหาคือ ถ้ากรอกข้อมูลถูกต้อง มันจะโชว์ไดอะลอก ว่า "คุณป้อนข้อมูลผิดพลาด" แล้วก็ไปหน้า Main
แต่ถ้ากรอกข้อมูลผิดๆ มันจะโชว์ "ยินดีต้อรับเข้าสู่ระบบ แล้วก็ไปหน้า Main เหมือนกันครับ ช่วยด้วยครับ
คือ มันจะโชว์ผลลัพท์สลับกัน และไม่ว่า ผิดหรือถูกก็ไปหน้า Main ก็เลยงง สงสัยว่าผิดตรงไหนอย่างไรครับ ขอบคุณครับ
ไฟล์ userLogin.php
Code (PHP)
<?
$objConnect = mysql_connect("localhost","apivatcom_ad","android");
$objDB = mysql_select_db("apivatcom_mydb");
/*** ตัวอย่างข้อมูลที่รับมา......เมื่อมีการกรอกข้อมูลมาจากฝั่ง android
$_POST["sUsername"] = "a";
$_POST["sPassword"] = "b";
*/
/*** รับค่าที่ส่งมาเก็บไว้ในตัวแปร ***/
$strUsername = $_POST["sUsername"];
$strPassword = $_POST["sPassword"];
/*** ตรวจสอบว่า Username กับ Password ตรงกันหรือเปล่า ***/
$strSQL = "SELECT * FROM member WHERE Username = '".$strUsername."' and Password = '".$strPassword."' ";
$objQuery = mysql_query($strSQL);
$objResult = mysql_fetch_array($objQuery);
if($objResult)
{
$arr['StatusID'] = "0";
$arr['Error'] = "คุณพิมพ์ชื่อ หรือ รหัสผ่านผิด!";
echo json_encode($arr);
exit();
}
$objQuery = mysql_query($strSQL);
if(!$objQuery)
{
$arr['StatusID'] = "0";
$arr['Error'] = "ไม่สามารถเข้าสู่ระบบได้!";
}
else
{
$arr['StatusID'] = "1";
$arr['Error'] = "";
}
/**
$arr['StatusID'] // (0=Failed , 1=Complete)
$arr['Error'] // Error Message
*/
mysql_close($objConnect);
echo json_encode($arr);
?>
อันนี้ส่วน Android
Code (Android-Java)
final Button btnSave = (Button) findViewById(R.id.btnSave);
btnSave.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(Login())
{
Intent i = new Intent(LoginActivity.this,MainActivity.class);
startActivity(i);
}
}
});
// ปุ่มลงทะเบียน ให้ไปที่ AddDataActivity
final Button btnAddNew = (Button) findViewById(R.id.btnNext);
btnAddNew.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent i = new Intent(LoginActivity.this,AddDataActivity.class);
startActivity(i);
}
});
}
public boolean Login()
{
// Matching
final EditText txtUsername = (EditText)findViewById(R.id.txtUsername);
final EditText txtPassword = (EditText)findViewById(R.id.txtPassword);
// แสดง Dialog
final AlertDialog.Builder ad = new AlertDialog.Builder(this);
ad.setTitle("ผิดพลาด! ");
ad.setIcon(android.R.drawable.btn_star_big_on);
ad.setPositiveButton("Close", null);
//ตรวจสอบ Username
if(txtUsername.getText().length() == 0)
{
ad.setMessage("กรุณาพิมพ์ ชื่อผู้ใช้ ");
ad.show();
txtUsername.requestFocus();
return false;
}
// ตรวจสอบ Password
if(txtPassword.getText().length() == 0 )
{
ad.setMessage("กรุณาพิมพ์ รหัสผ่าน ");
ad.show();
txtPassword.requestFocus();
return false;
}
///// ติดต่อไปที่ไฟล์ userLogin.php ใน server เพื่อทำการเข้าสู่ระบบ/////////////////////////
String url = "http://www.apivat.com/android/userLogin.php";
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("sUsername", txtUsername.getText().toString()));
params.add(new BasicNameValuePair("sPassword", txtPassword.getText().toString()));
String resultServer = getHttpPost(url,params);
/*** Default Value ***/
String strStatusID = "0";
String strError = "คุณป้อนข้อมูลผิดพลาด";
try {
JSONObject c = new JSONObject(resultServer);
strStatusID = c.getString("StatusID");
strError = c.getString("Error");
} catch (JSONException e) {
e.printStackTrace();
}
if(strStatusID.equals("0"))
{
ad.setMessage(strError);
ad.show();
}
else
{
Toast.makeText(LoginActivity.this, "ยินดีต้อรับเข้าสู่ระบบ", Toast.LENGTH_SHORT).show();
txtUsername.setText("");
txtPassword.setText("");
}
return true;
}
Tag : Mobile
Date :
2013-05-04 16:20:51
By :
apivat
View :
1506
Reply :
9
จัดไปครับ
Date :
2013-05-04 21:04:58
By :
mr.win
จากกระทู้ https://www.thaicreate.com/mobile/android-check-login-user-password.html
ผมถามอีกหน่อยครับ ถ้าสมาชิก Login เข้ามาแล้ว ก็ไปที่หน้า DetailActivity ผมก็เลยทำปุ่ม Intent ไปหน้าทำข้อสอบ ซึ่งใช้ SQLite
เมื่อทำข้อสอบเสร็จ ได้คะแนนเรียบร้อย เอาผลการสอบไปแสดงใน TextView ได้ถูกต้อง
Bundle b = getIntent().getExtras();
int score= b.getInt("score");
txtScore = Integer.toString(score);
คำถามก็คือ ผมต้องการเอาคะแนนนี้ไปบันทึกลงในฐานข้อมูล mysql ด้วย ในตาราง member
โดยในตารางเดิมมีฟิลด์ Username Password Name Email Tel ผมเลยเพิ่มอีก 1 ฟิลด์คือ scroe
ผมไม่เข้าใจวิธีการครับ จะต้องเขียนโค๊ดยังไงครับว่าคนที่ Login และสอบตอนนี้ คะแนนจะไปบันทึกในช่อง Score ในเรคอร์ดเขา
ผมยังไม่ค่อยเข้าใจเรื่องการส่งค่า รับค่าเท่าไรครับ
เข้าใจว่าต้องมีไฟล์ php สำหรับรับค่าไป Update ในช่อง Score ใช่ไหมครับ ช่วยอนุเคราะห์ตัวอย่างให้ด้วยครับ
และทางฝั่ง Addroid ละครับจะเขียนยังไง
ขอบคุณท่านมากๆ ครับ
Date :
2013-05-04 21:48:55
By :
apivat
เข้าไปอ่านบทความ HttpPost ครับ
Date :
2013-05-04 23:24:59
By :
mr.win
ขอบคุณครับ ได้เข้าไปอ่านบทความ HttpPost ผมลองทำ ตามตัวอย่างได้ผลสำเร็จเหมือนตัวอย่างเลยครับ
ทีนี้ผมทดสอบทำไฟล์ php แต่รันผ่านเว็บให้ไปบันทึกคะแนนในฟิลด์ Score นั้นก็ทำได้สำเร็จแล้วครับ
ทีนี้ทางฝั่ง Addroid (ผมเข้าใจแบบนี้ถูกไหมครับ) ว่าเมื่อ Login เข้าระบบแล้ว เวลา Intent ไปหน้า Activity ถัดไป
ก็ส่งค่าตัวแปร ID ของผู้ที่ลอกอินขณะนี้คือ MemberID ไป ตามโค๊ดนี้
newActivity.putExtra("MemberID", strMemberID);
สมมุติว่าผมส่งค่านี้ไปที่หน้า QuizActivity แล้วทีนี้ผมจะต้องทำการเขียนรับค่า MemberID คนนี้ด้วยใช่ไหมครับ ?
ตรงนี้แหละที่ผมไม่ทราบว่าเขียนอย่างไร หรือมีวิธีการอย่างไร
และจาก QuizActivity ผมส่งค่าไปประมวลผลคะแนนไปที่ ResultActivity เพื่อจะส่งค่าไปบันทึกใน Mysql อีกที
สิ่งที่ต้องการความช่วยเหลือก็คือ ผมจะเขียนการรับค่าและส่งค่า MemberID อย่างไรครับ
ขอความอนุเคราะห์โค๊ดตัวอย่างด้วยนะครับ
Date :
2013-05-05 09:00:50
By :
apivat
Code (Java)
// หน้าส่ง
Intent i = new Intent(LoginActivity.this, QuizActivity.class);
i.putExtra("MemberID", "std0011");
startActivity(i);
// หน้ารับ ใน onCreate
Bundle extras = getIntent().getExtras();
String memberID = extras.getString("MemberID");
Date :
2013-05-05 09:26:24
By :
คนงานตัดอ้อย
ขอบคุณครับ ยังไม่เลยสำเร็จครับ ช่วยตรวจสอบโค๊ดให้หน่อยครับ มันขึ้น unfortunately, http has stopped
การ Intent ในหน้า Login: ส่งไปที่ DetailActivity (ทำตามตัวอย่างในเว็บทุกอย่าง ในหน้านี้แสดงข้อมูลได้ถูกต้อง)
Code
Intent newActivity = new Intent(LoginActivity.this,DetailActivity.class);
newActivity.putExtra("MemberID", strMemberID);
startActivity(newActivity);
จากนั้น การ Intent ในหน้า DetailActivity: ส่งไปที่QuizlActivity (ทำตามตัวอย่างที่ท่านแนะนำ)
Code
// หน้ารับ ใน onCreate
Bundle extras = getIntent().getExtras();
String memberID = extras.getString("MemberID");
// หน้าส่ง
Intent i = new Intent(DetailActivity.this, QuizActivity.class);
i.putExtra("MemberID", "MemberID");
startActivity(i);
จากนั้น การ Intent ในหน้า QuizActivity: ส่งไปที่ ResultActivity ซึ่งแสดงคะแนนได้ถูกต้อง แต่เมื่อกดตกลง ก็จะ error เลยครับ
อันนี้คือหน้า Result ครับ
Code
//รับค่า MemberID
Bundle extras = getIntent().getExtras();
String strMemberID = extras.getString("MemberID");
AlertDialog.Builder popDialog = new AlertDialog.Builder(this);
popDialog.setIcon(android.R.drawable.btn_star_big_on);
popDialog.setTitle("สรุปผลการทำแบบทดสอบ");
popDialog .setMessage("คุณทำได้ " + txtScore+" คะแนน");
// Button OK
popDialog.setPositiveButton("ตกลง",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String url = "http://www.apivat.com/android/saveScore.php";
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("sMemberID", "MemberID"));
params.add(new BasicNameValuePair("sScore", txtScore));
String resultServer = getHttpPost(url,params);
/*** Default Value ***/
String strStatusID = "0";
String strMemberID = "0";
String strScore = "0";
String strError = "Unknow Status!";
try {
JSONObject c = new JSONObject(resultServer);
strStatusID = c.getString("StatusID");
strMemberID = c.getString("MemberID");
strScore = c.getString("Score");
strError = c.getString("Error");
} catch (JSONException e) {
e.printStackTrace();
}
Intent i = new Intent(getApplicationContext(),
ResultActivity.class);
startActivity(i);
}
})
// Button Cancel
.setNegativeButton("กลับเมนูหลัก",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//dialog.cancel();
startActivity(new Intent(ResultActivity.this,MainActivity.class));
}
});
popDialog.create();
popDialog.show();
}
/////////////////////////////////////
public String getHttpPost(String url,List<NameValuePair> params) {
StringBuilder str = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
try {
httpPost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse response = client.execute(httpPost);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) { // Status OK
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
str.append(line);
}
} else {
Log.e("Log", "Failed to download result..");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return str.toString();
}
/////////////////////////
และส่วนที่เป็นไฟล์ saveScore.php ครับ
Code
<?
$objConnect = mysql_connect("localhost","apivatcom_ad","android");
$objDB = mysql_select_db("apivatcom_mydb");
// $_POST["sMemberID"] = "1"; // for Sample
$strMemberID = $_POST["sMemberID"];
$strScore = $_POST["sScore"];
$strSQL = "UPDATE member SET Score='$strScore' where MemberID ='$strMemberID' ";
$objQuery = mysql_query($strSQL);
if(!$objQuery)
{
$arr['StatusID'] = "0";
$arr['Error'] = "No No Oh!";
}
else
{
$arr['StatusID'] = "1";
$arr['Error'] = "";
}
/**
$arr['StatusID'] // (0=Failed , 1=Complete)
$arr['Error'] // Error Message
*/
mysql_close($objConnect);
echo json_encode($arr);
?>
Date :
2013-05-05 10:24:39
By :
apivat
ได้แล้วคร๊าบบบบบ มาขอบคุณอีกครั้งครับ ผมเพิ่ม final เข้าไป...ข้างหน้า
final String MemberID = extras.getString("MemberID");
สำเร็จแล้วครับ ขอบพระคุณ Admin เป็นอย่างสูงที่ช่วยเหลือจนสำเร็จครับผม
Date :
2013-05-05 12:37:19
By :
apivat
ที่คุณถาม ๆ มา มันมีในตัวอย่างหมดแล้วครับ
Date :
2013-05-05 12:47:47
By :
mr.win
Load balance : Server 01