λͺ¨μ˜ ν•΄ν‚Ή μŠ€ν„°λ””/λͺ¨μ˜ ν•΄ν‚Ή - 과제

[과제] 02μ£Όμ°¨(1) (성적 확인 νŽ˜μ΄μ§€) μˆ˜μ •λ³Έ (ν•œκΈ€ 였λ₯˜ ν•΄κ²°)

Gearvirus(junyup2) 2023. 11. 3. 14:45
발견된 였λ₯˜

 
 κΈ°μ‘΄μ˜ νŽ˜μ΄μ§€λ₯Ό μ œμž‘ν•  λ•Œ, μž…λ ₯에 λŒ€ν•˜μ—¬ 'ν•œκΈ€' 인 경우λ₯Ό κ³ λ €ν•˜μ§€ μ•Šκ³  'μ˜μ–΄' μž…λ ₯만 μƒκ°ν•˜κ³  μ œμž‘
μŠ€ν„°λ”” 멀버 쀑, ν•œκΈ€ μž…λ ₯ μ•ˆλ¨, ν•œκΈ€ 깨짐 ν˜„μƒ 등이 λ°œμƒ ν•˜μ˜€λ‹€λŠ” 이야기가 λ‚˜μ˜΄
ν•œκΈ€μ„ μΆ”κ°€λ‘œ ν…ŒμŠ€νŠΈ

  • ν•œκΈ€μ„ phpmyadmin μ—μ„œ score_table에 μΆ”κ°€λ‘œ μ‚½μž…

  •  db λ‚΄λΆ€μ—μ„œ SQL query
    • ( SELECT * FROM `score_table` WHERE name = '이쀀엽' ) 으둜 질의 κ²°κ³Ό 

  • μœ„μ™€ 같이 잘 μ°ΎμŒμ„ 확인할 수 μžˆμ—ˆμŒ

κ·ΈλŸ¬λ‚˜ μ—¬κΈ°μ„œ 였λ₯˜ λ°œμƒ !!

 

  • DB에 데이터가 μ‘΄μž¬ν•¨μ—λ„ λΆˆκ΅¬ν•˜κ³  ν•΄λ‹Ή 정보가 μ—†μŒμ„ 좜λ ₯
    • 정보가 μ—†μŒμ„ 좜λ ₯ν•˜λŠ” 경우

score.php

	$sql = "select * from score_table where name='{$_GET['student']}'";
	$result = mysqli_query($db_conn, $sql);
	$row = mysqli_fetch_array($result);
	
	$student_name = $row['name'];
	$student_score = $row['score'];
	if(isset($student_name)){
		echo "<font size = 6>" ."$student_name ν•™μƒμ˜ μ μˆ˜λŠ” $student_score μž…λ‹ˆλ‹€." ."</font>";
	}else{		
		if(isset($_GET['student'])){
			echo "<font size = 6>" ."{$_GET['student']} ν•™μƒμ˜ μ •λ³΄λŠ” μ—†μŠ΅λ‹ˆλ‹€." ."</font>";
		}
	}

 

  • $student_name 에  $_GET['student'] κ³Ό μΌμΉ˜ν•˜λŠ” 정보가 μ—†λŠ” 경우
  • BUT, DBμ—λŠ” ν•΄λ‹Ή 이름이 쑴재.
  • 즉, ν•œκΈ€μ„ μ œλŒ€λ‘œ 받아듀이지 λͺ»ν–ˆλ‹€λŠ” 것.

μ˜ˆμƒλ˜λŠ” 였λ₯˜μ˜ 원인
  • ν•œκΈ€μ˜ 경우 utf-8 ν˜Ήμ€ euc-kr둜만 인식 κ°€λŠ₯
    • 인코딩이 μ œλŒ€λ‘œ λ˜μ§€ μ•Šμ•˜λ‹€κ³  λ³Ό 수 있음
