[html]

 
1
2
3
4
5
6
7
8
9
10
11
<div class="image">
    <div class="image_title">
        이미지 첨부(최대 10개)
    </div>
    <div class="image_swiper">
        <div class="image_div_0">
            <label for ="image_plus_0"></label>
            <input type="file" id="image_plus_0">
        </div>
    </div>
</div>
 
적당한 + 이미지가 없어서 달력 이미지로 버튼 구현

 

[script]

 

index 는 전역변수.. 파일 첨부에 고유 번호 부여 하기 위해 필요

 

//중요//

보통 아래와 같은 형식으로 사용하는데

$(선택자).on('change/click 등', function(){

       함수 내용...

});

 

html이 처음 생성될때 기존에 있는 폼들만 이벤트 바인딩을 하고 동적으로 생성된 폼들은 이벤트 바인딩이 되어있지 않다. 그래서 위와 같이 작성하면 동적으로 생성된 기능들은 실행되지 않는다. 이에 대한 해결 방법으로는 다음과 같다.

$(document).on("change/click", '선택', function(event)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//버튼 DIV 변수
    var index = 0;
 
    //이미지 추가 버튼 클릭시
    $(document).on("change"'.at_2 input[type=file]'function(event) {
 
        var target = $(this)[0];
        
 
        if(target != null){
            //------------------이미지 확장자 검사 시작--------------------------------//
            var fileNM = $(this).val();
 
            var ext = fileNM.slice(fileNM.lastIndexOf("."+ 1).toLowerCase();
 
            if (!(ext == "gif" || ext == "jpg" || ext == "png")) {
                alert("이미지파일 (.jpg, .png, .gif ) 만 업로드 가능합니다.");
                return false;
            }
            //------------------이미지 확장자 검사 종료--------------------------------//
            // 상위 요소
            var img_div = $(this).parent();
 
            var fileList = target.files ;
        
            // 파일리더기 생성
            var reader = new FileReader();
            
            // 파일 위치 읽기
            reader.readAsDataURL(fileList [0]);
            
            //로드 한 후 이미지 요소 설정(스타일,url)
            reader.onload = function  (e) {
 
                // 이미지 미리보기
                img_div.children('label').css('background','url('+ e.target.result +') center no-repeat').css('background-size','105px 105px');
                
            };
 
            // 이미지 파일 첨부 버튼 추가 하기
            // 새로운 div 생성
            var div = document.createElement('div');
 
            index++;
 
            // 새로운 div의 className 지정
            div.className = 'image_div_'+index+'';
 
            div.innerHTML = '<label for ="image_plus_'+index+'"></label>\<input type="file" id="image_plus_'+index+'">';
            
            // 추가
            $('.image_swiper').append(div);
 
            
            // 테스트
            //alert($(this).parent().attr('class'));
            //alert(index);
            //$(this).parent().attr('class')
        }else{
            alert("이미지 없음");
        }
    });
 
 

[css]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.image_swiper div{
  display: inline-block;
  width: 105px;
  height: 105px;
  z-index: 1;
}
.image_swiper div input[type=file]{
  display: none;
}
.image_swiper div label{
  display: inline-block;
  width: 105px;
  height: 105px;
  background: url("../images/icon/calendar_1.png") #9fd1ff no-repeat center;
  z-index: 0;
}
//주석/ 버튼 클릭시 배경 색상 
.image_swiper div label:hover{
  background: url("../images/icon/calendar_1.png") #0084ff no-repeat center;
}
 
 

html 화면
크롬 검사 화면(html화면에서 마우스 우클릭 -> 검)

1. 웹뷰 란?

웹페이지를 안드로이드 어플리케이션 화면 상에 보여주는 컴포넌트 입니다. 여기에 플레이 스토어에 출시하기 위한 네이티브 기능들을 덧붙이면 하이브리드 앱이 됩니다.

 

웹뷰의 장점은 웹에서 작성한 코드를 어플리케이션으로 다시 작성 할 필요가 없다는 점입니다.


2. 웹뷰 사용하기

AndroidManifest.xml 에서 인터넷 접속 권한을 허용하는 아래와 같은 코드 추가

1
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
 

activity_main.xml 에서 웹뷰 레이아웃 생성

1
2
3
4
5
6
<WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webView"
        >
</WebView>
 

 

styles.xml 에서 타이틀바 비활성화

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<resources>
 
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
 
        <!--No Title Bar-->
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
 
    </style>
 
</resources>
 
 

 

 

MainActivity.java 전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com.example.mywebview;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
 
public class MainActivity extends AppCompatActivity {
 
    private WebView mWebView;
    private WebSettings mWebSettings;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // 웹뷰 셋팅
        mWebView = (WebView) findViewById(R.id.webView);                //xml 자바코드 연결
 
        mWebSettings = mWebView.getSettings();
        mWebSettings.setJavaScriptEnabled(true);
        mWebSettings.setSupportMultipleWindows(false);                  //새창 띄우기 허용 여부
        mWebSettings.setJavaScriptCanOpenWindowsAutomatically(false);   //자바스크립트 새창(멀티뷰) 띄우기 허용 여부
        mWebSettings.setUseWideViewPort(true);                          //화면 사이즈 맞추기 허용 여부
        mWebSettings.setSupportZoom(false);                             //화면 줌 허용 여부
        mWebSettings.setBuiltInZoomControls(false);                     //화면 확대 축소 허용 여부
        mWebSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);     //컨텐츠 사이즈 맞추기
        mWebSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);           //브라우저 캐시 허용 여부
        mWebSettings.setDomStorageEnabled(true);                        //로컬저장소 허용 여부
        mWebSettings.setSaveFormData(true);                             //입력된 데이터 저장 허용 여부
 
        mWebView.loadUrl("http://192.168.0.2:80");                      //웹뷰 실행
        mWebView.setWebChromeClient(new WebChromeClient());             //웹뷰에 크롬 사용 허용//이 부분이 없으면 크롬에서 alert가 뜨지 않음
        mWebView.setWebViewClient(new WebViewClientClass());            //새창열기 없이 웹뷰 내에서 다시 열기//페이지 이동 원활히 하기위해 사용
    }
 
    //뒤로가기 버튼 이벤트
    //웹뷰에서 뒤로가기 버튼을 누르면 뒤로가짐
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
            mWebView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
 
    // 페이지 이동
    private class WebViewClientClass extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Log.d("check URL",url);
            view.loadUrl(url);
            return true;
        }
    }
}
 
 
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

