Web- php에서 mysql제어하기

반응형

1.  DB관련 php 파일 생성
 
  # vi db.php
  
  <?php
  // connect to mysql database
  // #> mysql -h localhost -u root -p
  $ link = mysql_connect( 'localhost' , 'root' , '123' ); -> 연결
  ==> 연결에 성공하면 식별자를 리턴해주고 그 식별자가 select_db의 두번째 인자로 들어간다.
  이것은 여러 dbms가 존재하는 경우 어떤 dbms에 접근하는지를 명확하게 해야하기 때문에 필요하다.
  하나의 dbms만 있으면 사용하지 않아도 된다.
  
  if( $link === False )
  {
   //die( "mysql connect error : " . mysql_error() );
   // die 함수 : 메시지를 출력해주고 php 프로그램을 종료시키는 함수
   // mysql_error() : 가장 마지막에 생성된 에러 메시지를 가져오는 함수
   exit(); -> 에러 메시지가 출력되면 보안에 취약해질 수 있으므로 그냥 종료시키는 것이 제일 좋다.
  }

  // mysql> use user;
  $ret = mysql_select_db( 'user' , $link ); -> DB 선택
  if( $ret === False )
  {      
    //die( "mysql db select error : " . mysql_error() );
    exit();
  }
  

  ?>

 
 2.  php를 통해 DB 쿼리 사용해보기 ( 실제 코드를 통해서 데이터를 다뤄보기 )
 
  mysql_query([쿼리 입력]) : query문 실행해주는 함수
  (쿼리는 문자열로 전달한다.)
  
  일단 데이터 모두 삭제!
  mysql> delete from user_info;
  Query OK, 2 rows affected (0.00 sec)

  mysql> select * from user_info;
  Empty set (0.00 sec)

  1. 입력 , 수정 , 삭제
  
   쿼리가 실행되었는가/되지않았는가?
  
   mysql_query() returns TRUE on success or FALSE on error.
  
  2. 조회
  
   조건에 맞는 조회된 데이터가 없는가/있는가?
   즉, 결과가 있든 없든 제대로 실행되면 success
   오타나 다른 문제로 인한 것은 false
  
   mysql_query() returns a resource on success, or FALSE on error.
   
   mysql_num_rows()
   mysql_fetch_array()
   mysql_fetch_assoc()
   mysql_fetch_row()

  -> 리턴되는 값이 다르다는 점을 주의!
  
  
  
  <?php
  // connect to mysql database
  // #> mysql -h localhost -u root -p
  $link = mysql_connect( 'localhost' , 'root' , '123' );
  if( $link === False )
  {
    //die( "mysql connect error : " . mysql_error() );
    // die 함수 : 메시지를 출력해주고 php 프로그램을 종료시키는 함수
    // mysql_error() : 가장 마지막에 생성된 에러 메시지를 가져오는 함수
    // die함수는 오류 내용이 노출되므로 보안상 좋지않다.
    exit();
  }

  // mysql> use user;
  $ret = mysql_select_db( 'user' , $link );
  if( $ret === False )
  {
    //die( "mysql db select error : " . mysql_error() );
    exit();
  }

  // $_REQUEST : GET/POST 방식을 구별하지 않고 데이터를 담을 수 있는 변수
  if( !isset( $_REQUEST[id] ) || !isset( $_REQUEST[pw] ) || $_REQUEST[id] === '' || $_REQUEST[pw] === '' )
  {
  ?>
    <form method=POST action=db.php>
      <input type=text name=id placeholder='name'> <br>
      <input type=password name=pw placeholder='password here'> <br>

      <input type=submit value='join'>
    </form>
    // if문이 실행된다면 위의 form 내용만 클라이언트에게 전달된다.
    // if로 막아놔야 값이 있을 경우 else가 실행되고 값이 없다면 계속 form이 뜨게 되는 것
  <?php
  }
  else
  {
    $id = $_POST[id];
    $pw = $_POST[pw];       // POST변수를 써도 상관없음!
    $query = "INSERT INTO user_info( id , pw ) VALUE( '$id' , md5('$pw') )";
    // php에서는 세미콜론 생략!!
    // md5는 mysql에서 실행되는 것! ( 문자열로 전달될뿐 sql 쿼리이므로!! )
    
    $resource = mysql_query( $query );
    if( $resource )
    {
     $cnt = mysql_num_rows( $resource );
     echo "number of rows : " . $cnt . "<br>";
     
     /*
     while( $row = mysql_fetch_array( $resource , MYSQL_BOTH ) )
     {
      print_r( $row );
     }
     */

     for( $i = $cnt ; $i > 0 ; $i-- )
     {
      $row = mysql_fetch_array( $resource , MYSQL_BOTH );
      print_r( $row );
     }
     exit(); // insert문 실행되기 전에 종료하기 위해서
    }

    $query = "INSERT INTO user_info( id , pw ) VALUE( '$id' , md5('$pw') )"; 
    // php에서는 쿼리문의 세미콜론 생략!!
    // md5는 mysql에서 실행되는 것!


    $ret = mysql_query( $query );   // true 또는 false 중 하나만 리턴된다.
    if( !$ret )
    {
      //die( 'mysql INSERT ERROR: ' . mysql_error() );
    }
  }
  ?>

  // auto_increment는 데이터가 삭제되어도 처음부터 시작하지 않고 삭제된 다음 수를 시작으로 계속 증가한다.
  
  // join버튼을 누르면 다시 db.php가 처음부터 새로 실행된다. 그래서 값이 있으면 else문이
     값이 없으면 if문이 실행된다.
  
  // mysql_num_rows() : select를 실행한 결과의 라인수를 얻어올 수 있다.
  // mysql_fetch_assoc() : 컬럼의 이름을 키로 사용하는 함수
     mysql_fetch_row() : 행의 결과를 배열 형태로 리턴함 -> resource가 있어야만 함수 사용 가능 ( 한 줄만 리턴 )
        -> 숫자를 키로 사용하는 함수
     mysql_fetch_array() : 키 값을 가져올 때 타입을 정하는 함수 ( MYSQL_NUM , MYSQL_ASSOC , MYSQL_BOTH )
  
  
