ํ์
์ผ๋ก ์ฌ์ดํธ๋ฅผ ๋ง๋ค๊ณ ์๊ธฐ๋๋ฌธ์ Query๋ฌธ์ ์ ๋ฆฌํ์ฌ ์กฐ์๋ค๊ณผ ๊ณต์ ํ์๋ค.
https://shingu.gitbook.io/jun-api/
ํ๊ต์์ php๋๋ jsp๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ผ๊ณ ํ์ฌ php๋ฅผ ์ด์ฉํ์์ต๋๋ค.
<?php
$db = new PDO("mysql:host=localhost;port=????;dbname=junseok816","junseok816","๋น๋ฒ");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
?>
๊ฐ๋จํ๊ฒ PDO๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ DB๋ ์ฐ๋ํ์์ต๋๋ค.
์ธ์
(session)์ด๋ ์น ์ฌ์ดํธ์ ์ฌ๋ฌ ํ์ด์ง์ ๊ฑธ์ณ ์ฌ์ฉ๋๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ์๋ฏธํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ์ ์๋ฒ์์ ์ฐ๊ฒฐ์ ๋๋ด๋ ์์ ๊น์ง๋ฅผ ์ธ์
์ด๋ผ๊ณ ํฉ๋๋ค.
<?php
session_start();
// $userID = 0;
if(isset($_SESSION['userId'])){
$user_login = TRUE;
// $userID = $_SESSION['userid'];
}else{
$user_login = false;
// $_SESSION['userId'] = 0;
}
?>
session_start() ํจ์๋ ์ธ์ ์์ด๋๊ฐ ์ด๋ฏธ ์กด์ฌํ๋์ง๋ฅผ ํ์ธํ๊ณ , ์กด์ฌํ์ง ์์ผ๋ฉด ์๋ก์ด ์์ด๋๋ฅผ ๋ง๋ญ๋๋ค.
๋ง์ฝ ์ด๋ฏธ ์กด์ฌํ๋ ์ธ์ ์์ด๋๊ฐ ์์ ๋๋ ์๋ ์๋ ์ธ์ ๋ณ์๋ฅผ ๋ค์ ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
<?php
if($user_login){
$q_user = $db->query('SELECT * FROM tbl_user WHERE ai_id = '.$_SESSION['userId'].'');
$row_user = $q_user->fetch(PDO::FETCH_ASSOC);
$row_user["f_profile"] = ($row_user["f_profile"] == "") ? "img/defaultProfile.jpg" : $row_user["f_profile"];
?>
<button class="nav-btnMember" onclick="location.href='myPage.php'">
<img class="profileImg" src="<?=$row_user["f_profile"]?>">
<?php
if(mb_strlen($row_user["f_user_name"]) > 5)
echo mb_substr($row_user["f_user_name"],0, 5,"utf-8")."...";
else
echo $row_user["f_user_name"];
?>๋
</button>
<button class="nav-btnMember" onclick="location.href='logout.php'">๋ก๊ทธ์์</button>
<?php
}else{
?>
<button class="nav-btnMember" onclick="location.href='login.php'">๋ก๊ทธ์ธ</button>
<button class="nav-btnMember" onclick="location.href='join.php'">ํ์๊ฐ์
</button>
<?php
}
?>
session์ ์ฌ์ฉํ์ฌ ์์๊ฐ์ด ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ์ ๋ก๊ทธ์ธ์ํ์ฌ ๋ก๊ทธ์ธ์ ๋ณด๊ฐ session์ ๋จ์์๋ค๋ฉด DB์ ์๋ ๊ฐ๊ณผ ๋์กฐํ์ฌ SELECT๋ ์ ๋ณด๋ฅผ ๊ธ์ด์ค๋ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์์์ต๋๋ค.
๋งํฌ(http://funware.shop/joinDetail.php)
$(function(){
$('#btn-join').click(function(){
// ์ด๋ฆ
if($('#name').val().trim() == ""){
alert('์ด๋ฆ์ ์
๋ ฅํด์ฃผ์ธ์.');
return;
}
// ์ด๋ฉ์ผ
if($('#email').val().trim() == ""){
alert('์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.');
return;
}else if($('#email').val().indexOf('@') == -1){
alert('์ฌ๋ฐ๋ฅธ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.');
return;
}
// ๋น๋ฐ๋ฒํธ
if($('#pw').val().trim() == "" || $('#chkPW').val().trim() == ""){
alert('๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅ๋์ ํ์ธํด์ฃผ์ธ์.');
return;
}else if($('#pw').val() != $('#chkPW').val()){
alert('๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.');
return;
}
// ์ด์ฉ์ฝ๊ด
if($('#chkTerm').is(":checked") == false){
alert('์ด์ฉ์ฝ๊ด์ ๋์ํ์
์ผ ์๋น์ค ์ด์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.');
return;
}
$("#join-form").submit();
// $("#name").val(currentUserInputName);
// ๋๋น ๋๋ ค ~~~~!~!!!!
$.ajax({
url: "ajax_src/ajaxJoin.php",
type: "post",
dataType: "json",
async: false,
data: {
name: $("#name").val(),
email: $("#email").val(),
password: $("#pw").val(),
chkMkt: $("#chkMkt").is(":checked")
},
success: (res) => {
if(res.msg){
alert('๊ฐ์
์ด ์๋ฃ๋์์ต๋๋ค.');
// window.location.assign('login.php');
// ํ์ด์ง ์ด๋์ด ์ ์ ๋ ๊น์
location.replace('login.php');
}else{
alert('์ด๋ฏธ ๊ฐ์
๋ ์ด๋ฉ์ผ์
๋๋ค.');
}
},
});
})
})
input์ฐฝ์ ์ฌ์ฉ์๊ฐ ๊ธฐ์ ํ ๋ฐ์ดํฐ๋ฅผ ajaxJoin.php๋ก ์ ๋ฌํด์ค๋๋ค.
<div id="join-container">
<div id="join-box">
<p id="title">ํ์๊ฐ์
</p>
<button type="" id="btn-join" onclick = "location.href='joinDetail.php'">
<img src="img/email.png" style="margin-right:8.9px;">์ด๋ฉ์ผ๋ก ํ์๊ฐ์
</button>
<img src="img/loginOr.png" style="width:100%;">
<div id="socialBox">
<div id="social">
<div id="customBtn" class="customGPlusSignIn" data-onsuccess="onSignIn" data-width="44px" data-height="44px">
<div id="gSignInWrapper">
<div id="customBtn" class="customGPlusSignIn">
<span class="icon">
<img src="img/google@3x.png" width="44px" height="44px" alt="" srcset="">
</span>
</div>
</div>
<script>startApp();</script>
<div>
<!-- <div><img src="img/facebook@3x.png"></div> -->
<div id="naver_id_login">
<!-- <img src="img/naver@3x.png"> -->
</div>
<div id="kakaoBtn">
<a href="javascript:KakaoLogin();">
<img src="img/kakao@3x.png">
</a>
</div>
</div><br>
<br><span style="color: #666666;">์์
๋คํธ์ํฌ๋ก ํ์๊ฐ์
ํด๋ณด์ธ์</span>
<p id="msg-join">์ด๋ฏธ FunWare๊ณ์ ์ด ์์ผ์ ๊ฐ์?</p>
<a href="login.php" style="color: #27a3ff;">๊ธฐ์กด ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ๊ธฐ</a>
</div>
</div>
</div>
<meta name="google-signin-scope" content="profile email">
<meta name="google-signin-client_id" content="YOUER_KEY.com">
HTML์๋จ์ scriptํ๊ทธ ์์ ๊ตฌ๊ธ API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์์๊ฐ์ด ํ๊ทธ๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
var googleUser = {};
var startApp = function() {
gapi.load('auth2', function(){
// Retrieve the singleton for the GoogleAuth library and set up the client.
auth2 = gapi.auth2.init({
client_id: 'YOUR_KEY.com',
additional_scope: 'profile email'
// Request scopes in addition to 'profile' and 'email'
//scope: 'additional_scope'
});
attachSignin(document.getElementById('customBtn'));
});
};
function attachSignin(element) {
// console.log(element.id);
auth2.attachClickHandler(element, {},
function(googleUser) {
var profile = googleUser.getBasicProfile();
console.log(profile);
console.log("ID: " + profile.getId()); // Do not send to your backend! Use an ID token instead.
console.log("Name: " + profile.getName());
console.log("Image URL: " + profile.getImageUrl());
console.log("Email: " + profile.getEmail()); // This is null if the 'email' scope is not present.
}, function(error) {
alert(JSON.stringify(error, undefined, 2));
});
}
๋จผ์ startApp()ํจ์๊ฐ ์คํ์ด๋๊ณ ๊ตฌ๊ธ ๋ด์ฅํจ์๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
๊ฐ์ฒด๋ client_id์ additional_scope(์ฌ์ฉ์์๊ฒ ์๊ตฌํ๋ ์ ๋ณด)๋ฅผ ๋ฐ์์ ์์ฑ๋ฉ๋๋ค.
๊ทธ ํ attachSignin()ํจ์๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ HTML๊ฐ์ฒด๋ฅผ ํด๋ฆญํ์๋ ์๋๋๋ Handler๋ฅผ ์ ์ฉ์์ผ ์ฃผ์๋๋ฐ ํธ๋ค๋ฌ๊ฐ ์คํ๋๋ฉด ์ฌ์ฉ์์ ๊ตฌ๊ธํ๋กํ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๋ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
<script type="text/javascript" src="https://static.nid.naver.com/js/naverLogin_implicit-1.0.3.js" charset="utf-8"></script>
HTML์๋จ์ scriptํ๊ทธ ์์ Naver API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์์๊ฐ์ด ํ๊ทธ๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
var naver_id_login = new naver_id_login("YOUR_CLIENT_ID", "YOUR_CALLBACK_URL");
var state = naver_id_login.getUniqState();
// naver_id_login.setButton("white", 2,50);
naver_id_login.setDomain("http://funware.shop/");
naver_id_login.setState(state);
// naver_id_login.setPopup();
naver_id_login.init_naver_id_login();
new naver_id_login("YOUR_CLIENT_ID", "YOUR_CALLBACK_URL");์ ์ฌ์ฉํด naver api๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
<script src="https://developers.kakao.com/sdk/js/kakao.js"></script>
HTML์๋จ์ scriptํ๊ทธ ์์ Kakao API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์์๊ฐ์ด ํ๊ทธ๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
HTML
<div id="kakaoBtn"><a href="javascript:KakaoLogin();"><img src="img/kakao@3x.png"></a></div>
๋ฒํผ์ ํด๋ฆญํ๋ฉด ํจ์๊ฐ ํธ์ถ๋๊ฒ ์ค์ ํฉ๋๋ค.
Kakao.init("YOUR_KEY");
console.log("Init state : " + Kakao.isInitialized());
function KakaoLogin() {
Kakao.Auth.login({
scope: "profile, account_email, gender",
success: function (authObj) {
console.log(authObj);
Kakao.API.request({
url: "/v2/user/me",
success: (res) => {
console.log(res.kakao_account);
location.replace("joinDetail.php?email=" + res.kakao_account.email);
},
});
},
});
}
<?php
try {
require '../dbInfo.php';
// ๋ฐ์ดํฐ ๋ฐ๊ธฐ
$name = $_REQUEST["name"];
$email = $_REQUEST["email"];
$chkMkt = ($_REQUEST["chkMkt"]) ? 1 : 0;
// ํ ํฐ ๋ฐ๊ธ function
function GenerateString($length){
$characters = "0123456789";
$characters .= "abcdefghijklmnopqrstuvwxyz";
$characters .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$characters .= "_";
$string_generated = "";
$nmr_loops = $length;
while ($nmr_loops--)
{
$string_generated .= $characters[mt_rand(0, strlen($characters) - 1)];
}
return $string_generated;
}
// ์ํธํ function
function Encrypt($str){
// secreat key = 'funware', secreat iv = 'tlsrn815'
$key = hash('sha256', 'funware');
$iv = substr(hash('sha256', 'tlsrn815'), 0, 16);
return str_replace("=", "", base64_encode(
openssl_encrypt($str, "AES-256-CBC", $key, 0, $iv))
);
}
// ์ด๋ฉ์ผ ๊ฐ ๊ฒ์ฌ
$q1= $db->prepare('SELECT f_user_pw FROM tbl_user WHERE f_email = ? AND f_div = "Y";');
$q1->execute(array($email));
// ์ ๊ทํ์
if(!($row = $q1->fetch(PDO::FETCH_ASSOC))){
// ํ ํฐ ๋ฐ๊ธ
$token = GenerateString(10);
// PW, token ์ํธํ
// $password = Encrypt($_REQUEST["password"]);
$password = Encrypt($_REQUEST["password"].$token);
// insert user
$q2 = $db->query("INSERT INTO tbl_user (f_email, f_user_pw, f_user_name, auto_date, f_token, f_marketing, f_div)
VALUES ('".$email."', '".$password."', '".$name."', CURRENT_TIMESTAMP, '".$token."', '".$chkMkt."', 'Y');");
$result['msg'] = true;
// ๊ธฐ์กด ํ์
}else{
$result['msg'] = false;
}
}catch(Exception $e) {
$result['msg'] = '์ฃ์กํฉ๋๋ค. ์๋ฒ ์ค๋ฅ์
๋๋ค.';
}finally{
// ์์ด๋ณด์ด๊ฒ jsonํ
echo json_encode($result, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
}
?>
hash()ํจ์๋ฅผ ์ด์ฉํด ๋ฐ์์จ Password๋ฅผ ์ํธํ์ํจํ DB์ INSERTํ๋ ์ฝ๋์ ๋๋ค.
์ซ์,์๋ฌธ์,๋๋ฌธ์,์ธ๋๋ฐ ๋ฅผ ์กฐํฉํ 10์๋ฆฌ์ ๋์๋ฅผ ์์ฑํฉ๋๋ค.
GenerateString()ํจ์๋ก ์์ฑํ ๋์์ password๋ฌธ์์ด์ ํฉ์น ๋ณ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์
hash()ํจ์๋ก ์ํธํ ์ํจ๊ฐ์ ๋ฆฌํดํฉ๋๋ค.
๋งํฌ(http://funware.shop/index.php)
<p class="main-titles">์ ๊ท ํ๋ก์ ํธ๐</p>
<p class="main-subTitles">์ต๊ทผ์ ๋์จ ํ๋ก์ ํธ๋ฅผ ๋ง๋๋ณด์ธ์</p>
<div id="new-cards-box" class="mainCards pListBox">
<?php
$q1= $db->query('SELECT ai_project_id ,
f_project_name ,
f_thumbnail ,
SUM(f_spon + f_invest) AS f_donate ,
TRUNCATE((SUM(f_spon + f_invest)/f_donate_limit)*100,0) AS achieveRate,
f_etp_name ,
DATEDIFF(f_date_limit,CURDATE()) AS f_daysleft
FROM tbl_project
LEFT JOIN tbl_img ON tbl_project.ai_project_id = tbl_img.sys_project_id
LEFT JOIN tbl_enterprise ON tbl_project.ai_project_id = tbl_enterprise.sys_project_id
LEFT JOIN tbl_payment ON tbl_payment.sys_project_id = tbl_project.ai_project_id
WHERE tbl_project.f_div = "Y" AND DATEDIFF(f_date_limit,CURDATE()) > 0
GROUP BY ai_project_id
ORDER BY auto_date DESC LIMIT 20'
);
echo '<div class ="oh_box">';
echo'<span id="movieList_slideLeft_new" class="material-icons md-18 prev">arrow_back_ios</span>';
echo '<div id="new-cards" class="cards">';
while($row = $q1->fetch(PDO::FETCH_ASSOC)){
// $percent = isset($row['achieveRate']) ? $_row['achieveRate']: 0;
// ($percent == "") ? $percent=0 : "";
if(!$row["f_thumbnail"]) $row["f_thumbnail"] = "img/defaultThumbnail.png";
if(!$row["achieveRate"]) $row["achieveRate"] = "0";
$projectSize = strlen($row["f_project_name"]);
$etpSize = strlen($row["f_etp_name"]);
$projectName = ($projectSize >= 17) ? $projectName = substr($row["f_project_name"],0, 17).'...': $row["f_project_name"] ;
$etpName = ($etpSize >= 23) ? $etpName = substr($row["f_etp_name"],0, 23).'...': $row["f_etp_name"];
echo '<div class="wrapNewCard">';
echo '<div class="cards_contents">';
echo '<a href="projectDetail.php?p_num='.$row["ai_project_id"].'">';
echo '<div class="p_thumnail"><img src="'.$row["f_thumbnail"].'"></div>';
echo '<div class="p_infoBox">';
echo '<div class="enp_name">', $etpName, '</div>';
echo '<div class="p_nameRateBox p_tip">';
echo '<div class="p_name">', $projectName, '</div>';
echo '<div class="d_rate">', $row["achieveRate"], '%</div>';
echo '<span>' , $row["f_project_name"] ,'</sapn>';
echo '</div>';
echo '</div>';
echo '</div></a>';
echo '</div>';
}
echo '</div>';
echo '<span id="movieList_slideRight_new" class="material-icons md-18 next">arrow_forward_ios</span>';
echo '</div>';
// }
?>
์ฌ์ดํธ์ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ค์ ์์๊ฐ์ด SELECT๋ฌธ์ผ๋ก ์ถ๋ ค๋ด์ฌ php๋ฌธ์ผ๋ก ๋์๋ด์์ต๋๋ค.
<?php
$q1= $db->prepare("SELECT j_link.sys_project_id AS p_id
,j_link.sys_category_id
,j_category.f_category_name
,j_project_Sum.f_project_name
,j_project_Sum.f_projectTotal
,j_project_Sum.f_percent
,j_project_Sum.f_etp_name
,j_project_Sum.f_daysleft
,j_project_Sum.f_thum
FROM tbl_pj_category as j_link
Left join tbl_category AS j_category
ON j_link.sys_category_id = j_category.ai_category
LEFT JOIN (
SELECT j_project.ai_project_id
,j_project.f_project_name
,sum(j_payment.f_spon + f_invest) AS f_projectTotal
,TRUNCATE((sum(j_payment.f_spon + f_invest)/j_project.f_donate_limit)*100,0) AS f_percent
,j_etp.f_etp_name AS f_etp_name
,DATEDIFF(f_date_limit,CURDATE()) AS f_daysleft
,j_img.f_thumbnail AS f_thum
,j_project.f_div
FROM tbl_project AS j_project
LEFT JOIN tbl_payment AS j_payment
ON j_project.ai_project_id = j_payment.sys_project_id
LEFT JOIN tbl_enterprise AS j_etp
ON j_project.ai_project_id = j_etp.sys_project_id
LEFT JOIN tbl_img AS j_img
ON j_project.ai_project_id = j_img.sys_project_id
GROUP BY j_project.ai_project_id,j_project.f_project_name
) AS j_project_Sum
ON j_project_Sum.ai_project_id = j_link.sys_project_id
WHERE concat(j_project_Sum.f_project_name,',',j_project_Sum.f_etp_name,',',j_category.f_category_name) LIKE ? AND j_project_Sum.f_div ='Y' AND f_daysleft > 0
GROUP BY sys_project_id");
$q1->execute(array("%".$keyword."%"));
echo '<div id="keyword-cards" class="cards">';
while($row = $q1->fetch(PDO::FETCH_ASSOC)){
$projectCount++;
if($keyword != "" && $projectCount != 0){
if(!$row["f_thum"]) $row["f_thum"] = "img/defaultThumbnail.png";
if(!$row["f_percent"]) $row["f_percent"] = "0";
$projectSize = strlen($row["f_project_name"]);
$etpSize = strlen($row["f_etp_name"]);
$projectName = ($projectSize >= 17) ? $projectName = substr($row["f_project_name"],0, 17).'...': $row["f_project_name"] ;
$etpName = ($etpSize >= 23) ? $etpName = substr($row["f_etp_name"],0, 23).'...': $row["f_etp_name"];
echo '<div class="cards_contents">';
echo '<a href="projectDetail.php?p_num='.$row["p_id"].'">';
echo '<div class="p_thumnail"><img src="'.$row["f_thum"].'"></div>';
echo '<div class="p_infoBox">';
echo '<div class="enp_name">', $etpName, '</div>';
echo '<div class="p_nameRateBox p_tip">';
echo '<div class="p_name">', $projectName, '</div>';
echo '<div class="d_rate">', $row["f_percent"], '%</div>';
echo '<span>' , $row["f_project_name"] ,'</sapn>';
echo '</div>';
echo '</div>';
echo '</div></a>';
}
}
if($projectCount == 0) echo '<div class="emptySearchedBox">Oooops, ๊ฒ์๊ฒฐ๊ณผ๊ฐ ์์ด์ !</div>';
echo '</div>';
?>
์ฟผ๋ฆฌ์ ๊ฐ์ ๋ฐ๊ฟ ๋ฃ์ ๊ณณ์ ? (placeholder)๋ฅผ ์ฌ์ฉํฉ๋๋ค
execute(array("%".$keyword."%")) ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ดํํ๋ก ๊ฐ์ ?(placeholder)์ ์ ๋ฌํฉ๋๋ค
keyword๊ฐ์ ์ฌ์ฉ์๊ฐ input์ฐฝ์ ์
๋ ฅํ ๊ฐ์
๋๋ค.
์ฟผ๋ฆฌ๋ฌธ์ ์๋
concat(j_project_Sum.f_project_name,',',j_project_Sum.f_etp_name,',',j_category.f_category_name)
LIKE ?
concat๋ฌธ์ผ๋ก ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๋ฌธ์์ด๋ก ํฉ์นํ ? (placeholder)์ ๋น๊ตํฉ๋๋ค.