실행화면

 

 

 

원본 글 https://code.tutsplus.com/ko/tutorials/android-from-scratch-using-rest-apis--cms-27117

 

안드로이드 처음부터 배우기: REST API 사용하기

인터넷은 우리 삶의 중요한 한 부분으로서 우리 중 대부분은 새로운 정보에 대한 탐욕적인 욕구를 발달시켜왔습니다. 우리의 주의 지속 시간도 그 어느 때보다도 짧아서 콘텐츠가 정적인 안드로이드 애플리케이션을 개발하는 것은 좋지 않은 생각일 수 있습니다. 대신 사용자가 열 때마다 새로운 내용을 표시할 수 있는 애플리케이션을 만드는 것을 고려해야 합니다....

code.tutsplus.com


1. 인터넷 접속 활성화

 

REST API를 사용하려면 당연히 인터넷을 이용할 수 있어야 합니다. 하지만 안드로이드 애플리케이션은 android.permission.INTERNET 권한이 있는 경우에만 인터넷에 접속할 수 있습니다. 따라서 네트워킹 코드 작성을 시작하기 전에 프로젝트의 매니페스트 파일에 다음과 같은 uses-permission 태그가 있는지 확인해야 합니다.

1
<uses-permission android:name="android.permission.INTERNET" />
 

android.permission.INTERNET은 위험한 권한으로 간주되지 않으므로 런타임 시 API 레벨 23 이상을 실행하는 기기를 대상으로는 요청할 필요가 없습니다.


2. 백그라운드 스레드 생성