[실습]

 - 이미 존재하는 사용자라면 입력받은 값으로 새로 업데이트 할 수 있도록 수정

 <?php
 // connect to mysql database
 // #> mysql -h localhost -u root -p
 $link = mysql_connect( 'localhost' , 'root' , '123' );

 if( $link === False )
 {
  //die( "mysql connect error : " . mysql_error() );
  // die 함수 : 메시지를 출력해주고 php 프로그램을 종료시키는 함수
  // mysql_error() : 가장 마지막에 생성된 에러 메시지를 가져오는 함수
  exit();
 }

 // mysql> use user;
 $ret = mysql_select_db( 'user' , $link );
 if( $ret === False )
 {
  //die( "mysql db select error : " . mysql_error() );
  exit();
 }

 if( !isset( $_REQUEST[id] ) || !isset( $_REQUEST[pw] ) || $_REQUEST[id] === '' || $_REQUEST[pw] === '' )
 {
 ?>
  <form method=POST action=db.php>
   <input type=text name=id placeholder='name'> <br>
   <input type=password name=pw placeholder='password here'> <br>

   <input type=submit value='join'>
  </form>
 <?php
 }
 else
 {
  $id = $_POST[id];
  $pw = $_POST[pw]; // POST변수를 써도 상관없음!

  // id 중복 확인
  $query = "SELECT * FROM user_info WHERE id='$id'"; // 입력된 사용자 id와 일치하는 컬럼이 있는지 확인
  $resource = mysql_query( $query );
  $cnt = mysql_num_rows( $resource );

  if( $cnt != 0 )
  {
   for( $i = $cnt ; $i > 0 ; $i-- )
   {
    $update = "UPDATE user_info SET pw=md5('$pw') WHERE id='$id'";
    mysql_query( $update );
   }
  }
  else
  { 
   $query = "INSERT INTO user_info( id , pw ) VALUE( '$id' , md5('$pw') )"; 

   $ret = mysql_query( $query ); // true 또는 false 중 하나만 리턴된다.
   if( !$ret )
   {
    die( 'mysql INSERT ERROR: ' . mysql_error() );
   }
  } 
 }
 ?>

반응형
LIST

댓글()