var $checkbox = $('#chk'); console.log($checkbox.attr('checked')); // checked속성의 값을 표시 → "checked" console.log($checkbox.prop('checked')); // checked프로파티값을 표시 → true or false
체크가 되어있는지 판단을 할경우 .prop()을 사용할 필요가 있다.
체크박스를 전체 선택하고 해제하는 스크립트를 쓰려면 .prop()로 true/false 를 제어하자.
For jQuery 1.6+ : .attr() is deprecated for properties; use the new .prop() function instead as
$('#myCheckbox').prop('checked', true); // Checks it $('#myCheckbox').prop('checked', false); // Unchecks it
For jQuery < 1.6: To check/uncheck a checkbox, use the attribute checked and alter that. With jQuery you can do: $('#myCheckbox').attr('checked', true); // Checks it $('#myCheckbox').attr('checked', false); // Unchecks it
HTML(Hyper Text Markup Language)은 태그로 구성되어 있다. - HTML 태그는 기본적으로 '<' 기호로 시작하여 '>'로 끝난다. - 브라우저에서 HTML을 파싱할 때는 꺽쇠기호 <> 를 HTML 태그의 시작과 끝으로 인식 할 수 있다 - 따옴표 " "는 HTML 속성의 값이 시작되거나 끝난 것으로 인식할 수 있다. - & 기호는 Entity 기호의 시작으로 오인될 수 있다.
"<", ">", "&" 이런 기호들을 Web 브라우저에서 제대로 표현하려면 < > & 로 변환해주어야 한다.
PHP에서는 htmlspecialchars() HTML에서 사용하는 특수문자를 변경해주는 역할을 한다.
stripslashes()는 따옴표에 붙는 백슬래시를 제거해주는 함수다. 따옴표에 백슬래시를 붙여주는 함수는 addslashes() 다. HTML 코드를 DB에 저장할 때 따옴표나 여러 특수문자 때문에 에러를 발생하기도 한다 DB에 저장할 때는 특수문자를 적절하게 변경해주어야 한다.
PHP에서 HTML 구문을 그대로 출력하기 위해 htmlspecialchars를 사용하여 인코딩된 문자열을 DB에 넣어준다. 반대로 DB에 있는 값을 불러와 HTML 소스로 변환할 때는 일반적으로 htmlspecialchars_decode를 많이 사용한다. 그런데 이 함수를 사용하는데 문제가 있다. htmlspecialchars_decode는 를 공백으로 다시 되돌려 주지 않는다.
와 같은 것은 html_entity_decode를 사용하면 된다. 이 함수는 htmlentities와 대응되는 함수이다.
htmlspecialchars와 htmlentities는 유사하나 htmlentities가 더 많은 문자를 변환한다. htmlspecialchars_decode와 html_entity_decode는 유사하나 html_entity_decode가 더 많은 문자를 되돌린다.
PHP 버전이 낮은 경우에는 get_magic_quotes_gpc()함수로 magic_quotes 값을 확인 후 써야 한다. 그렇지 않으면 불필요한 백슬래시까지 데이터로 처리하는 경우가 발생하기 때문이다. Returns 0 if magic_quotes_gpc is off, 1 otherwise. PHP 5.4.0. always returns FALSE because the magic quotes feature was removed from PHP.
// 전체 선택, 전체 해제 $("#checkall").change(function() { $("input:checkbox").prop('checked', $(this).prop("checked")); });
$('#select_chkbox').click(function(i) { var rowData = new Array(); var chkData = new Array(); var checkbox = $('input:checkbox[name="uid[]"]:checked'); checkbox.each(function(i){ // 반복되는 태그 단위를 찾아서 each() 함수 사용 var select_value = $(this).val(); chkData.push(select_value);
// checkbox.parent() : checkbox의 부모는 <td> // checkbox.parent().parent() : <td>의 부모이므로 <tr> var tr = checkbox.parent().parent().eq(i); var td = tr.children(); rowData.push(tr.text()+"<br />"); }); if (rowData.length == 0) { $("#chk_result").html("선택항 항목이 없습니다").css("color", "blue");
$("#rawData_result").html("");
} else { $("#chk_result").html("선택된 체크박스 값 : "+chkData).css("color", "blue"); $("#rawData_result").html("체크된 Row의 모든 데이터 : <br /> "+rowData); } });
var sum = 0; $('table tbody tr').each(function(){ //테이블 모든 tr에 순차 접근 if($.isNumeric($("td:eq(4)",this).text())){ //해당 tr의 다섯번째 td에 접근해서 숫자인지 확인 sum += parseInt($("td:eq(4)",this).text());//해당하는 값을 숫자로 변환해서 누적합산 처리 } }); $("#sum").text("수량 합계 : "+sum.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","));// sum을 출력
jQuery 로 간단하게 하는 것이 Javascript 코드와 비교표를 통해서 정리하며, 계속 추가할 것이다.
jQuery
JavaScript
$(document).ready(function() {
});
또는
$(function () { });
window.onload=function(){
}
$("p").css("background-color", "#f60");
var p=document.getElementsByTagName("p");
p.style.backgroundColor="#f60";
$("#navi").css("background-color", "#f60");
var navi=document.getElementById("navi");
navi.style.backgroundColor="#f60";
$("#element1").on('click', function() { // do something on click }
또는 $("#element1").click(function() { // do something on click });
var x = document.getElementById("element1"); if (x.addEventListener) { // IE 9 이상, 타브라우저 x.addEventListener("click", myFunction); } else if (x.attachEvent) { // For IE 8 and earlier versions x.attachEvent("onclick", myFunction); }
document.getElementById("element1")
.addEventListener('click',doSomething,false);
$('#outer').on('mouseup', function (event) { alert('This alert should not show up!'); }, false);
document.getElementById('outer').addEventListener('mouseup', function (event) { alert('This alert should not show up!'); }, false);
// 가져온 데이터가 깨져보이는 경우는 인코딩 모드가 UTF-8 이 아닐 수 있다. $enc = mb_detect_encoding($html, array('EUC-KR', 'UTF-8', 'shift_jis', 'CN-GB')); if ($enc != 'UTF-8') { $html = iconv($enc, 'UTF-8', $html); } print_r($html); ?>
위와 같이 cURL 을 이용하면 해당 페이지 정보가 보이는데 XML이 아니라 HTML Web 이다.
소스보기를 하면 html 코드들이 보인다.
PHP Simple HTML DOM Parser 를 이용하면 원하는 곳만 쉽게 뽑아낼 수 있다.
다음날 오전에 다시 확인해보니 내일, 모레 뿐만 아니라 현재 기준으로 앞으로의 오늘 날씨 정보도 보여주더라.
그런데 날짜 정보가 XML 파일에 기록되지 않아서 해당 정보를 정확하게 파악하기가 쉽지 않다.
cURL 함수 사용이 가능한지 여부를 확인하는 방법
<?php if (ini_get('allow_url_fopen') == '1') { // file_get_contents() 사용 echo 'php.ini 환경에서 허용'; } else { // curl 함수 이용 가능 여부 if (function_exists('curl_init')) { echo 'curl 함수 사용 가능'; } else { echo 'curl 함수 이용 불가'; } } ?>
php.ini에는 'allow_url_fopen'라는 설정항목이 있다. 이 항목이 off일 경우에는 fopen 등의 파일관련 함수에서 URL로 파일을 읽어오는 것이 불가능하다. 'allow_url_fopen'을 off로 하는 대부분의 이유는 '보안 취약성'의 우려가 있기 때문이다. For example, somebody might pass /etc/passwd as a url, and be able to view its contents.
<div class="tab-content"> <div id="menu0" class="tab-pane fade in active"> <h4>Menu 0</h4> <p>Eaque ipsa quae ab illo inventore veritatis. </p> </div> <div id="menu1" class="tab-pane fade"> <h4>Menu 1</h4> <p>Eaque ipsa quae ab illo inventore veritatis. </p> </div> <div id="menu2" class="tab-pane fade"> <h4>Menu 2</h4> <p>Eaque ipsa quae ab illo inventore veritatis. </p> </div> <div id="menu3" class="tab-pane fade"> <h4>Menu 3</h4> <p>Eaque ipsa quae ab illo inventore veritatis. </p> </div> </div>
require_once $_SERVER['DOCUMENT_ROOT'].'/pdoclass/dbconfig.php'; $c = new LoginClass; $b = new boardClass; $link_url = $_SERVER['PHP_SELF']; // 현재 실행중인 파일명 가져오기 $page = isset($_GET['page'])? trim($_GET['page']):1;//페이지 변수 설정 $rowsPage = 10; // 한 화면에 표시되는 게시글 수 $curPage = isset($_GET['p']) ? $_GET['p'] : 1; $table = "members m join member_data d on m.idx=d.relatedidx"; $cat1 = isset($cat1) ? $cat1: ''; $cat2 = isset($cat2) ? $cat2: ''; $where = isset($_GET['where']) ? $_GET['where']: ''; $keyword = isset($_GET['keyword']) ? $_GET['keyword']: ''; $xorderby= isset($xorderby) ? $xorderby : 'idx DESC'; if($where && $keyword) { if($where == 'userNM') $sql = "userNM LIKE '%".$keyword."%' "; if($where == 'userID') $sql = "userID LIKE '%".$keyword."%' "; if($where == 'mobileNO') $sql = "mobileNO LIKE '%".$keyword."%' "; if($where == 'unify') { $sql = "(userID LIKE '%".$keyword."%' OR userNM LIKE '%".$keyword."%' OR mobileNO LIKE '%".$keyword."%') "; } } else { $sql =''; } $g['url_link']=($where?'where='.$where.'&':'').($keyword?'keyword='.urlencode(stripslashes($keyword)).'&':'').($cat1?'cat1='.$cat1.'&':'').($cat2?'cat2='.$cat2.'&':''); $g['bbs_reset'] = $link_url;
$rows= $c->getDbArray($table,$sql,'*',$xorderby,$rowsPage,$curPage); $NUM = $c->getDbRows($table,$sql); // 전체 게시글 수 또는 검색된 게시글 수 $TPG = $b->getTotalPage($NUM,$rowsPage); // 전체페이지수 및 현재 페이지수 ?>
// 전체 선택, 전체 해제 $("#checkall").change(function() { $("input:checkbox").prop('checked', $(this).prop("checked")); });
$('#Favorite').click(function() { var chkdata = new Array(); $('input:checkbox[name="uid[]"]:checked').each(function() { chkdata.push($(this).val()); // 체크한 아이템 배열로 저장 }); if (chkdata.length == 0) {// 배열의 길이가 0 이 아니면 alert('체크한 항목이 없습니다.'); }
JSON 데이터는 Local File 을 읽어오는 것과 Web 사이트에서 해당 URL 을 읽어오는 방법이 있다.
가장 먼저 파싱해야 할 데이터 형태 파악을 하는 코드부터 살펴보고자 구글링을 했더니 관련 코드가 있어서 주석을 좀 더 추가하고 이해를 돕는 걸 첨가하여 적어둔다.
<?php // Web JSON 파일 읽어오기 $url = 'http://ip주소/getFileList.php'; $json_string = file_get_contents($url);
// Local JSON 파일 읽어오기 //$json_string = file_get_contents('weather.json'); // 다차원 배열 반복처리 $R = new RecursiveIteratorIterator( new RecursiveArrayIterator(json_decode($json_string, TRUE)), RecursiveIteratorIterator::SELF_FIRST); // $R : array data // json_decode : JSON 문자열을 PHP 배열로 바꾼다 // json_decode 함수의 두번째 인자를 true 로 설정하면 무조건 array로 변환된다.
foreach ($R as $key => $val) { if(is_array($val)) { // val 이 배열이면 echo "$key:<br/>"; //echo $key.' (key), value : (array)<br />'; } else { // 배열이 아니면 echo "$key => $val <br />"; } } ?>
// 동일한 userID 등록되어 있는지 체크 if ($c->isUserExisted($userID)) { // E-Mail 이 key value // user already existed echo -1; } else { // 사용자 등록 $telNO = preg_replace("/[^0-9]/", "", $telNO); $mobileNO = preg_replace("/[^0-9]/", "", $mobileNO); $user = $c->storeUser($userID, $name, $email, $password, $telNO, $mobileNO); if ($user) { // 사용자 등록 성공 echo 1; } else { echo 0; } } } else { // 입력받은 데이터에 문제가 있을 경우 echo -2; } ?>
strings.xml 과 colors.xml 파일 두개가 포함되어 있다.
회원가입 테이블에 데이터가 저장되어 있는 걸 확인할 수 있다.
회원가입과 로그인처리는 완벽하게 처리되도록 구현한 소스코드를 그대로 오픈 것이니 복사해서 이용하면 된다.
AndroidManifest.xml 파일에 Register Activity 추가된 것을 추가해줘야 에러가 발생하지 않는다.소소한 에러를 잡아가면서 해보는게 좋을거 같아서 관련으로 수정된 부분은 첨부하지 않는다.
// 멀티 퍼미션 지정 private String[] permissions = { Manifest.permission.READ_PHONE_STATE, Manifest.permission.CALL_PHONE, // 전화걸기 및 관리 Manifest.permission.WRITE_CONTACTS, // 주소록 액세스 권한 Manifest.permission.WRITE_EXTERNAL_STORAGE // 기기, 사진, 미디어, 파일 엑세스 권한 }; private static final int MULTIPLE_PERMISSIONS = 101;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); mContext = this.getBaseContext(); backPressHandler = new BackPressHandler(this); // 뒤로 가기 버튼 이벤트
if (Build.VERSION.SDK_INT >= 23) { // 안드로이드 6.0 이상일 경우 퍼미션 체크 checkPermissions(); }
// 네트워크 연결상태 체크 if(NetworkConnection() == false){ NotConnected_showAlert(); }
private void login(String loginID, String loginPW){ // 단말기의 ID 정보를 얻기 위해서는 READ_PHONE_STATE 권한이 필요 TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
protected void showJSONResult(String result) { if(Integer.parseInt(result) > 0){ // 로그인 정보 일치하면 idx 값 받음 idx = result; AutoLoginChk(); // 정보 저장 Toast.makeText(Login.this,"로그인 성공", Toast.LENGTH_SHORT).show(); startActivity(new Intent(getApplication(), MainActivity.class)); finish(); // 현재 Activity 를 없애줌 } else if(result.equalsIgnoreCase("-1")){ // 등록된 단말기와 불일치 deviceDismatch_showAlert(); } else if (result.equalsIgnoreCase("0")) { showAlert(); } else { Toast.makeText(Login.this, "서버로부터 정보가 잘못 전송되었습니다", Toast.LENGTH_SHORT).show(); } }
private boolean checkPermissions() { int result; List<String> permissionList = new ArrayList<>(); for (String pm : permissions) { result = ContextCompat.checkSelfPermission(this, pm); if (result != PackageManager.PERMISSION_GRANTED) { permissionList.add(pm); } } if (!permissionList.isEmpty()) { ActivityCompat.requestPermissions(this, permissionList.toArray(new String[permissionList.size()]), MULTIPLE_PERMISSIONS); return false; } return true; }
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case MULTIPLE_PERMISSIONS: { if (grantResults.length > 0) { for (int i = 0; i < permissions.length; i++) { if (permissions[i].equals(this.permissions[i])) { if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { showToast_PermissionDeny(); } } } } else { showToast_PermissionDeny(); } return; } }
}
private void showToast_PermissionDeny() { Toast.makeText(this, "권한 요청에 동의 해주셔야 이용 가능합니다. 설정에서 권한 허용 하시기 바랍니다.", Toast.LENGTH_SHORT).show(); finish(); }
public void onStop(){ // 어플리케이션이 화면에서 사라질때 super.onStop(); //AutoLoginChk(); }
private void AutoLoginChk(){ // 자동 로그인이 체크되어 있고, 로그인에 성공했으면 폰에 자동로그인 정보 저장 if (autologin.isChecked()) { settings = getSharedPreferences("settings",Activity.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit();
if (isset($_POST['userID']) && isset($_POST['userPW'])) { require_once '../config/config.php'; $c = new MemberClass();
// get the user by userID and password $rs = $c->LoginUserChk($userID,$userPW,$deviceID); $user = $c->getUser($userID, $userPW);
if ($user != false && $rs > 0) { // use is found echo $user['idx']; } else if ($user != false && $rs == -1) { // 등록된 폰이 아닙니다. 관리자에게 문의하세요! echo -1; } else { // user is not found with the credentials echo 0; } } else { echo -2; } ?>
서버 코드 값을 좀 더 세분화하면 등록된 userID가 없는 경우도 안드로이드폰에 반환할 수 있고, 패스워드가 일치하지 않는 경우를 반환할 수도 있다.
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <!-- Include all compiled plugins (below), or include individual files as needed --> <script src="../plugin/bootstrap/js/bootstrap.min.js"></script> <script src="../config/js/login.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-sm-3">
$(function(){ // 회원 가입 처리 $('#join-submit').click(function(e){ e.preventDefault(); if($("#inputName").val() ==''){ alert('이름을 입력하세요'); $("#inputName").focus(); return false; }
<?php extract($_POST); if (isset($_POST)) { require_once '../config/config.php'; $c = new MemberClass(); // 동일한 userID(email) 등록되어 있는지 체크 if ($c->isUserExisted($userID)) { echo '{"result":"0"}'; // echo json_encode(array('result' => '0')); 과 동일 } else { // 회원 등록 $user = $c->storeUser($userID, $name, $email, $password, $telNO, $mobileNO); if ($user) {// 사용자 등록 성공 if (!isset($_SESSION)) { session_start(); } $_SESSION['userID'] = $user['userID']; $_SESSION['admin'] = $user['admin']; echo json_encode(array('result' => '1')); } else { // 회원 등록 실패 echo json_encode(array('result' => '-1')); } } } else {// 입력받은 데이터에 문제가 있을 경우 echo json_encode(array('result' => '-2')); } ?>