안드로이드 플랫폼에서는 애플리케이션의 메인 스레드에서 네트워크 작업을 수행하는 것을 허용하지 않습니다. 따라서 모든 네트워킹 코드는 백그라운드 스레드에 속해야 합니다. 그러한 스레드를 만드는 가장 쉬운 방법은 AsyncTask 클래스의 execute() 메서드를 사용하는 것입니다. execute() 메서드는 유일한 인자로 Runnable 객체를 받습니다.

1
2
3
4
5
6
7
AsyncTask.execute(new Runnable() {
    @Override
    public void run() {
        // All your networking logic
        // should be here
    }
});
 
 

백그라운드 스레드에서 작업을 실행하는 것에 대해 자세히 알고 싶다면 '안드로이드 처음부터 배우기(Android From Scratch)' 시리즈의 백그라운드 작업에 대한 튜토리얼을 읽어보길 바랍니다.

 

Android From Scratch: Background Operations

Aside from the most basic of Android applications, everything you build will require at least some use of background threading to perform an operation. This is because Android has something known...

code.tutsplus.com


3. HTTP 연결 생성

URL 클래스의 openConnection() 메서드를 이용하면 어떤 REST 엔드포인트에 대한 연결도 빠르게 설정할 수 있습니다. 엔드포인트에 HTTP 또는 HTTPS를 통해 접속하는지 여부에 따라 openConnection()의 반환값을 HttpURLConnection이나 HttpsURLConnection 인스턴스로 형변환해야 합니다. HttpURLConnection HttpsURLConnection 모두 요청 헤더를 추가하거나 응답을 읽는 것과 같은 작업을 허용합니다.

 

다음 코드는 GitHub API의 루트 엔드포인트와의 연결을 설정하는 방법을 보여줍니다.

1
2
3
4
5
6
// Create URL
URL githubEndpoint = new URL("https://api.github.com/");
 
// Create connection
HttpsURLConnection myConnection =
        (HttpsURLConnection) githubEndpoint.openConnection();
 

참고로 HttpsURLConnection HttpURLConnection 클래스의 하위 클래스입니다.


4. 요청 헤더 추가

REST API를 제공하는 대부분의 웹 사이트에서는 앱을 고유하게 식별할 수 있기를 원합니다. 그러한 웹 사이트를 돕는 가장 쉬운 방법은 모든 요청에 고유한 User-Agent 헤더를 포함하는 것입니다.

요청에 User-Agent 헤더를 추가하려면 HttpURLConnection 객체의 setRequestProperty() 메서드를 사용해야 합니다. 예를 들어, User-Agent 헤더를 my-rest-app-v0.1로 설정하는 방법은 다음과 같습니다.

1
myConnection.setRequestProperty("User-Agent""my-rest-app-v0.1");
 

setRequestProperty() 메서드를 여러 번 호출해서 요청에 헤더를 여러 개 추가할 수 있습니다. 예를 들어, 다음 코드는 Accept 헤더와 사용자 정의 Contact-Me 헤더를 추가합니다.

1
2
3
4
myConnection.setRequestProperty("Accept"
        "application/vnd.github.v3+json");
myConnection.setRequestProperty("Contact-Me"
        "hathibelagal@example.com");
 

5. 응답 읽기

모든 요청 헤더를 전달하고 나면 HttpURLConnection 객체의 getResponseCode() 메서드를 이용해 유효한 응답이 있는지 확인할 수 있습니다.

