로그인 체크함수다.

Web에서 로그인하는 경우와 안드로이드에서 로그인하는 경우 2가지를 모두 수용할 수 있게 작성했다.

안드로이드폰 직접 접속시에는 폰의 장치정보를 인식하므로 deviceID 정보를 식별자로 사용하여 Web 접속과 Mobile 접속을 구분 처리했다.


<?php
if(!isset($_SESSION)) {
    session_start();
}
if(isset($_POST['loginID']) && !empty($_POST['loginID']) && isset($_POST['loginPW']) && !empty($_POST['loginPW'])) {
    $loginID = trim($_POST['loginID']);
    $loginPW = trim($_POST['loginPW']);
    $deviceID = trim($_POST['deviceID']);

    $deviceID = $deviceID ? $deviceID : '';

    if(empty($deviceID)){
        require_once 'dbconnect.php'; // db접속
        require_once 'phpclass/loginClass.php';

        $c=new LoginClass();

        $row = $c->WebUserAuthCheck($loginID,$loginPW);
        if(is_array($row)) {
            if($row['code'] > 0) {
                $_SESSION['userID'] = $row['id'];
                $_SESSION['userPW'] = md5($loginPW);
                $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
                $_SESSION['ua'] = $_SERVER['HTTP_USER_AGENT'];

                echo("<meta http-equiv='Refresh' content='0; URL=list.php'>");
            } else {
                echo '권한 불가';
            }
        } else if($row == '0'){
            $msg ='정보가 올바르지 않습니다';
            echo "<script>alert('".$msg."');history.go(-1);</script>";
        } else {
            $msg ='정보가 올바르지 않습니다';
            echo "<script>alert('".$msg."');history.go(-1);</script>";
        }

    } else {
        require_once 'db.info.php';
        require_once 'phpclass/dbClass.php';
        $conn=new MySQLDbClass();
        $DB_CONNECT = $conn->isConnectDb($DB); // 안드로이드폰에서는 반드시 객체로 생성해야 정상접속
        require_once 'phpclass/loginClass.php';
        $c=new LoginClass();

        $result = $c->MobileUserAuthCheck($loginID,$loginPW,$deviceID);
        if($result > 0 ) {
            session_save_path('./_tmp/session');

            $_SESSION['userID'] = $loginID;
            $_SESSION['userPW'] = md5($loginPW);
            $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
            $_SESSION['ua'] = $_SERVER['HTTP_USER_AGENT'];
            echo 'Login Success';
        } else if($result == 0) {
            echo 'Login Fail';
        } else {
            echo 'Phone Dismatch';
        }
    }
   
} else {
    echo("<meta http-equiv='Refresh' content='0; URL=loginForm.php'>");
}
?>


728x90
블로그 이미지

Link2Me

,

안드로이드 소스에서 Deprecated 라고 나오는 걸 해결하기 위해 검색으로 찾은 결과를 적어둔다.


보통 deprecate 되어도 이전 코드를 지우는 건 아니기 때문에, 전처럼 동작하기는 할 것이다.

향후, 유지보수단계에서 deprecate 코드에 대해서 안정성을 보장하지 않는다는 얘기이기 때문에, 안드로이드 차기 버전 에서는 비정상 동작을 할 가능성이 높아진다.

대체코드를 찾아서 새롭게 구현하는게 현명한 판단이다.


메모리 누수를 일으키는 현상에 대한 정리가 잘된 자료이다.

http://sjava.net/2016/05/%EB%B2%88%EC%97%AD-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1%EC%9D%B4-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98leak%EB%A5%BC-%EB%A7%8C%EB%93%9C%EB%8A%94-8%EA%B0%80%EC%A7%80/


depricated 로 나온 걸 하나 하나 해결하기 위해 찾은 걸 적어나갈 것이다.


URLDecoder.decode(getIntent().getExtras().getString("url"), "UTF-8");

getSettings().setUserAgent(0);  => getSettings().setUserAgentString("Android");

URLEncoder.encode("","UTF-8")


Implicitly using the default locale is a common source of bugs: Use toUpperCase(Locale) instead    NetworkCheck.java
url = url.toLowerCase();  ==> url = url.toLowerCase(Locale.getDefault());

// http://beginnersbook.com/2013/12/java-string-tolowercase-method-example/


