14 단원 DB 연동에필요한함수익히기 1. 주요 MySQL API 개념익히기 2. 실습하기 1/10
1. 주요 MySQL API 개념익히기 지금부터우리는 PHP에서지원하는 MySQL API에대해서공부해봅시다. 우선 API란무엇인가에대해서알아봅시다. API [application programming interface] 의약자를 API라고부릅니다. 소프트웨어애플리케이션을개발하기위한여러가지함수의집합이나, 운영체제나 C, C++, Pascal 등과같은언어에서지원되는함수의집합을일컬어서 API라고합니다. MySQL 프로그래밍인터페이스 (API) 는 msql에대한 C API의상위집합으로, 1994년 David Hughes에의해서개발되었습니다. 이제부터본격적으로많이사용되는 API에대해서익혀보기로합시다. 이것보다더많은 API가제공되지만, 우리는많이사용하는부분만을다루어볼것입니다. 그러니여러분들은나머지것들도무엇있는지사이트에가셔서참고하시기바랍니다. mysql_connect ( [string host [,string username [,string userpass]]] ) : MySQL 서버에접속시사용되는함수입니다. Host : 서버의경로를의미합니다. 보통 localhost라고씁니다. Username : 데이터베이스에접근가능한계정입니다. Userpass : 접근가능한계정이가진비밀번호입니다. 접속에성공하면접속상태를, 그렇지않으면에러메시지를반환한다. mysql_connect() 을이용하여 MySQL 서버에접속을할수있습니다. 함수이름앞에 '@' 를붙임으로써에러메시지가출력되지않도록할수도있습니다. or die (" 접속할수없습니다 "); print (" 접속되었습니다 "); mysql_close ($conn); 이예제에서 or die() 구문은함수가 mysql_connect 함수의결과가 false인경우에수행되는것이며, die함수는해당메시지를출력한후에서버와의연결을끊게됩니다. 2/10
- mysql_query(string query [, int link_identifier]): 주어진쿼리문을실행합니다. link identifier는 MySQL과접속링크로만약지정되지않는다면, 함수는 MySQL 서버에서접속된링크를찾아대체합니다. mysql_query() 는현재서버에서동작중인데이터베이스로부터특정질의문을전송합니다. mysql_query() 함수는질의성공여부에따라 TRUE(0이아닌값 ) 또는 FALSE를반환합니다. 서버로부터실행된질의가실행되고그질의문에문제가없어야만, TRUE값을반환한다. $result = mysql_query ("SELECT * from test") or die (" 잘못된질의를실행했습니다!!"); - mysql_select_db ( string database_name [, int link_identifier]) : MySQL 데이터베이스를선택합니다. Mysql 데이타베이스를선택합니다. 성공하면 True, 실패하면 False를돌려줍니다. mysql_select_db("myuser", $conn); $result = mysql_query("select * from bbs", $conn); - mysql_db_query ( string database, string query [, int link_identifier]) : MySQL 질의문을전송합니다. 주어진 database내에서 query를실행합니다. 성공하면 True를실패하면 False를돌려줍니다. mysql_select_db("myuser", $conn); $query = "select id from tablename"; mysql_query($query, $conn); - mysql_result ( int result, int row [, mixed field]) : mysql_query의결과인 result에서 row번째레코드에서자료를가져옵니다. field는필드의 offset이나필드명을사용할수있습니다. $result = mysql_query("select * from tablename", $conn); $no = mysql_result($reuslt, 0, 0); // $no = mysql_result($result, 0, "no"); // 위문장과동일한결과 3/10
위예제는 0 번째레코드의 no 필드를구하는것입니다. - mysql_affected_rows([int link_identifier]) : 최근 MySQL 작업으로처리된행 (row) 개수를얻을때사용되는함수입니다. mysql_affected_rows() 는접속되어있는서버에서최근실행된 INSERT, UPDATE, DELETE 질의로처리된행의개수를돌려줍니다. 마지막질의가 WHERE 절이없는 DELETE 질의라면, 테이블의모든레코드가삭제되어 0값을돌려줍니다. 이함수는 SELECT 문에는동작하지않으며, 레코드가수정되는경우에만동작합니다. mysql_select_db("myuser", $conn); $result = mysql_query("select * from tablename", $conn); $num = mysql_affected_rows($conn); - mysql_close([int link_identifier]) : MySQL 접속을닫을때사용하는함수입니다. 성공하면 TRUE값을실패하면 FALSE값을반환합니다. mysql_close() 는비영구적으로열려진링크에서는일반적으로스크립트 (script) 실행마지막부분에서자동으로종료되기때문에생략가능합니다. 여기서사용하는각함수예제에서도이구문을생략하고있습니다. or die (" 접속할수없습니다 "); print (" 접속되었습니다 "); mysql_close ($conn); - mysql_create_db( string database name [, int link_identifier]) : MySQL 데이터베이스를생성합니다. or die (" 접속할수없습니다 "); if (mysql_create_db ("my_db")) { print (" 데이터베이스를생성하였습니다 "); else { printf (" 데이터베이스생성에러 "); 4/10
- mysql_db_name( int result, int row [, mixed field]) : 데이터베이스명을가져옵니다. - mysql_drop_db( string database_name [, int link_identifier]) : MySQL 데이터베이스를삭제합니다. 성공하면 TRUE, 실패하면 FALSE를반환합니다. $dblist = mysql_list_dbs($dbname) $i=0 while( $name = mysql_db_name($dblist, $i)) { if( $name == "mydb" ) { $foundit = true; mysql_drop_db("mydb",$dbname) $i++; 이예제는 MySQL 서버에있는모든데이터베이스를불러와서 mydb{ 마이디비 데이터베이스를삭제하는기능을수행합니다. 여기서사용된 mysql_list_dbs { 마이에스큐엘리스트디비에스 함수는 MySQL 서버에있는데이터베이스이름을반환하는기능을합니다. - mysql_errno( [int link_identifier]) : 최근 MySQL 작업으로발생한에러번호를반환합니다. - mysql_error( [int link_identifier]) : 최근실행된 MySQL 작업으로발생한에러메시지를반환합니다. mysql_connect (host, username, userpass); echo mysql_errno().": ".mysql_error()."<br>"; mysql_select_db("dbname"); echo mysql_errno().": ".mysql_error()."<br>"; $conn = mysql_query("select * FROM tablename"); echo mysql_errno().": ".mysql_error()."<br>"; 5/10
- mysql_fetch_array ( int result [, int result_type]) : 결과를필드이름색인또는숫자색인으로된배열로반환합니다. 예를들어다음과같은 test 라는테이블이있다고하면, no id Name 1 id01 홍길동 2 id02 유관순 $query = "SELECT * FROM test WHERE no=1"; $result = mysql_query($query, $connect); $row = mysql_fetch_array($result); 의결과는다음과같은배열로저장이됩니다. $row[no] => 1 $row[id] => id01 $row[name] => 홍길동 - mysql_fetch_field ( int result [, int field_offset]) : 결과로부터열정보를얻어서객체로반환합니다. < 객체의속성 > name - column의이름 table - 현제 column이속해있는테이블이름 max_length - column의최대길이 not_null - column이 null이될수없으면 1 primary_key - column이 primary key면 1 unique_key - column이 unique key면 1 multiple_key - column이 non-unique key면 1 numeric - column이숫자형이면 1 blob - column이 blob형이면 1 type - column의형태 unsiged - column이 unsiged형태이면 1 zerofill - column이 0으로채워져있으면 1 $db = mysql_connect("localhost", username", "userpasswd"); mysql_select_db("test_db", $db); $query = "SELECT * FROM test_db"; 6/10
$mysql_result = mysql_db_query("test_db", $query, $db); while($field = mysql_fetch_field($mysql_result)) { print ("<br>".$field->name); // 열의이름 print ("<br>".$field->table); // 열을가져온테이블이름 print ("<br>".$field->max_length); // 열의최대길이 print ("<br>".$field->not_null); //1( 열이 null로안될경우 ) print ("<br>".$field->primary_key); //1( 열이기본키인경우 ) print ("<br>".$field->unique_key); //1( 열이유일키인경우 ) print ("<br>".$field->multiple_key); //1( 열이 non-unique 키인경우 ) print ("<br>".$field->numeric); //1( 열이숫자인경우 ) print ("<br>".$field->blob); //1( 열이 BLOB인경우 ) print ("<br>".$field->type); // 열의형식 print ("<br>".$field->unsigned); //1( 열이 unsigned인경우 ) print ("<br>".$field->zerofill); //1( 열이 zero-filled인경우 ) mysql_close($db); 이예제는 test_db 테이블의필드정보를출력하는기능을수행합니다. - mysql_fetch_row ( int result) : 결과를숫자색인으로된배열로반환합니다. 쿼리결과 result에서하나의레코드를일반배열의형태로가져온다. 함수실행후 result의내부포인트가증가합니다. 더이상가져올값이없으면 False를돌려줍니다. $conn = mysql_connect (host, username, userpass); mysql_select_db("dbname", $conn); $result = mysql_query("select * from tablename", $conn); mysql_close($conn); while($test = mysql_fetch_row( $result ) ) { echo $test[0]. $test[1]. $test[2]. "<br>"; - mysql_field_name ( int result, int field_index) : 결과로부터특정필드명을반환합니다. 7/10
mysql_field_name() 은특정필드색인값을얻습니다. field_index는 0부터시작하는값입니다. $link = mysql_connect (host, username, userpass) or die (" 접속할수없습니다 "); $res = mysql_db_query("dbname", "select * from tablename", $link); echo mysql_field_name($res, 0). "<br>"; echo mysql_field_name($res, 2); - mysql_field_type ( int result, int field_offset) : 결과로부터필드의데이터형을반환합니다. - mysql_insert_id ( [int link_identifier]) : 최근 INSERT 작업으로부터생성된값을반환합니다. mysql_insert_id() 는이전질의가 AUTO_INCREMENT값으로생성되지않으면, 0을반환합니다. 마지막으로저장된값이필요하다면, 질의로값을추가한직후 mysql_insert_id() 를사용하면됩니다. - mysql_list_tables ( string database [, int link_identifier]) : MySQL 데이터베이스에있는테이블목록을반환합니다. - mysql_num_fields ( int result) : 결과로부터필드개수를반환합니다. 주어진쿼리결과 result내의필드개수를돌려줍니다. - mysql_num_rows ( int result) : 결과로부터행개수를반환합니다쿼리결과 result의전체레코드수를구할수있습니다. SELECT문에대한결과에만사용할수있습니다. $result = mysql_result("select * from test", $conn); $rows = mysql_num_rows($result); echo $rows; - mysql_pconnect ( [string hostname [, string username [, string password]]]) : MySQL 서버와영구적인데이터베이스접속성공시에는지속적연결 id를실패시에는 False를돌려줍니다. mysql_connect() 함수가사용되는모든곳에대체하여사용될수있으나 mysql_connect() 함수와다른점은크게두가지가있습니다. 첫째는같은호스트, 유저, 패스워드로이미열려져있는연결이있는지확인해셔있으면먼저열려진연결 8/10
id를돌려줍니다. 둘째는연결상태는스크립크가끝날때닫히지만나중에다시쓸때를위해서 id는남습니다. 주의사항은 mysql_pconnect() 함수로열려진지속적인연결이많을경우 mysql 서버에부하를주게되어전체적인성능과속도가저하될수있습니다. - mysql_tablename ( int result, int i) : 테이블의이름을불러옵니다. 2. 실습하기 지금부터실습을해보도록하겠습니다. 디비에접속해서접속한계정의데이터베이스안에어떤테이블이있는지테이블목록을반환해오며, 그테이블중에하나를택해서레코드들을가져오는프로그램을작성해보도록하겠습니다 $db = mysql_select_db("myuser", $conn); If($db){ $result = mysql_list_tables ("myuser"); $i = 0; while ($i < mysql_num_rows ($result)) { $tablenames[$i] = mysql_tablename ($result, $i); echo $tablenames[$i]. "<BR>"; $i++; $query=mysql_query("select * from bbs order by idx"); while($array=mysql_fetch_array($query)){ echo $array[name]. "-".$array[title]. "<br>"; else{ echo (" 데이터베이스가선택되지않았습니다 "); mysql_connect(host,user,password) 함수를이용해서데이터베이스에접속을시도합니다. 9/10
localhost는데이터베이스랑소스코드가같은컴퓨터에있는경우에는 host 자체를내컴퓨터인 localhost로잡습니다. myuser는데이터베이스등록시킨계정입니다. 그리고 mypasswd는그계정의비밀번호입니다그정보를변수 $conn에담습니다. 그리고 mysql_select_db() 함수는 myuser라는디비를아까접속정보를저장한 $conn으로사용하겠다른의미입니다. 그정보를이번에는 $db라는변수에담게됩니다. $db변수에는접속이성공하면 true, 접속이실패하면 false를반환합니다. 조건식 if에 $db변수에지정된값을넣어서성공이면 if문구절이실행되도록그렇지않다면 else 구문이실행되도록나누어놓은것입니다. if문구절을보시면 myuser디비안에있는테이블목록을불러옵니다. 그리고 while() 문에서목록이끝을만날때까지테이블의이름을불러옵니다. 그리고그뒤로나오는구문은테이블에있는내용을가져올때쓰는문구입니다 $query=mysql_query("select * from bbs order by idx"); select는 SQL질의어로서 db에서적용되는언어입니다. 우리는이언어를사용해서디비의내용을가져와야하는데, php에서는그언어를바로사용할수없기때문에, api를이용해서내용을가져오게됩니다. bbs 테이블의있는모든내용을 idx칼럼의오름차순대로가져오라는명령이구요, 이명령을실행시키는것이 mysql_query() 입니다. 그정보를 $query 변수에담은다음, mysql_fetch_array() 라는함수를이용해서 $query 변수에담긴내용을배열로받습니다. 그배열의이름이 $array이구요, 값을찍어낼때배열모양으로 echo() 함수를이용해서찍어내시면됩니다. 웹에서한줄띄어쓰기는 <br> 이기때문에그문구를사용했습니다. echo $array[name]. "-".$array[title]. "<br>"; 그리고 $conn 계정으로디비가제대로선택되지못했다면 else구문인아래와같은글을 echo() 라는함수를통해찍어낼겁니다. " 데이터베이스가선택되지않았습니다 " 10/10