1
2
3
4
5
6
if (myConnection.getResponseCode() == 200) {
    // Success
    // Further processing here
else {
    // Error handling code goes here
}
 
 

HttpURLConnection 클래스가 301과 같은 리디렉션 응답 코드를 받으면 이를 자동으로 처리하고 리디렉션을 따릅니다. 따라서 일반적으로 리디렉션을 확인하는 추가 코드를 작성할 필요는 없을 것입니다.

오류가 없는 경우 이제 getInputStream() 메서드를 호출해서 연결의 입력 스트림에 대한 참조를 가져올 수 있습니다.

1
InputStream responseBody = myConnection.getInputStream();
 

요즘 대부분의 REST API는 유효한 JSON 문서 형식의 데이터를 반환합니다. 따라서 InputStream 객체에서 직접 읽는 대신 InputStreamReader를 만들기를 제안합니다.

1
2
InputStreamReader responseBodyReader = 
        new InputStreamReader(responseBody, "UTF-8");
 

6. JSON 응답 파싱

안드로이드 SDK에는 JsonReader라는 클래스가 있어서 이 클래스로 JSON 문서를 손쉽게 파싱할 수 있습니다. JsonReader 클래스의 생성자에 InputStreamReader 객체를 전달해서 새 인스턴스를 만들 수 있습니다.

1
JsonReader jsonReader = new JsonReader(responseBodyReader);
 

JSON 문서에서 특정 정보를 추출하는 방법은 구조에 따라 다릅니다. 예를 들어, GitHub REST API의 루트 엔드포인트에서 반환된 JSON 문서는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
  "current_user_url""https://api.github.com/user",
  "current_user_authorizations_html_url""https://github.com/settings/connections/applications{/client_id}",
  "authorizations_url""https://api.github.com/authorizations",
  "code_search_url""https://api.github.com/search/code?q=1{&page,per_page,sort,order}",
  "emojis_url""https://api.github.com/emojis",
  "events_url""https://api.github.com/events",
  "feeds_url""https://api.github.com/feeds",
  "followers_url""https://api.github.com/user/followers",
  "following_url""https://api.github.com/user/following{/target}",
  "gists_url""https://api.github.com/gists{/gist_id}",
  "hub_url""https://api.github.com/hub",
  "issue_search_url""https://api.github.com/search/issues?q=1{&page,per_page,sort,order}",
  "issues_url""https://api.github.com/issues",
  "notifications_url""https://api.github.com/notifications",
  "organization_repositories_url""https://api.github.com/orgs/{org}/repos{?type,page,per_page,sort}",
  "organization_url""https://api.github.com/orgs/{org}",
  "public_gists_url""https://api.github.com/gists/public",
  "rate_limit_url""https://api.github.com/rate_limit",
  "repository_url""https://api.github.com/repos/{owner}/{repo}",
  "repository_search_url""https://api.github.com/search/repositories?q=1{&page,per_page,sort,order}",
  "current_user_repositories_url""https://api.github.com/user/repos{?type,page,per_page,sort}",
  "starred_url""https://api.github.com/user/starred{/owner}{/repo}",
  "starred_gists_url""https://api.github.com/gists/starred",
  "team_url""https://api.github.com/teams",
  "user_url""https://api.github.com/users/{user}",
  "user_organizations_url""https://api.github.com/user/orgs",
  "user_repositories_url""https://api.github.com/users/{user}/repos{?type,page,per_page,sort}",
  "user_search_url""https://api.github.com/search/users?q=1{&page,per_page,sort,order}"
}
 
 

보다시피 응답은 여러 키가 포함된 하나의 커다란 JSON 객체에 불과합니다. 여기서 organization_url이라는 키의 값을 추출하려면 다음과 같은 코드를 작성해야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
jsonReader.beginObject(); // Start processing the JSON object
while (jsonReader.hasNext()) { // Loop through all keys
    String key = jsonReader.nextName(); // Fetch the next key
    if (key.equals("organization_url")) { // Check if desired key
        // Fetch the value as a String
        String value = jsonReader.nextString();
         
        // Do something with the value
        // ...
                 
        break// Break out of the loop
    } else {
        jsonReader.skipValue(); // Skip values of other keys
    }
}
 
 

위 코드에서는 JSON 응답을 토큰 스트림으로 처리합니다. 따라서 메모리를 거의 소비하지 않습니다. 하지만 모든 토큰을 하나씩 처리해야 하기 때문에 큰 응답을 처리하는 동안 속도가 느려질 수 있습니다.

필요한 모든 정보를 추출하고 나면 JsonReader 객체의 close() 메서드를 호출해서 보유한 모든 리소스를 해제해야 합니다.

1
jsonReader.close();
 

또한 HttpURLConnection 객체의 disconnect() 메서드를 호출해서 연결을 닫아야 합니다.

1
myConnection.disconnect();
 