The method decode(String) from the type URLDecoder is deprecated

URLEncoder.encode(String s, String enc);
import java.net.URLEncoder;
URLEncoder.encode("This text must be encoded!", "UTF-8");



AlertDialog: BUTTON_POSITIVE, BUTTON_NEUTRAL and BUTTON_NEGATIVE.


AlertDialog alertDialog = new AlertDialog.Builder(activity).create();
       alertDialog.setTitle("  [ 알림 ]");
       alertDialog.setMessage("등록된 휴대폰 번호가 없습니다.");
       alertDialog.setButton("확인", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int which) {
           }
       });

AlertDialog.Builder alertDialog = new AlertDialog.Builder(activity);
        alertDialog.setTitle("  [ 알림 ]")
        .setMessage("등록된 휴대폰 번호가 없습니다.")
        .setCancelable(false)
        .setNegativeButton("확인",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        });
        AlertDialog alert = alertDialog.create();
        alert.show();



alertDialog.setButton("확인", new DialogInterface.OnClickListener() {
   public void onClick(DialogInterface dialog, int which) {

   }
});

alertDialog.setButton(DialogInterface.BUTTON_POSITIVE,"확인", new DialogInterface.OnClickListener() {
   public void onClick(DialogInterface dialog, int which) {

   }
});



// http://www.technotalkative.com/issue-using-setjavascriptenabled-can-introduce-xss-vulnerabilities-application-review-carefully/

@SuppressLint("SetJavaScriptEnabled")
public class MyActivity extends Activity
{
...
}


// 내용 파악이 필요한 부분

showDialog(DIALOG_DOWNLOAD_PROGRESS);
The method showDialog(int) from the type Activity is deprecated
https://developer.android.com/reference/android/app/Activity.html#showDialog%28int%29
This method was deprecated in API level 13.


MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);


MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,null,Charset.forName("UTF-8"));



NameValuePair deprecated
ContentValues values = new ContentValues();
values.put("key1", "value1");
values.put("key2", 123);



728x90
블로그 이미지

Link2Me

,

[MySQL] SQL 모음

SQL 2016. 9. 23. 14:11

필요해서 구현했거나 자주 사용할 수 있는 쿼리문을 작성하고 추가해둔다.


검색할 때 2016 또는 16 으로 검색해도 연도 검색이 가능하게 처리하는 로직

$arr['searchValue'] ='201607';
if(strpos(substr($arr['searchValue'],0,2), '20') !== false){
    $arr['searchValue'] = substr($arr['searchValue'],2,strlen($arr['searchValue']));
    echo '<br />'.$arr['searchValue'];
}

$strqry = 'mp'.$arr['searchValue'];
$sql =" where substring(userID,1,".strlen($strqry).")='".$strqry."'";

echo '<br />'.$sql;



데이터 : 2016-07-30 오전12:00:00
select date_format('20160730', '%Y-%m-%d') from 테이블;


728x90

'SQL' 카테고리의 다른 글

[MySQL] 테이블 스키마 설계 고려사항  (0) 2016.11.19
[MySQL] 칼럼명 변경, 추가, 삭제  (0) 2016.10.26
엑셀에서 INSERT 쿼리문 만들기  (0) 2016.07.29
조건별 SUM SQL  (0) 2016.07.27
[MySQL] Self Join 예제  (0) 2016.02.22
블로그 이미지

Link2Me

,

안드로이드 앱 설치되는 아이콘을 변경하려면 이미지 파일에서 icon.png 파일을 전부 변경해줘야 한다.

drawable-ldpi (120 dpi, Low density screen) - 36px x 36px
drawable-mdpi (160 dpi, Medium density screen) - 48px x 48px
drawable-hdpi (240 dpi, High density screen) - 72px x 72px
drawable-xhdpi (320 dpi, Extra-high density screen) - 96px x 96px
drawable-xxhdpi (480 dpi, Extra-extra-high density screen) - 144px x 144px
drawable-xxxhdpi (640 dpi, Extra-extra-extra-high density screen) - 192px x 192px


사이즈에 맞게 아이콘을 변경해준다.


AndroidManifest.xml 파일에서 지정해준다.

어플 이름은 values/strings.xml 파일에서 지정해준다.



이 다음에 해줄 사항은

기존 이미지가 남아 있을 수 있으니 완전 clear 를 해주어야 한다.