ν•œκΈ€ 인코딩 였λ₯˜λ‘œ 인해 λ°œμƒν•˜λŠ” 문제
  • SELECT μ‹œ ν•œκΈ€μ΄ μ œλŒ€λ‘œ μž…λ ₯λ˜μ§€ μ•ŠλŠ” 경우
  • INSERT μ‹œ ν•œκΈ€μ΄ κΉ¨μ Έμ„œ λ“€μ–΄κ°€λŠ” 경우 

κ°•μ œλ‘œ λ°œμƒμ‹œν‚¨ ν•œκΈ€ 깨짐 였λ₯˜

μ‹œλ„ν•΄λ³Έ ν•΄κ²° λ°©μ•ˆλ“€
  1. <head> μ•ˆμ— utf-8둜 μ„€μ •
    • <meta charset="utf-8">
    • 길게 μ“°λ©΄ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  2. <?php ?> μ•ˆμ— header("Content-Type:text/html;charset=utf-8"); μΆ”κ°€
  3.  form λ©”μ„œλ“œμ— utf-8 μΆ”κ°€
    • <form method="post" action=" " accept-charset="utf-8">
  4. php μ—μ„œ db μ—°κ²° 직후에 λ‹€μŒ 쿼리 μ‹€ν–‰
    • set names utf8;
    • ν•΄λ‹Ή λ°©λ²•μœΌλ‘œ 해결이 μ•ˆλ˜λŠ” 경우(ν•œκΈ€μ΄ μ—¬μ „νžˆ κΉ¨μ§„λ‹€λ©΄) λ‹€μŒ 쿼리 μ‹€ν–‰
      • set session character_set_connection = utf8;
      • set session character_set_results = utf8;
      • set session character_set_client = utf8;
  5. /etc/mysql/my.cnf 파일 μˆ˜μ • - my.cnf νŒŒμΌμ„ 찾을 수 μ—†μ—ˆμŒ
    • [mysqld] ꡬ문 μ•„λž˜μͺ½μ— 인코딩 섀정을 μΆ”κ°€
      • collation-server = utf8_unicode_ci
      • default-character-set = utf8
      • character-set-server = utf8
      • init_connect = set collation_connection = utf8_unicode_ci
      • init_connect = set names utf8
  6. /etc/php/8.1/cli/php.ini 파일 μˆ˜μ •
    • default_charset = "EUC-KR" 둜 μˆ˜μ •
  7. mysqli_query 둜 utf-8 μ„€μ •
    • mysqli_query($conn, "set session character_set_connection=utf8;");
    • mysqli_query($conn, "set session character_set_results=utf8;");
    • mysqli_query($conn, "set session character_set_client=utf8;");
  8. etc... μœ„μ™€ 같은 μ—¬λŸ¬κ°€μ§€λ₯Ό μ‹œλ„ ν•˜μ˜€μœΌλ‚˜ λͺ¨λ‘ μ œλŒ€λ‘œ λ™μž‘ν•˜μ§€ μ•ŠμŒ
    • INSERT μ‹œ 깨짐 ν˜„μƒμ— λŒ€ν•΄μ„œλŠ” μœ„μ˜ 방법듀 쀑 ν•΄κ²° 될 수 있음
    • ν•˜μ§€λ§Œ, λ°œμƒν•œ λ¬Έμ œκ°€ SELECT μ‹œ 인코딩 λ¬Έμ œμ˜€κΈ° λ•Œλ¬Έμ— μœ„μ˜ λ°©λ²•λ‘œλŠ” 해결이 μ•ˆλ˜μ—ˆμŒ

ν•΄κ²° 방법
  • κ²°κ΅­ μ°Ύμ•„μ„œ μ„±κ³΅ν•œ 단 ν•œμ€„μ˜ μ½”λ“œ.
    • λ‹€λ₯Έ 방법도 μžˆμ„ μˆ˜λŠ” μžˆμœΌλ‚˜ 이 μ½”λ“œλ‘œ 해결이 λ˜μ—ˆμŒ