7. 다양한 HTTP 메서드 사용하기

HTTP 기반 REST 인터페이스는 HTTP 메서드를 사용해 자원을 대상으로 수행해야 하는 연산의 유형을 결정합니다. 이전 단계에서는 HTTP GET 메서드를 사용해 읽기 연산을 수행했습니다. HttpURLConnection 클래스는 기본적으로 GET 메서드를 사용하기 때문에 명시적으로 지정하지 않아도 됩니다.

HttpURLConnection 객체의 HTTP 메서드를 변경하려면 setRequestMethod() 메서드를 사용해야 합니다. 예를 들어, 다음 코드는 httpbin.org에 속한 엔드포인트에 대한 연결을 열고 HTTP 메서드를 POST로 설정합니다.

1
2
3
4
5
URL httpbinEndpoint = new URL("https://httpbin.org/post");
HttpsURLConnection myConnection
        = (HttpsURLConnection) httpbinEndpoint.openConnection();
 
myConnection.setRequestMethod("POST");
 

이미 알고 계실 수도 있겠지만 POST 요청은 서버에 데이터를 보내는 데 사용됩니다. 연결의 출력 스트림에 쓰는 식으로 POST 요청의 본문에 어떤 데이터도 손쉽게 추가할 수 있습니다. 그러나 그렇게 하기 전에 HttpURLConnection 객체의 setDoOutput() 메서드를 호출하고 true를 전달해야 합니다.

1
2
3
4
5
6
7
8
// Create the data
String myData = "message=Hello";
 
// Enable writing
myConnection.setDoOutput(true);
 
// Write the data
myConnection.getOutputStream().write(myData.getBytes());
 

8. 응답 캐싱하기

HTTP 응답을 캐싱하는 것은 언제나 좋은 생각입니다. 그렇게 함으로써 앱의 대역폭 소비를 줄일 수 있을뿐더러 응답 속도도 향상시킬 수 있습니다. API 레벨 13부터 안드로이드 SDK에서는 HttpResponseCache라는 클래스를 제공하므로 네트워킹 로직을 변경하지 않고도 손쉽게 캐싱을 구현할 수 있습니다.

애플리케이션에 캐시를 설치하려면 HttpResponseCache 클래스의 install() 메서드를 호출해야 합니다. 이 메서드는 캐시가 설치될 위치를 나타내는 절대 경로와 캐시의 크기를 나타내는 숫자를 인자로 받습니다. 수동으로 절대 경로를 지정하고 싶지 않다면 getCacheDir() 메서드를 이용하면 됩니다.

 

다음 코드는 크기가 100,000바이트인 캐시를 설치합니다.

 

1
2
HttpResponseCache myCache = HttpResponseCache.install(
                                getCacheDir(), 100000L);
 

캐시가 설치되면 HttpURLConnection 클래스가 캐시를 자동으로 사용하기 시작합니다. 캐시가 작동하는지 확인하려면 캐시에서 제공된 HTTP 응답의 개수를 반환하는 getHitCount() 메서드를 사용하면 됩니다. 

1
2
3
if (myCache.getHitCount() > 0) {
    // The cache is working
}
 
 

결론

안드로이드 앱에서 자유롭게 사용할 수 있는 REST API는 수천 개에 달합니다. 이러한 REST API를 이용하면 앱을 더욱 유익하고, 흥미롭고, 기능이 풍부하게 만들 수 있습니다. 이번 튜토리얼에서는 HttpURLConnection 클래스를 이용해 이러한 REST API를 사용하는 법을 배웠습니다. 또한 앱의 대역폭 사용량을 낮게 유지하는 HTTP 응답 캐시를 만드는 방법도 배웠습니다.

HttpURLConnection을 사용하는 것이 어렵다면 Volley와 같은 서드파티 라이브러리를 사용해 보십시오. 이 같은 라이브러리는 내부적으로 HttpURLConnection 클래스를 사용하지만 코드를 좀 더 간결하고 읽기 쉽게 만들 수 있는 편리한 메서드를 많이 제공합니다.

