성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: 맑은 고딕, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>.NET 개발자가 처음 해보는 PHP + MySQL 연동</h1><br /> <p> <a target='tab' href='https://www.sysnet.pe.kr/2/0/1040'>PHP를 완벽하게 살펴본 것</a>은 아니지만, C/C++ 개발자에게는 다가서기가 상당히 쉬운 언어군요. 문법 자체가 거의 비슷하기 때문에 시간을 별로 투자하지 않아도 쉽게 익힐 수 있으니, 다중 언어에 대한 호기심이 있는 C/C++ 개발자라면 자신감을 얻는 차원에서 ^^ 첫 언어를 PHP로 선택하는 것도 나쁘진 않을 것 같습니다.<br /> <br /> 일단 문법은 그렇다 치고, 나머지는 이제 부가적인 함수를 익혀야 하는 문제가 남았는데요. 사실, PHP가 웹 스크립트로 주로 쓰이다 보니 필연적으로 엮이게 되는 것이 바로 DB 연동입니다. DB 중에서도 PHP와 가장 많이 쓰여지는 것이 MySQL이고, 그래서 수많은 PHP 함수들을 제치고 단지 MySQL DB와 관련된 것들만 간단하게 테스트 해보았습니다.<br /> <br /> 이를 위해서 현재 (2011-06-02) 기준으로 5.1.57 버전의 MySQL을 아래의 사이트에 방문해서 다운로드했습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > MySQL 윈도우즈 설치 (Windows Install) ; <a target='tab' href='http://breakpoint.tistory.com/50'>http://breakpoint.tistory.com/50</a> </pre> <br /> 다운로드할 수 있는 여러 링크가 제공되는 데, 제 경우에는 설치 버전보다는 단순히 압축된 파일 유형의 ZIP 파일을 내려받았습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Windows (x86, 32-bit), ZIP Archive - mysql-noinstall-5.1.57-win32.zip ; <a target='tab' href='http://dev.mysql.com/downloads/mysql/5.1.html'>http://dev.mysql.com/downloads/mysql/5.1.html</a> (참고로, mysql-5.1.57.zip 파일은 소스 코드임) </pre> <br /> 다음과 같이 d:\mysql 폴더에 압축을 풀고,<br /> <br /> <img alt='how_to_install_mysql_1.png' src='/SysWebRes/bbs/how_to_install_mysql_1.png' /><br /> <br /> 일단, 실행이 잘 되는지 먼저 테스트해 보았습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > C:\temp><b style='COLOR: blue'>cd /d d:\mysql\bin</b> d:\mysql\bin><b style='COLOR: blue'>mysqld --console</b> 110602 0:28:31 [Note] Plugin 'FEDERATED' is disabled. 110602 0:28:31 InnoDB: Initializing buffer pool, size = 8.0M 110602 0:28:31 InnoDB: Completed initialization of buffer pool InnoDB: The log sequence number in ibdata files does not match InnoDB: the log sequence number in the ib_logfiles! 110602 0:28:31 InnoDB: Database was not shut down normally! InnoDB: Starting crash recovery. InnoDB: Reading tablespace information from the .ibd files... InnoDB: Restoring possible half-written data pages from the doublewrite InnoDB: buffer... 110602 0:28:32 InnoDB: Started; log sequence number 0 44233 110602 0:28:32 [Note] Event Scheduler: Loaded 0 events 110602 0:28:32 [Note] mysqld: ready for connections. Version: '5.1.57-community' socket: '' <b style='COLOR: blue'>port: 3306</b> MySQL Community Server (GPL) </pre> <br /> 종료는 콘솔 화면에서 "Ctrl + C" 키를 누르거나 별도의 콘솔 화면에서 다음과 같이 mysqladmin.exe를 실행해 주면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > d:\mysql\bin><b style='COLOR: blue'>mysqladmin -u root shutdown</b> </pre> <br /> 윈도우 환경에서는, 당연히 NT 서비스로 등록해 두어야 겠지요. ^^ 관리자 권한으로 명령행 창을 띄우고, 다음과 같이 입력해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > D:\mysql\bin><b style='COLOR: blue'>mysqld --install</b> Service successfully installed. D:\mysql\bin><b style='COLOR: blue'>net start mysql</b> The MySQL service is starting. The MySQL service was started successfully. /* 서비스 등록 해제는 "mysqld --remove" */ </pre> <br /> PHP 테스트까지 /htdocs/test2.php 파일을 만들어서 해보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > <?php echo "test is good!<br>"; <b style='COLOR: blue'>mysql_connect("", "", "");</b> ?> </pre> <br /> 웬일인지 다음과 같은 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > test is good! Fatal error: <b style='COLOR: blue'>Call to undefined function mysql_connect()</b> in D:\httpd_build\Apache22\htdocs\hello2.php on line 5 </pre> <br /> 확인해 보니, 외부 PHP 함수들이 기본적으로 활성화되어 있지 않기 때문에, php.ini 파일을 이용해서 그에 대한 PHP 확장 모듈을 명시적으로 로드해야 한다고 합니다. 그래서 "D:\httpd_build\Apache22\bin\php.ini" 파일의 내용 중에서 다음과 같은 설정을 포함(또는 주석 해제)시켜줘야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > extension=php_mysql.dll </pre> <br /> 변경된 php.ini를 저장하고, 아파치를 재시작하면 정상적으로 mysql_connect 함수가 실행되는 것을 확인할 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 설치가 되었으니, 이제 기본적인 MySQL 사용법을 알아보겠습니다. 잠깐 뚝딱거리다 보니, Firebird가 생각나더군요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > .NET 프로그래머에게도 유용한 Firebird 무료 데이터베이스 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1038'>http://www.sysnet.pe.kr/2/0/1038</a> </pre> <br /> 명령행으로 살펴보는 방법이 전체적으로 Firebird와 비슷한 면이 있습니다. 차이점이라면, isql.exe 대신 mysql.exe를 실행한다는 정도이고 그 외에 실행하는 명령어나 사용법이 비슷합니다. 프로그램 언어처럼, 'DB 사용법'도 하나를 익히면 다른 것을 익히는 것이 편하군요. ^^<br /> <br /> <div style='font-size: 12pt; font-family: 맑은 고딕, Consolas; color: #2211AA; text-align: left; font-weight: bold'>계정 생성</div><br /> <br /> 설치 버전이 아닌 압축 파일을 해제해서 MySQL을 설치했으므로, 기본적으로 root 관리자 계정에는 암호가 할당되어 있지 않습니다. 따라서 mysql.exe를 다음과 같이 실행하면 root 계정으로 로그인이 가능하고 'show databases' 명령어를 이용해서 DB 목록 나열 및 'use' 명령어를 이용해서 DB 전환을 할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > d:\mysql\bin><b style='COLOR: blue'>mysql -u root</b> Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 16 Server version: 5.1.57-community MySQL Community Server (GPL) Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL v2 license Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> <b style='COLOR: blue'>show databases;</b> +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | +--------------------+ 3 rows in set (0.00 sec) mysql> <b style='COLOR: blue'>use mysql;</b> Database changed </pre> <br /> 참고로, '-u root' 옵션 없이 mysql만 입력해서 들어가라고 설명하는 웹 자료를 볼 수 있는데 예전에는 가능했을지 모르지만 지금은 다음과 같은 식으로 오류 메시지가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > d:\mysql\bin><b style='COLOR: blue'>mysql</b> Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 17 Server version: 5.1.57-community MySQL Community Server (GPL) Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL v2 license Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> <b style='COLOR: blue'>show databases;</b> +--------------------+ | Database | +--------------------+ | information_schema | | test | +--------------------+ 2 rows in set (0.00 sec) mysql> <b style='COLOR: blue'>use mysql;</b> <b style='COLOR: blue'>ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'</b> </pre> <br /> MySQL에서 계정 생성은 곧, 'mysql' DB의 user 테이블에 사용자 정보를 입력하는 것과 같습니다. 따라서 다음과 같은 명령어로 새로운 사용자를 추가할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > mysql> <b style='COLOR: blue'>insert into user(host, user, password) values ('localhost', 'mytest', password('mypassword'));</b> Query OK, 1 row affected, 3 warnings (0.01 sec) mysql> <b style='COLOR: blue'>select host, user, password from user;</b> +-----------+--------+-------------------------------------------+ | host | user | password | +-----------+--------+-------------------------------------------+ | localhost | root | | | 127.0.0.1 | root | | | localhost | | | | localhost | mytest | *FABE5483D5AADF36D528AC443D117BE1181B9725 | +-----------+--------+-------------------------------------------+ 4 rows in set (0.00 sec) </pre> <br /> 그럼, 생성된 계정으로 로그인을 해볼까요?<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > d:\mysql\bin><b style='COLOR: blue'>mysql</b> <b style='COLOR: blue'>-u</b>mytest <b style='COLOR: blue'>-p</b>mypassword ERROR 1045 (28000): Access denied for user 'mytest'@'localhost' (using password: YES) </pre> <br /> 오류가 나는군요. 왜냐하면 MySQL은 user와 db 테이블의 변경사항을 실행 중인 mysqld.exe 프로세스에 반영하기 위해서는 flush 명령어를 실행시켜줘야 하기 때문입니다. (또는 명령행에서 "mysqladmin.exe reload"라고 실행시키거나, MySQL NT 서비스를 재시작해도 됩니다.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > mysql> <b style='COLOR: blue'>flush privileges;</b> Query OK, 0 rows affected (0.00 sec) mysql> <b style='COLOR: blue'>quit;</b> Bye d:\mysql\bin><b style='COLOR: blue'>mysql -umytest -pmypassword</b> Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 31 Server version: 5.1.57-community MySQL Community Server (GPL) Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL v2 license Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. </pre> <br /> <div style='font-size: 12pt; font-family: 맑은 고딕, Consolas; color: #2211AA; text-align: left; font-weight: bold'>새로운 데이터베이스 생성</div><br /> <br /> 사용자처럼 본래의 SQL 쿼리에서 정해지지 않은 관리적인 요소들은 mysql의 경우 철저하게 mysql DB에 정의되어 있는 테이블들과 연동하는 것 같습니다. 반면에 그 외에 일반적인 SQL 쿼리로 되는 것들은 다른 DB와 마찬가지로 그에 따른 DDL로 해결하고 있습니다. 그래서, 데이터베이스 생성 방법은 아래와 같이 일반적인 'Create Database' 구문으로 해결할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > mysql> <b style='COLOR: blue'>create database mytestdb;</b> Query OK, 1 row affected (0.01 sec) mysql> <b style='COLOR: blue'>show databases;</b> +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | <b style='COLOR: blue'>mytestdb</b> | | test | +--------------------+ 4 rows in set (0.00 sec) </pre> <br /> 만약 데이터베이스를 삭제하고 싶다면 다음과 같이 drop database 명령어를 주면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > mysql> <b style='COLOR: blue'>drop database mytestdb;</b> Query OK, 1 row affected (0.01 sec) </pre> <br /> <div style='font-size: 12pt; font-family: 맑은 고딕, Consolas; color: #2211AA; text-align: left; font-weight: bold'>데이터베이스에 사용자 권한 부여</div><br /> <br /> 다시, '사용자 권한'은 '관리 요소'에 해당하기 때문에, 위에서 언급했던 것처럼 mysql DB 내의 테이블에 값을 입력해 줘야 합니다. 즉, 특정 데이터베이스에 대해 사용자를 연관시키려면 mysql DB의 db 테이블에 항목을 추가하는 것으로 해결되는데, 아래는 db 테이블의 구조를 보여주고 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > mysql> <b style='COLOR: blue'>use mysql;</b> Database changed mysql> <b style='COLOR: blue'>desc db;</b> +-----------------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------------+---------------+------+-----+---------+-------+ | Host | char(60) | NO | PRI | | | | Db | char(64) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Select_priv | enum('N','Y') | NO | | N | | | Insert_priv | enum('N','Y') | NO | | N | | | Update_priv | enum('N','Y') | NO | | N | | | Delete_priv | enum('N','Y') | NO | | N | | | Create_priv | enum('N','Y') | NO | | N | | | Drop_priv | enum('N','Y') | NO | | N | | | Grant_priv | enum('N','Y') | NO | | N | | | References_priv | enum('N','Y') | NO | | N | | | Index_priv | enum('N','Y') | NO | | N | | | Alter_priv | enum('N','Y') | NO | | N | | | Create_tmp_table_priv | enum('N','Y') | NO | | N | | | Lock_tables_priv | enum('N','Y') | NO | | N | | | Create_view_priv | enum('N','Y') | NO | | N | | | Show_view_priv | enum('N','Y') | NO | | N | | | Create_routine_priv | enum('N','Y') | NO | | N | | | Alter_routine_priv | enum('N','Y') | NO | | N | | | Execute_priv | enum('N','Y') | NO | | N | | | Event_priv | enum('N','Y') | NO | | N | | | Trigger_priv | enum('N','Y') | NO | | N | | +-----------------------+---------------+------+-----+---------+-------+ 22 rows in set (0.00 sec) </pre> <br /> 우리가 생성한 mytestdb DB에 mytest라는 계정으로 모든 권한을 부여하고 싶다면 다음과 같이 명령어를 실행해 주어야 합니다. ('Y'가 무려 19개입니다. ^^;)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > mysql> <b style='COLOR: blue'>insert into db values ('localhost', 'mytestdb', 'mytest', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y');</b> Query OK, 1 row affected (0.00 sec) </pre> <br /> (다시 한번 설명드리면, 위의 명령어를 실행함으로써 db 테이블에 변경이 되었는데, 이를 현재 실행 중인 mysqld.exe에 반영하려면 flush 명령어를 사용해야합니다.)<br /> <br /> <div style='font-size: 12pt; font-family: 맑은 고딕, Consolas; color: #2211AA; text-align: left; font-weight: bold'>데이터베이스에 테이블 생성</div><br /> <br /> 테이블 생성은 일반적인 DDL 구문과 비슷합니다. 단지 MySQL에 관련된 타입만 적절하게 주의해서 맞춰주시면 되는데, 제 경우에는 다음과 같이 아주 간단한 구조의 테이블을 예제로 생성해 보았습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > d:\mysql\bin><b style='COLOR: blue'>mysql -umytest -pmypassword mytestdb</b> Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.1.57-community MySQL Community Server (GPL) Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL v2 license Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> <b style='COLOR: blue'>create table mytable( id int NOT NULL, name varchar(50), age int, description varchar (150));</b> Query OK, 0 rows affected (0.05 sec) mysql> <b style='COLOR: blue'>show tables;</b> +--------------------+ | Tables_in_mytestdb | +--------------------+ | <b style='COLOR: blue'>mytable</b> | +--------------------+ mysql> <b style='COLOR: blue'>desc mytable;</b> +-------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | name | varchar(50) | YES | | NULL | | | age | int(11) | YES | | NULL | | | description | varchar(150) | YES | | NULL | | +-------------+--------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) </pre> <br /> 테이블 삭제는 "drop table" 명령어를 이용합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > mysql> <b style='COLOR: blue'>drop table mytable;</b> Query OK, 0 rows affected (0.05 sec) </pre> <br /> <div style='font-size: 12pt; font-family: 맑은 고딕, Consolas; color: #2211AA; text-align: left; font-weight: bold'>명령어를 담은 외부 파일 실행</div><br /> <br /> <a target='tab' href='http://www.sysnet.pe.kr/2/0/1038'>Firebird의 경우, isql.exe 실행</a> 시 "-i" 옵션을 통해서 SQL 명령어를 담고 있는 외부 파일을 지정할 수 있었는데, MySQL의 경우에는 mysql.exe에서의 직접적인 옵션 제공은 없고 DOS의 파이프라인 설계를 따릅니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > ==== myquery.txt ==== create table yourtable (name varchar(50), description varchar(150)); d:\mysql\bin><b style='COLOR: blue'>mysql -umytest -pmypassword mytestdb < myquery.txt</b> d:\mysql\bin> </pre> <br /> 가타부타 얘기도 없이 끝나는군요. ^^;<br /> <br /> <hr style='width: 50%' /><br /> <br /> 테스트 DB 설정이 마무리 되었으니 간단하게 PHP에서 MySQL에 접근하는 스크립트 예제를 만들어서 확인하면 끝!<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > <?php echo ("<br /><br />========================================================<br />"); echo ("mysql_connect - start<br />"); $connection = <b style='COLOR: blue'>mysql_connect</b>("localhost", "mytest", "mypassword") or die("cannot connect"); echo ("mysql_connect - end<br /><br />"); <b style='COLOR: blue'>mysql_select_db</b>("mytestdb", $connection); // Create $query = "insert into mytable values (1, 'tester', 20, 'desc test')"; echo ("mysql_query - start<br />"); <b style='COLOR: blue'>mysql_query</b>($query, $connection); echo ("mysql_query - end<br /><br />"); $query = "insert into mytable values (2, 'tester2', 40, 'desc test2')"; mysql_query($query, $connection); // Retrieve $query = "select * from mytable"; $result = mysql_query($query, $connection); $total_results = <b style='COLOR: blue'>mysql_num_rows</b>($result); echo ("# of rows == {$total_results}<br />"); $total_fields = <b style='COLOR: blue'>mysql_num_fields</b>($result); echo ("# of fields == {$total_fields}<br />"); echo ("mysql_fetch_row - start<br />"); while ( $row = <b style='COLOR: blue'>mysql_fetch_row</b>($result) ) { echo ("Name = $row[1]<br />"); } echo ("mysql_fetch_row - end<br /><br />"); // Update $query = "update mytable set name = 'tester1' where name = 'tester'"; mysql_query($query, $connection); // Delete $query = "delete from mytable where name = 'tester2'"; mysql_query($query, $connection); echo ("mysql_close(arg) - start<br />"); <b style='COLOR: blue'>mysql_close</b>($connection); echo ("mysql_close(arg) - end<br /><br />"); echo ("<br /><br />========================================================<br />"); $connection = mysql_connect("localhost", "root", "") or die("cannot connect"); /* ### deprecated: mysql_create_db / mysql_drop_db $dbname = mysql_create_db("firstdb", $connection); mysql_drop_db("firstdb", $connection); */ echo ("mysql_select_db - start<br />"); mysql_select_db("mytestdb", $connection); echo ("mysql_select_db - end<br /><br />"); $query = "select * from mytable"; $result = mysql_query($query, $connection); echo ("mysql_fetch_array - start<br />"); while ( $row = <b style='COLOR: blue'>mysql_fetch_array</b>($result) ) { echo ("Name = $row[name]<br />"); } echo ("mysql_fetch_array - end<br /><br />"); $query = "select * from mytable"; $result = mysql_query($query, $connection); $total_results = mysql_num_rows($result); echo ("# of rows == {$total_results}<br />"); echo ("mysql_result - start<br />"); for ($i = 0; $i < $total_results; $i ++) { $fieldValue = <b style='COLOR: blue'>mysql_result</b>($result, $i, 1); echo ("Name = {$fieldValue}<br />"); } echo ("mysql_result - end<br /><br />"); $query = "delete from mytable"; mysql_query($query, $connection); echo ("mysql_close() - start<br />"); mysql_close(); echo ("mysql_close() - end<br /><br />"); ?> </pre> <br /> <hr style='width: 50%' /><br /> <a name='mysql_zip'></a> <br /> 최근에 zip 파일로 다운로드해 mysqld --console을 실행시켰더니 다음과 같은 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > 2021-07-10T07:52:10.046447Z 0 [System] [MY-010116] [Server] D:\mysql-8.0.25-winx64\bin\mysqld.exe (mysqld 8.0.25) starting as process 12072 2021-07-10T07:52:10.049140Z 0 [Warning] [MY-010091] [Server] Can't create test file D:\mysql-8.0.25-winx64\data\mysqld_tmp_file_case_insensitive_test.lower-test 2021-07-10T07:52:10.049263Z 0 [Warning] [MY-010091] [Server] Can't create test file D:\mysql-8.0.25-winx64\data\mysqld_tmp_file_case_insensitive_test.lower-test 2021-07-10T07:52:10.049460Z 0 [ERROR] [MY-013276] [Server] Failed to set datadir to 'D:\mysql-8.0.25-winx64\data\' (OS errno: 2 - No such file or directory) 2021-07-10T07:52:10.051193Z 0 [ERROR] [MY-010119] [Server] Aborting 2021-07-10T07:52:10.051380Z 0 [System] [MY-010910] [Server] D:\mysql-8.0.25-winx64\bin\mysqld.exe: Shutdown complete (mysqld 8.0.25) MySQL Community Server - GPL. </pre> <br /> 검색해 보면, --initialize를 먼저 실행해 주면 된다고 합니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > D:\mysql\bin> mysqld --initialize </pre> <br /> 그럼 오류에서 봤던 data 디렉터리가 (제법 시간이 걸려) 초기화되고 프로그램이 종료합니다. 이후 다시 mysqld --console로 실행하면 정상적으로 동작하는 것을 확인할 수 있습니다. 또한, root 계정으로 처음 접근하는 것도 거부당합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > D:\mysql\bin> mysql -u root ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) </pre> <br /> 5.7+ 버전부터 root 계정의 암호를 지정해야만 한다고 합니다. 그래서 다음과 같이 실행시켜 mysqld를 띄운 후,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > D:\mysql\bin> <a target='tab' href='https://www.sysnet.pe.kr/2/0/12715'>start mysqld --skip-grant-tables --shared-memory</a> </pre> <br /> "mysql -u root" 명령어로 들어가 암호를 설정합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > mysql> flush privileges; mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; // 또한 root 계정 이외의 사용자도 생성해 주고, mysql> CREATE USER 'testusr' IDENTIFIED BY 'new_passsword2'; // testusr의 mytestdb에 대한 권한도 주고, mysql> GRANT ALL PRIVILEGES ON mytestdb.* TO 'testusr'; // 테이블도 만듭니다. mysql> CREATE TABLE customer (id char(10) NOT NULL, name char(20) NOT NULL, tel char(15) NOT NULL, age int DEFAULT NULL, grade char(10) NOT NULL,PRIMARY KEY (id)); </pre> <br /> 본문에서 실행한 mysql_connect 등의 API가 아닌, mysqli를 사용하는 경우에는 이런 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Fatal error: Uncaught Error: Class "mysqli" not found in D:\...\htdocs\test.php:10 Stack trace: #0 {main} thrown in D:\...\htdocs\test.php on line 10 /* <?php require_once '[...생략]...].php'; if (!function_exists('mysqli_init') && !extension_loaded('mysqli')) { echo 'We don\'t have mysqli!!!'; return; } else { echo 'Phew we have it!'; } $connect = new mysqli($db_hostname, $db_username, $db_password, $db_database); if ($connect->connect_error) die("Unable to connect MYSQL" ); $sql = "insert into customer (...[생략]...)"; $sql .= " values (...[생략]...)"; $result = $connect->query($sql); if ($result) echo "성공"; else echo "실패"; $result = $connect->query("select * from customer"); $rows = mysqli_num_rows($result); for ($i = 0; $i < $rows; $i ++) { $row = mysqli_fetch_row($result); echo "...: " . $row[0] . "<br />"; // ...[생략]... } $connect->close(); ?> */ </pre> <br /> 기본적으로 mysqli는 윈도우의 경우 php 설치 디렉터리의 하위 ext에 있는데, 따라서 php.ini 파일에 다음과 같은 내용을 추가해야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > // apache 설치 경로: d:\temp\apache24 // php 설치 경로: d:\temp\apache24\php_module extension=D:\temp\Apache24\php_module\ext\php_mysqli.dll </pre> </p> <br /><br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1009
(왼쪽의 숫자를 입력해야 합니다.)