๐ŸŽ‰ํ•™๊ต ํ”„๋กœ์ ํŠธ ๊ฒฐ๊ณผ๋ฌผ๋กœ ์‚ฌ์ดํŠธ ๋งŒ๋“ค๊ธฐ(2) - ์‚ฌ์ดํŠธ์— DB๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

์ค€์„(์ค€์„์•„)ยท2021๋…„ 11์›” 3์ผ
0

ํ”„๋กœ์ ํŠธ ๊ฒฐ๊ณผ๋ฌผ

๋ชฉ๋ก ๋ณด๊ธฐ
2/2

์‚ฌ์šฉํ•œ Query๋ฌธ ์ •๋ฆฌ

ํ˜‘์—…์œผ๋กœ ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— Query๋ฌธ์„ ์ •๋ฆฌํ•˜์—ฌ ์กฐ์›๋“ค๊ณผ ๊ณต์œ ํ•˜์˜€๋‹ค.
https://shingu.gitbook.io/jun-api/

์‚ฌ์ดํŠธ ์ œ์ž‘์— ์‚ฌ์šฉํ•œ ๊ธฐ์ˆ ๋“ค

PDO๊ฐ์ฒด ์ƒ์„ฑ

ํ•™๊ต์—์„œ 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 ๊ฐ’ ์œ ๋ฌด์ฒดํฌํ•˜๊ธฐ

์„ธ์…˜(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๋กœ ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค.

๊ตฌ๊ธ€,๋„ค์ด๋ฒ„,์นด์นด์˜ค ์•„์ด๋”” ์—ฐ๋™

HTML ์ฝ”๋“œ

      <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>

๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ api์„ค์ •

<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๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

kakao ๋กœ๊ทธ์ธ 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);
              },
            });
          },
        });
      }

๋„˜๊ฒจ๋ฐ›์€ ๊ฐ’ DB์— INSERTํ•˜๊ธฐ

<?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ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

function GenerateString()

์ˆซ์ž,์†Œ๋ฌธ์ž,๋Œ€๋ฌธ์ž,์–ธ๋”๋ฐ” ๋ฅผ ์กฐํ•ฉํ•œ 10์ž๋ฆฌ์˜ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

function Encrypt()

GenerateString()ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•œ ๋‚œ์ˆ˜์— password๋ฌธ์ž์—ด์„ ํ•ฉ์นœ ๋ณ€์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์™€
hash()ํ•จ์ˆ˜๋กœ ์•”ํ˜ธํ™” ์‹œํ‚จ๊ฐ’์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์ธ ํŽ˜์ด์ง€

๋งํฌ(http://funware.shop/index.php)

DB์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์‚ฌ์ดํŠธ์— ๋„์šฐ๊ธฐ

  <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)์™€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

profile
๋‰ด๋น„๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€