안드로이드 플랫폼의 네트워킹에 대한 자세한 내용은 안드로이드 네트워크 작업 가이드를 참고합니다.

 

로그인 후 '회원정보 수정'버튼 클릭

1
2
3
<a class="btn btn-outline-primary" href="/test/Board/write">글쓰기</a>
<a class="btn btn-outline-primary" href="/test/LogIn/logout">로그아웃</a>
<a class="btn btn-outline-primary" href="/test/UpdateAccount/InputPassword">회원정보 수정</a>
 

회원정보 수정을 하기위해 2차 본인 확인차 비번 입력 기능 추가

입력한 비번이 틀리면

입력한 비번이 맞으면 '회원 정보 수정' 페이지로 이동

[InputPassword.php]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
    session_start();    //session 가져오기
    //session에 데이터가 없다면 로그인 화면으로 GO
    if (!isset($_SESSION['userID'])) {
        header('Location : http://wamp서버ip주소:80/test/LogIn/login');
    }
?>
<!DOCTYPE html>
<html>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script src="/test/js/bootstrap.js"></script>
    <head>
        <meta charset = "utf=8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>본인 확인</title>
        <link rel ="stylesheet" href="/test/css/bootstrap.css">
        <link rel="stylesheet" href="/test/css/login.css">
        <link href="https://fonts.googleapis.com/css?family=Nanum+Brush+Script" rel="stylesheet">
    </head>
    <style>
    #check_password{
        font-size: 1.3em;
        width: 50%;
        display: inline-block;
    }
    </style>
    <script>
    $(document).ready(function(){
        $('#check_password').submit(function(e){
            e.preventDefault();
            if($('#PWD').val()==""){
                alert("비밀번호를 입력해 주세요.")
            }else{
                $.ajax({
                    type : 'POST',
                    url : 'http://wamp서버ip주소:80/test/UpdateAccount/CheckPassword',
                    data : $('#check_password').serialize(),
                    success : function(result){
                        if(result=="success"){
                            location.replace('http://wamp서버ip주소:80/test/UpdateAccount/update_account')
                        }else if(result=="Fail:Password"){
                            alert("해당 비밀번호가 틀렸습니다.");
                        }else if(result=="Fail:No Data"){
                            alert("비밀번호가 틀렸습니다. 다시 시도해 주세요.");
                        }
                    },
                    error : function(xtr,status,error){
                        alert(xtr +":"+status+":"+error);
                    }
                });
            }
        });
    });
    </script>
    <body>
        <div id="loginer">
            <form id = "check_password" method="POST">
                <fieldset>
                    <legend>Ckeck Your Password</legend>
                    PASSWORD : <input type="text" id ="PWD" name ="PWD" placeholder="Enter Your Password">
                    <br><br>
                    <input type="submit" value="본인 확인!">
                    <br>
                </fieldset>
            </form>
        </div>
    </body>
</html>
 
 

[CheckPassword.php]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
    include "../connect_db.php";
 
    session_start();    //session 가져오기
    //session에 데이터가 없다면 로그인 화면으로 GO
    if (!isset($_SESSION['userID'])) {
        header('Location : http://wamp서버ip주소:80/test/LogIn/login');
    }
    
    $pass = $_POST['PWD'];
 
    $id = $_SESSION['userID'];
    $name = $_SESSION['userNAME'];
 
    $sql = "SELECT userPWD FROM member WHERE userID ='$id' AND userPWD = '$pass'";
    $result = $db->query($sql);
 
    if($result->num_rows==1){
        $row=$result->fetch_array(MYSQLI_ASSOC);
        if($pass == $row['userPWD']){
            echo "success";
        }
    }else{
        echo "Fail:No Data";
    }
?>
 
 

비밀 번호 또는 전화 번호만 입력하면 입력하지 않은 정보를 입력하고 출력

비번과 전화번호를 둘다 입력 하고 변경 버튼을 누르면 성공 메시지 출력

smith@naver.com에서 smith111로

010-1111-1111에서 111-1111-1111로 바뀌었다.

