>백엔드 개발 >PHP 튜토리얼 >php mysqli와 mysql의 차이점에 대한 자세한 설명

php mysqli와 mysql의 차이점에 대한 자세한 설명

WBOY
WBOY원래의
2016-07-25 08:56:271896검색
이 기사에서는 PHP에서 mysqli와 mysql 클래스의 몇 가지 차이점을 소개합니다. 도움이 필요한 친구는 이를 참고로 사용할 수 있습니다.

먼저, PHP-MySQL은 MySQL 데이터베이스를 운영하기 위한 가장 독창적인 PHP용 Extension입니다. PHP-MySQLi의 i는 Improvement를 의미하며 비교적 고급 기능을 제공합니다. PDO(PHP Data Object)는 데이터베이스를 운영하기 위한 추상화 계층을 제공합니다. 예:

<?php 
mysql_connect($db_host, $db_user, $db_password); 
mysql_select_db($dn_name); 
$result = mysql_query("SELECT `name` FROM `users` WHERE `location` = '$location'"); 
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) 
{ 
echo $row['name']; 
} 
mysql_free_result($result); 
?> 

이 방법은 컬럼을 바인딩할 수 없습니다. 이전 SQL 설명에 따르면 $location은 SQL 주입이 발생하기 쉽습니다. 나중에 mysql_escape_string()이 개발되었으며(참고: 5.3.0 이후에는 더 이상 사용되지 않음) mysql_real_escape_string()은 이 문제를 해결합니다.

예:

<?php 
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'", 
mysql_real_escape_string($user), 
mysql_real_escape_string($password)); 
mysql_query($query); 
?> 

PHP-MySQLi에서는 위의 문제를 Bind Column을 통해 해결한 것 외에도 Transaction, Multi Query를 지원하고 객체 지향 스타일도 제공합니다(다음 PHP-MySQLi 샘플). 예제의 작성 방법)과 절차적 스타일(위 PHP-MySQL 예제의 작성 방법) 등 2가지 방식으로 작성됩니다.

예:

<?php 
$mysqli = new mysqli($db_host, $db_user, $db_password, $db_name); 
$sql = "INSERT INTO `users` (id, name, gender, location) VALUES (?, ?, ?, ?)"; 
$stmt = $mysqli->prepare($sql); 
$stmt->bind_param('dsss', $source_id, $source_name, $source_gender, $source_location); 
$stmt->execute(); 
$stmt->bind_result($id, $name, $gender, $location); 
while ($stmt->fetch()) 
{ 
echo $id . $name . $gender . $location; 
} 
$stmt->close(); 
$mysqli->close(); 
?> 

바인드 결과와 같은 단점은 약간 중복되지만 실제로는 관련이 없습니다. 가장 큰 문제는 이것이 추상화 방법이 아니라는 것입니다. 그래서 PDO가 등장했습니다(참고: 현재 Ubuntu 및 Debian의 경우 PDO에는 직접 설치할 패키지가 없으며 PECL을 통해 설치해야 합니다).

예:

roga@carlisten-lx:~$ pecl 검색 pdo 패키지 안정/(최신) 로컬 PDO 1.0.3(안정적) PHP 데이터 개체 인터페이스. 4D-SQL 데이터베이스용 PDO_4D 0.3(베타) PDO 드라이버 PDO_DBLIB 1.0(안정적) PDO용 FreeTDS/Sybase/MSSQL 드라이버 PDO_FIREBIRD 0.2(베타) PDO용 Firebird/InterBase 6 드라이버 IBM 데이터베이스용 PDO_IBM 1.3.2(안정적) PDO 드라이버 PDO_INFORMIX 1.2.6(안정적) IBM Informix INFORMIX 데이터베이스용 PDO 드라이버 PDO_MYSQL 1.0.2(안정적) PDO용 MySQL 드라이버 PDO_OCI 1.0(안정적) PDO용 Oracle 호출 인터페이스 드라이버 PDO_ODBC 1.0.1(안정적) PDO용 ODBC v3 인터페이스 드라이버 PDO_PGSQL 1.0.2(안정적) PDO용 PostgreSQL 드라이버 PDO_SQLITE 1.0.1(안정적) PDO용 SQLite v3 인터페이스 드라이버 pdo_user 0.3.0(베타) PDO용 사용자 공간 드라이버

PECL을 통해 설치하면 다음과 같은 방법으로 데이터베이스를 운영할 수 있습니다.

<?php 
$dsn = "mysql:host=$db_host;dbname=$db_name"; 
$dbh = new PDO($dsn, $db_user, $db_password); 
$sql = "SELECT `name`, `location` FROM `users` WHERE `location` = ? , `name` = ?"; 
$sth = $dbh->prepare($sql); 
$sth->execute(array($location, $name)); 
$result = $sth->fetch(PDO::FETCH_OBJ); 
echo $result->name . $result->location; 
$dbh = NULL; 
?> 