728x90
블로그 이미지

Link2Me

,

안드로이드 개발중에 소스코드등 기타 이상한것이 없는데 자꾸
"Unparsed aapt error(s)! Check the console for output"
다음과 같이 이클립스의 problem창에 에러로그가 남을때 가 있다.


Project -> clean 으로 생성된 중간파일을 삭제하면 된다.


안드로이드 eclipse 에서 소스를 수정해주면 저장을 해야만 변경사항이 반영된다.

C#은 소스를 수정하고 컴파일을 하면 알아서 내용이 자동 변경되는데

안드로이드 eclipse 는 이런 점이 매우 불편하다.

728x90
블로그 이미지

Link2Me

,

NAudion DLL을 이용하여 만든 MP3 Player 허접한 버전이다.


작년에 기본적인 것만 만들어보다가 회사 일이 바빠서 손도 못대다가 최근에 C# 폴더 찾아보다가 발견하여 적어두고 소스코드를 포함해서 올린다.


자동 반복재생 처리하는 것까지 만들지를 못했다.

SQLite 를 이용하면 될 거 같은데 아직 이 기능을 제대로 익히지 못했다.

그냥 인터넷에 있는 아주 허접한 것보다는 약간 더 나은 수준정도인데 이것저것 참조해서 테스트해보면서 만들다가 만 거다.


LinkPlayer.zip






728x90
블로그 이미지

Link2Me

,

배열이 아닌 것을 배열 변수로 만들어서 검색결과를 알고 싶은 경우가 있다.

검색조건(search_item) 은 이름, 전화번호, 부서명 등으로 지정하고

검색어를 넣어서 배열에서 검색결과 처리를 하고자 할 경우 로직의 예이다.


첫번째 행의 변수는 $search[0] 로 할당하고, 두번째 행

$search_keyword = isset($_REQUEST['searchValue']) ? urldecode($_REQUEST['searchValue']) : '';


$search[1] = isset($_REQUEST['searchValue']) ? urldecode($_REQUEST['searchValue']) : '';

로 하면 배열 선언이 없는 상태라서 에러가 발생한다.


이렬 경우 보통은

php.ini 에서

error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE

로 처리하라고 되어 있다.

개발하면서 이 옵션은

error_reporting = E_ALL

로 설정해서 개발을 해야 에러가 발생하는 부분을 전부 화면에 표시를 해주므로 로직상의 문제점을 제거하면서 개발을 할 수 있다.


$search_item = isset($_REQUEST['searchName']) ? $_REQUEST['searchName'] : '';
$search_keyword = isset($_REQUEST['searchValue']) ? urldecode($_REQUEST['searchValue']) : '';

if(strlen($search_keyword) == 0){  // 입력값이 없으면 목록 없음 출력
    echo '<li data-icon="false">';
    echo '<a href="#">목록이 없습니다</a>';
    echo '</li>';
} else {
    // 검색어 값이 존재하면 배열 변수로 저장

    $search = array($search_item,$search_keyword);


    $c=new MemberClass;
    $rs=$c->MemberSearch($search);

    if($rs==0){    // 검색결과가 없으면
        echo '<li data-icon="false">';
        echo '<a href="#">목록이 없습니다.</a>';
        echo '</li>';

    } else { // 검색결과가 있으면
        // 검색결과 처리
    }

}


728x90
블로그 이미지

Link2Me

,

집에서 23인치 모니터를 2개 사용하는 환경에서 접속할 때에는 문제점을 모르고 있었는데 노트북과 모니터를 연결하는 환경에서 접속하니까 화면이 원하는 형태로 나오지 않았다.


int screenWidth = System.Windows.Forms.SystemInformation.VirtualScreen.Width;
int screenHeight = System.Windows.Forms.SystemInformation.VirtualScreen.Height;


이렇게 변경하니까 큰 화면과 작은 화면을 모두 제대로 인식하고 정상동작한다.


if (screenWidth <= 1680)
{
    dataGridView1.Columns["sub1"].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
    dataGridView1.Columns["sub2"].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
    dataGridView1.Columns["sub3"].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
}
else
{
    dataGridView1.Columns["sub1"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    dataGridView1.Columns["sub2"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    dataGridView1.Columns["sub3"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
}





728x90
블로그 이미지

Link2Me

,