db_connection.php

<?php
    define('DB_SERVER', 'localhost');
    define('DB_USERNAME', '*****');
    define('DB_PASSWORD', '***********');
    define('DB_NAME', 'score');
	
    $db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
    //echo $db_conn ->character_set_name(); # latin1
    $db_conn -> set_charset("utf8");
    //echo $db_conn ->character_set_name(); # utf8
?>

 

  • $db_conn -> set_charset("utf8");
    • ( -> ) ν™”μ‚΄ν‘œμ—°μ‚°μž
  • 깨달은 사싀, μš°μ„ μ‹œ ν•΄μ•Όν•  λ°©ν–₯μ„±
    • λ¬΄ν„±λŒ€κ³  이것저것 λŒ€μž…ν•΄λ³΄λŠ” 것이 μ•„λ‹ˆκ³  μš°μ„  μ–΄λ–€ ν˜•νƒœλ‘œ 인코딩 λ˜μ–΄μžˆλŠ”μ§€ μš°μ„  확인해야 함
      • echo $db_conn ->character_set_name(); λ₯Ό μ΄μš©ν•˜μ—¬ 인코딩 ν˜•μ‹μ„ 확인 κ°€λŠ₯
        • μš°μ„  μ›λž˜ λ“€μ–΄κ°€λ˜ ν˜•μ‹μ„ ν™•μΈν•œ κ²°κ³Ό Latin1 으둜 λ“€μ–΄κ°€λŠ” 것을 확인
          • mysql의 charater set κΈ°λ³Έ μ„€μ •, encoding  μ΄ˆκΈ°κ°’μ΄ latin1으둜 μ„€μ •λ˜μ–΄ μžˆλ‹€κ³  함
        • μœ„μ˜ 인코딩 ν˜•μ‹μ΄ utf-8이 μ•„λ‹ˆμ—ˆκΈ° λ•Œλ¬Έμ— ν•œκΈ€μ΄ μ œλŒ€λ‘œ λ™μž‘ν•˜μ§€ μ•Šμ€ 것 !!
        • $db_conn -> set_charset("utf8"); μ„ μ΄μš©ν•˜μ—¬ utf-8둜 λ³€ν™˜ν•œ κ²°κ³Ό
          • utf8둜 바뀐 것을 확인할 수 μžˆμ—ˆμŒ

μˆ˜μ •λ³Έ κ²°κ³Ό

 

  • μ œλŒ€λ‘œ DB의 λ‚΄μš©μ„ λ°›μ•„μ˜€λŠ” 것을 λ³Ό 수 μžˆμ—ˆμŒ

ν›„κΈ°

 

λ¬Έμ œκ°€ λ°œμƒν•˜μ˜€μ„ λ•Œ λ¬΄ν„±λŒ€κ³  μ°ΎλŠ”λ‹€κ³  ν•΄κ²°λ˜λŠ” 것이 μ•„λ‹˜μ„ λ‹€μ‹œκΈˆ κΉ¨λ‹¬μŒ.

μš°μ„  λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄, μ–΄λ–€ λ¬Έμ œμΈμ§€, 무엇이 λ¬Έμ œμΈμ§€ 등을 μ°Ύμ•„λ‚΄λŠ” 것이 μ€‘μš”.

λ˜ν•œ 인코딩 λ¬Έμ œμ™€ 같이 μ–΄λ–€ ν˜•μ‹μΈμ§€ 확인이 κ°€λŠ₯ν•œ κ²½μš°λ“€μ—μ„œμ™€ 같이 μš°μ„  ν˜„μž¬ 상황 νŒŒμ•…μ΄ μ€‘μš”.

 

 

Reference

 

 

질문 ν™˜μ˜, μˆ˜μ • 및 보완에 λŒ€ν•œ μ§€μ  ν™˜μ˜