[update_account.php]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
    session_start();    //session 가져오기
    //session에 데이터가 없다면 로그인 화면으로 GO
    if (!isset($_SESSION['userID'])) {
        header('Location : http://wamp서버ip주소:80/test/LogIn/login');
    }
?>
<!DOCTYPE html>
<html>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script src="/test/js/bootstrap.js"></script>
    <head>
        <meta charset = "utf=8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>회원 정보 수정</title>
        <link rel ="stylesheet" href="/test/css/bootstrap.css">
        <link rel="stylesheet" href="/test/css/login.css">
        <link href="https://fonts.googleapis.com/css?family=Nanum+Brush+Script" rel="stylesheet">
    </head>
    <style>
    #update_form{
        font-size: 1.3em;
        width: 50%;
        display: inline-block;
    }
    </style>
    <script>
    $(document).ready(function(){
        $('#update_form').submit(function(e){
            e.preventDefault();
            if($('#PWD').val()==""){
                alert("비밀번호를 입력해 주세요.");
            }else if($('#phone').val()==""){
                alert("전화번호를 입력해 주세요.");
            }else{
                $.ajax({
                    type : 'POST',
                    url : 'http://wamp서버ip주소:80/test/UpdateAccount/update',
                    data : $('#update_form').serialize(),
                    success : function(result){
                        if(result=="success"){
                            alert("성공적으로 변경하였습니다.");
                            location.replace('http://wamp서버ip주소:80/test/main')
                        }else if(result=="Fail:Save"){
                            alert("변경 실패 다시 시도해주세요.");
                        }
                    },
                    error : function(xtr,status,error){
                        alert(xtr +":"+status+":"+error);
                    }
                });
            }
        });
    });
    </script>
    <body>
        <div id="loginer">
            <form id = "update_form" method="POST">
                <fieldset>
                    <legend>회원 정보 수정</legend>
                    비밀번호 : <input type="text" id ="PWD" name ="PWD" placeholder="Enter Your Password">
                    <br><br>
                    전화번호 : <input type="text" id ="phone" name ="phone" placeholder="Enter Your phone">
                    <br><br>
                    <input type="submit" value="변경!">
                    <br>
                </fieldset>
            </form>
        </div>
    </body>
</html>
 
 

 

[update.php]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
    include "../connect_db.php";
 
    session_start();    //session 가져오기
    //session에 데이터가 없다면 로그인 화면으로 GO
    if (!isset($_SESSION['userID'])) {
        header('Location : http://wamp서버ip주소:80/test/LogIn/login');
    }
    
    $pwd = $_POST['PWD'];
    $phone = $_POST['phone'];
 
    $id = $_SESSION['userID'];
 
    $sql = "UPDATE member SET userPWD ='$pwd' , userPHONE ='$phone' WHERE userID='$id'";
 
    $result = $db->query($sql);
 
    if($result){
        echo "success";
    }else{
        echo "Fail:Save";
    }
?>
 
 

[웹 화면]

