PHP & MySQL 닌자 비법서

『PHP & MySQL 닌자 비법서』는 PHP와 MySQL에 대해 아무것도 모르는 사람들을 대상으로 PHP 문법 설명부터 시작해서 단순한 WebPage를 하나씩 고쳐 나가며, 결국 회원 가입이 가능한 유머 사이트를 만드는 과정을 설명한 책이다.

프롤로그에 나온 말대로 건너뛰기는 적절하지 않다. 높은 복잡도의 Web을 만드는 과정을 단번에 설명하는 방식이 아니라, 독자가 PHP 완전 초보에서 고급 개발자로 발전해가는 과정을 통해 조금씩 개선해가는 식의 설명이 되고 있다.

근래에 본 책 중에 가장 몰입해서 볼 수 있었고, 실제 코딩을 하지 않고도 설명을 놓치지 않고 끝까지 볼 수 있도록 친절히 설명되어 있었다. 중간에 지엽적인 부분으로 새버릴까 걱정 스러워 실제 코딩은 책을 끝까지 본 다음 실습해보았다. 아쉬운 점은 책의 소스코드에 경로/파일명이 붙어 있지 않아 간혹 헷갈렸다. 또 github이나 출판사 홈페이지에서 제공하는 소스코드는 몇 chapter에 해당하는 코드인지 찾기 어렵게 되어 있다.

『PHP & MySQL 닌자 비법서』는 PHP와 MySQL에 대해 아무것도 모르는 사람들을 대상으로 PHP 문법 설명부터 시작해서 단순한 WebPage를 하나씩 고쳐 나가며, 결국 회원 가입이 가능한 유머 사이트를 만드는 과정을 설명한 책이다.

내용이 쉽게 쓰여 있어도 양이 방대하고, 책에서 다루는 웹사이트의 진화속도가 빨라 개인적인 이해 차원에서 정리해보았다.


Chapter1. 환경설정


Chapter2. PHP 기본

~ 2.5 기본 문법

2.6 ~ 2.7 상호작용과 Form

2.8 구조화


Chapter3. MySQL


Chapter4. MySQL 데이터와 웹 출력


Chapter5. 관계형 데이터베이스 디자인

Database 모델 고도화


Chapter6. 구조적 프로그래밍


Chapter7. 함수 고도화

1) 함수 고도화 (기존 요구사항 범위에서)

2) 범용 함수화 (author 추가/삭제 기능 추가 시)

3) 중복 코드 제거 (addjoke와 editjoke)


Chapter8. 객체와 클래스

위와 같이 수정하고 나면 사용자가 서비스를 이용하는 흐름은 다음과 같아진다.


[Note Ch2] 작업 디렉토리 vs. 현재 디렉토리

/public/a.php에서 /template/b.php를 참조하고, b.php에서 다시 /include/c.php하는 경우 1

  • 작업 디렉토리 : /public
  • 현재 디렉토리 : a.php에선 /public, b.php에선 /template, c.php에선 /include를 갖는다.

파일을 include 하는 호출코드의 위치에 따라 가리키는 디렉토리가 변화하면 곤란한 상황이 올 수 있기 때문에 항상 자신의 현재 디렉토리를 기준으로 하는 편이 안전하다. 2


[Note Ch3] SQL 에러

mysql error code 1366 incorrect string value

한글을 입력하려고 할 때 위 에러가 발생한다. 해결방법은 2가지가 있다. 3

① /etc/my.cnf 파일을 수정 (다음 내용을 추가)

[mysqld] 
default-character-set=utf8 
default-collation=utf8_general_ci

② table character set 수정

ALTER TABLE 테이블이름 convert to charset utf8

mysql error code 1046 No database selected

workbench에서 table 생성 시 발생하는 에러다. 어떤 DB에 table을 만들지 지정해주지 않았기 때문에 발생하는 에러다.

workbench에서 DB를 선택하고 오른쪽 마우스로 set as default schema 메뉴를 선택하고 create table하면 해결 가능하다. 4


[Note Ch4] SQL 쿼리 전송

$affectedRows = $pdo->exec($query);

  • create table
  • delete
  • insert
  • update

$pdoStatement = $pdo->query($sql);

  • select

결과 활용 방법

  • while ($row = $pdoStatement->fetch()
  • foreach ($pdostatement as $row)

$pdoStatement = $pdo->prepare($sql); 5

사용자가 입력한 데이터를 insert할 때 SQL Injection Attack을 피하기 위해, 다음과 같이 insert를 실행한다. 전체 구문은 다음과 같다.

$pdoStatement = $pdo->prepare($sql);
$pdoStatement->bindValue(':자리표시자', 입력값);
$pdoStatement->execute();

[Note Ch05] 단순/다대다 관계

one-to-one 관계 >> 단독 테이블로 구성

유머 글 ‘유머 내용’과 ‘유머 등록 일자’의 관계와 같다.

joketextjokedate
전구 하나를 갈려면 ….2019-08-28

many-to-one 관계 >> 테이블 분리 구성

여러 개의 ‘유머 글’을 1명의 저자가 올리는 경우와 같다. 아래와 같이 구성하면 많은 문제점을 유발할 수 있다. (update anomaly)

joketextnameemail
전구 하나를 갈려면 …Kevin Yankthatouv@kevin …
!false는 앗! 거짓이라…Kevin Yankthatouv@kevin …

위 테이블은 아래와 같이 2개로 분리한다.

joketextauthorid
전구 하나…1
authoridnameemail
1Kevinthat@

many-to-many 관계 >> Lookup 테이블 사용

1개의 ‘유머 글’이 ‘정치’ 카테고리에도 속하고, ‘시사’ 카테고리에 속할 수도 있다. 또 ‘정치’ 카테고리 글에는 여러 개의 다른 ‘유머 글’도 해당된다.

joke

idjoketext
1

jokecategory

jokeidcatid
12

category

idname
2Law…

Footnotes

  1. 2.8.2 보안 고려 사항 (81p)
  2. 만약 b.php에서 c.php를 호출하는 경우 작업 디렉토리는 /template으로 바뀌기 때문이다.
  3. https://redapply.tistory.com/entry/mysql-한글입력에러-ERROR-1366-HY000-incorrect-string-value
    https://www.hooni.net/xe/study/79498
  4. http://blog.naver.com/skybrend/90155188520
  5. ch 4의 sql injection attack 참조

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다