pdo의 이점: 1. PDO는 데이터베이스에 연결할 때 연결 문자열을 사용하여 연결할 데이터베이스를 결정합니다. 2. PDO는 PDO::setAttribute를 사용하여 영구 연결과 같은 연결 설정과 오류(예외, E_WARNING, NULL)를 반환하는 방법을 결정할 수 있습니다. 반환된 필드명 등의 경우에도 마찬가지입니다. 2. PDO는 기본 준비 및 실행 외에도 열 바인딩 기능을 지원하고 열 유형을 지정할 수도 있습니다. 4. PDO는 추상화 계층이므로 저장 매체를 변경하더라도 필요한 노력은 그에 비해 최소화됩니다.

개인적으로 저는 ActiveRecord나 Propel ORM(Object-Relational Mapping)과 같은 데이터베이스에 연결하기 위해 DBI를 사용하는 것을 선호합니다. 예를 들어 ActiveRecord를 예로 들어 다음과 같은 SQL 문을 구현하려면... INSERT INTO `사용자`(id, 이름, 성별, 위치) VALUES(1, 'roga', 'male', 'tpe') PDO 작동 방법:

<?php 
$sql = "INSERT INTO `users` (id, name, gender, location) VALUES(?, ?, ?, ?)"; 
$sth = $dbh->prepare($sql); 
$sth->execute(array(1, 'roga', 'male', 'tpe')); 
?> 

ActiveRecord의 경우 다음과 같습니다.

<?php 
$user = new User(); 
$user->id = 1; 
$user->name = 'roga'; 
$user->gender = 'male'; 
$user->location = 'tpe'; 
$user->save(); 
?> 

mysql은 비영구적 연결 기능이고, mysqli는 영구적 연결 기능이다. 즉, Mysql은 각 연결마다 연결 프로세스를 열고 mysqli를 여러 번 실행하면 동일한 연결 프로세스를 사용하므로 서버 오버헤드가 줄어듭니다. 어떤 친구들은 프로그래밍을 할 때 항상 new mysqli('localhost', usenamer', 'password', 'databasename');을 사용할 때 보고합니다. 잘못되었습니다. 치명적인 오류: 'mysqli' 클래스를 d:...에서 찾을 수 없습니다. mysqli 클래스가 PHP에 내장되어 있지 않나요? 이는 기본적으로 활성화되어 있지 않습니다. win에서는 php.ini를 변경하고 php_mysqli.dll 앞의 ";"을 제거해야 합니다. Linux에서는 mysqli를 컴파일해야 합니다.

1: Mysqli.dll은 객체나 프로세스에서 데이터베이스를 운영할 수 있게 해주는 데이터베이스이며, 사용법도 매우 쉽습니다.

mysql.dll과 몇 가지 일반적인 작업을 비교해 보세요. 1,

<?php
mysql.dll(可以理解为函数式的方式): 
$conn = mysql_connect('localhost', 'user', 'password'); //连接mysql数据库 
mysql_select_db('data_base'); //选择数据库 
   
$result = mysql_query('select * from data_base');//这里有第二个可选参数,指定打开的连接
$row = mysql_fetch_row( $result ) ) //为了简单,这里只取一行数据 
echo $row[0]; //输出第一个字段的值 

Mysqli에도 절차적 방법이 있는데 mysqli라는 접두사로 시작하고 나머지는 거의 동일합니다. mysqli가 절차적 방식으로 작동하는 경우 일부 함수는 mysqli_query(리소스 식별자, SQL 문)와 같은 리소스를 지정해야 합니다. 그리고 리소스 식별 매개변수는 앞에 배치되고, mysql_query의 리소스 식별(SQL 문, '선택적')은 뒤에 배치되며 기본값은 이전에 열린 연결이나 리소스로 지정될 수 없습니다.

2, mysqli.dll(개체 모드):

<?php
$conn = new mysqli('localhost', 'user', 'password','data_base'); 
//这里的连接是new出来的,最后一个参数是直接指定数据库,不用mysql_select_db()了 
//也可以构造时候不指定,然后 $conn -> select_db('data_base') 
$result = $conn -> query( 'select * from data_base' ); 
$row = $result -> fetch_row(); //取一行数据 
echo row[0]; //输出第一个字段的值 

둘, mysql_fetch_row(), mysql_fetch_array() 두 함수 모두 배열을 반환합니다. 차이점은 첫 번째 함수에서 반환된 배열에는 $row[0], $row[1]만 포함할 수 있다는 것입니다. 이 방법으로 배열 첨자를 사용하여 데이터를 읽을 수 있습니다. mysql_fetch_array()에 의해 반환된 배열에는 키-값 쌍의 첫 번째 유형과 형식이 모두 포함됩니다(데이터베이스의 필드가 사용자 이름, 비밀번호인 경우). $row['사용자 이름'], $row['비밀번호'] 게다가 ($row as $kay => $value)를 사용하여 연산하면 데이터베이스의 필드명을 직접 얻을 수도 있습니다. 더 중요한 것은 mysqli가 php5에서 제공하는 새로운 함수 라이브러리입니다. (i)는 개선을 나타내며 실행 속도가 더 빠릅니다.

위 내용은 PHP 프로그래밍에서 mysql과 mysqli의 차이점입니다. 모든 분들께 도움이 되었으면 좋겠습니다.



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.