[find.html]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<!DOCTYPE html>
<html>
    <meta charset="utf-8" />
    <!-- jQuery 사용 명시 -->
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <head>
        <title>계정 찾기 페이지</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="/test/css/login.css">
        <link href="https://fonts.googleapis.com/css?family=Nanum+Brush+Script" rel="stylesheet">
    </head>
    <style>
    #id_form{
        font-size: 1.3em;
        width: 50%;
        display: inline-block;
    }
    #pwd_form{
        font-size: 1.3em;
        width: 50%;
        display: inline-block;
    }
    </style>
    <script>
        function mysubmit(index){
            
            <!--아이디 찾기-->
            if(index == 1){
 
                <!--이름을 입력하지 않았다면-->
                if($('#name').val()==""){
 
                    alert("이름을 입력하세요.");
 
                <!--전화번호를 입력하지 않았다면-->
                }else if($('#phone1').val()==""){
 
                    alert("전화번호를 입력하세요.");
                }
 
                <!--서버로 폼 데이터 보내기-->>
                $('#id_form').submit();
 
            <!--비번 찾기-->
            }else if(index ==2){
 
                if($('#id').val()==""){
 
                    alert("아이디를 입력하세요.");
 
                }else if($('#phone2').val()==""){
 
                    alert("전화번호를 입력하세요.");
                }
 
                $('#pwd_form').submit(); 
 
            }
        }
    </script>
    <body>
        <div id="loginer">
            <form id = "id_form" action="/test/FindAccount/FindLook" method="POST">
                <fieldset>
                    <legend>Find Your ID</legend>
                    이름 : <input type="text" id ="name" name ="data" placeholder="Enter Your Name">
                    <br>
                    전화번호: <input type="text" id ="phone1" name ="phone" placeholder="Enter Your phone">
                    <br><br>
                    <input type="hidden" value="0" name = "check"><!--서버에서 아이디 찾기인지 비번찾기 인지 구별하기 위한 속성-->
                    <input type="button" value="아이디 찾기!" onclick="mysubmit(1)">
                    <br>
                </fieldset>
            </form>
            <form id = "pwd_form" action="/test/FindAccount/FindLook" method="POST">
                <fieldset>
                    <legend>Find Your Password</legend>
                    아이디 : <input type="text" id ="id" name ="data" placeholder="Enter Your ID">
                    <br>
                    전화번호: <input type="text" id ="phone2"  name ="phone" placeholder="Enter Your phone">
                    <br><br>
                    <input type="hidden" value="1" name = "check">
                    <input type="button" value="비밀번호 찾기!" onclick="mysubmit(2)">
                    <br>
                </fieldset>
            </form>
        </div>
    </body>
</html>
 
 

 

[FindLook.php]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
    include "../connect_db.php";
 
    // find.html에서 넘어온 데이터 받기
    $value=$_POST['data'];
    $phone=$_POST['phone'];
    $i=$_POST['check'];
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>계정 찾기</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel ="stylesheet" href="/test/css/bootstrap.css">
        <link href="https://fonts.googleapis.com/css?family=Nanum+Brush+Script" rel="stylesheet">
    </head>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script src="/test/js/bootstrap.js"></script>
    <body>
        <?php
            // 아이디 찾기
            if($i == 0){
                $sql = "select userID from member where userNAME ='$value' and userPHONE = '$phone'";
                $result = $db->query($sql);
 
                if($result->num_rows==1){
                    $row=$result->fetch_array(MYSQLI_ASSOC);
                    echo "찾고자 하는 아이디는...",$row['userID'],"입니다.";
                }else{
                    echo "이름 또는 전화번호를 잘못 입력하였습니다.";
                }
            // 비밀번호 찾기
            }else if($i == 1){
                $sql = "select userPWD from member where userID ='$value' and userPHONE = '$phone'";
                $result = $db->query($sql);
 
                if($result->num_rows==1){
                    $row=$result->fetch_array(MYSQLI_ASSOC);
                    echo "찾고자 하는 비밀번호는...",$row['userPWD'],"입니다.";
                }else{
                    echo "아이디 또는 전화번호를 잘못 입력하였습니다.";
                }
            }
        ?>
    </body>
</html>
 

실행화면

 

DB에 없는 값을 주었으면 당연히 rowcount는 0으로 나와야 정상인데...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def test():
    value = request.form['SensorID']
    esn_sql = "SELECT esnData FROM ESensorTable WHERE esnSensorId ='"+value+"'"
    curs.execute(esn_sql)               # 쿼리문 실행
 
    row_result = curs.rowcount          # 쿼리 실행후 가져운 값의 수(가져온 수가 0이라면 SensorID가 없다는 의미)
    
    if row_result == 0:
        return json.dumps({"value":"Fail"})
    else:
        data_list = curs.fetchall()
        data= data_list[0]
        return json.dumps(data[0])
 
    curs.close()
 
 

row_result 의 값이 0이 아니라 -1로 나오길래 찾아보니 아래와 같은 설정을 해주어야 하나보다.

 

해결 방법

1
mysql.connector.connect(host="ip주소", user="사용자명",passwd="비번", db='db명', port=3309, buffered=True)
 

mysql.connector.connect 맨 뒤에 buffered=True 추가

 

설정하니 0으로 나온다.

+ Recent posts