>  기사  >  백엔드 개발  >  일반적인 PHP 데이터베이스 분석 및 소개 Solutions_php 기술

일반적인 PHP 데이터베이스 분석 및 소개 Solutions_php 기술

WBOY
WBOY원래의
2016-05-16 20:07:38951검색

PHP를 사용하여 데이터베이스에 연결할 때 많은 문제에 직면하게 됩니다. 이 기사에서는 데이터베이스 스키마 설계, 데이터베이스 액세스 및 데이터베이스를 사용하는 비즈니스 로직 코드를 포함하여 PHP 애플리케이션에서 발생하는 일반적인 데이터베이스 문제와 해당 솔루션을 설명합니다. 데이터베이스를 사용하는 방법이 하나만 올바른 경우.

PHP 데이터베이스 문제: MySQL을 직접 사용

일반적인 문제는 이전 PHP 코드가 mysql_ 함수를 직접 사용하여 데이터베이스에 액세스한다는 것입니다. 목록 1은 데이터베이스에 직접 액세스하는 방법을 보여줍니다.

목록 1. 접속/get.php

<?php  
function get_user_id( $name )  
{  
$db = mysql_connect( 'localhost', 'root', 'password' );  
mysql_select_db( 'users' );  
$res = mysql_query( "SELECT id FROM users WHERE login='".$name."'" );  
while( $row = mysql_fetch_array( $res ) ) { $id = $row[0]; }  
return $id;  
}  
var_dump( get_user_id( 'jack' ) );  
?> 

mysql_connect 함수는 데이터베이스에 액세스하는 데 사용됩니다. 또한 문자열 연결을 사용하여 $name 매개 변수를 쿼리에 추가하는 쿼리에 유의하세요. 이 기술에 대한 두 가지 좋은 대안이 있습니다. PEAR DB 모듈과 PDO(PHP Data Objects) 클래스입니다. 둘 다 특정 데이터베이스 선택의 추상화를 제공합니다. 따라서 IBM® DB2®, MySQL, PostgreSQL 또는 연결하려는 기타 데이터베이스를 크게 조정하지 않고도 코드를 실행할 수 있습니다. PEAR DB 모듈과 PDO 추상화 계층을 사용하는 또 다른 가치는 SQL 문에서 ? 연산자를 사용할 수 있다는 것입니다. 이렇게 하면 SQL을 유지 관리하기가 더 쉬워지고 SQL 삽입 공격으로부터 애플리케이션을 보호할 수 있습니다.

목록 2. 접속/get_good.php

<?php  
require_once("DB.php");  
function get_user_id( $name )  
{  
$dsn = 'mysql://root:password@localhost/users';  
$db =& DB::Connect( $dsn, array() );  
if (PEAR::isError($db)) { die($db->getMessage()); }  
$res = $db->query( 'SELECT id FROM users WHERE login=?',array( $name ) );  
$id = null;  
while( $res->fetchInto( $row ) ) { $id = $row[0]; }  
return $id;  
}  
var_dump( get_user_id( 'jack' ) );  
?> 

$dsn의 데이터베이스 연결 문자열을 제외하고 MySQL의 직접적인 사용은 모두 제거되었습니다. 또한 ? 연산자를 통해 SQL에서 $name 변수를 사용합니다. 그런 다음 쿼리 데이터는 query() 메서드 끝에 있는 배열을 통해 전송됩니다.

PHP 데이터베이스 문제: 자동 증가 기능이 사용되지 않습니다

대부분의 최신 데이터베이스와 마찬가지로 MySQL에는 레코드별로 자동 증가하는 고유 식별자를 생성하는 기능이 있습니다. 그 외에도 먼저 SELECT 문을 실행하여 가장 큰 ID를 찾은 다음 해당 ID를 1씩 증가시키고 새 레코드를 찾는 코드를 볼 수 있습니다. Listing 3에서는 잘못된 패턴의 예를 보여줍니다.

목록 3. Badid.sql

DROP TABLE IF EXISTS users;  
CREATE TABLE users (  
id MEDIUMINT,  
login TEXT,  
password TEXT  
);  
INSERT INTO users VALUES ( 1, 'jack', 'pass' );  
INSERT INTO users VALUES ( 2, 'joan', 'pass' );  
INSERT INTO users VALUES ( 1, 'jane', 'pass' ); 

여기서 id 필드는 단순히 정수로 지정됩니다. 따라서 고유해야 하더라도 CREATE 문 다음에 오는 여러 INSERT 문에 표시된 대로 값을 추가할 수 있습니다. 목록 4에서는 이러한 유형의 패턴에 사용자를 추가하는 PHP 코드를 보여줍니다.

목록 4. Add_user.php

add_user.php의 코드는 먼저 id의 최대값을 찾는 쿼리를 수행합니다. 그런 다음 파일은 id 값을 1씩 증가시켜 INSERT 문을 실행합니다. 이 코드는 과부하가 걸린 서버의 경쟁 조건으로 인해 실패합니다. 게다가 비효율적이기도 합니다. 그렇다면 대안은 무엇입니까? MySQL의 자동 증가 기능을 사용하여 각 삽입에 대한 고유 ID를 자동으로 생성하십시오.

<?php  
require_once("DB.php");  
function add_user( $name, $pass )  
{  
$rows = array();  
$dsn = 'mysql://root:password@localhost/bad_badid';  
$db =& DB::Connect( $dsn, array() );  
if (PEAR::isError($db)) { die($db->getMessage()); }  
$res = $db->query( "SELECT max(id) FROM users" );  
$id = null;  
while( $res->fetchInto( $row ) ) { $id = $row[0]; }  
$id += 1;  
$sth = $db->prepare( "INSERT INTO users VALUES(?,?,?)" );  
$db->execute( $sth, array( $id, $name, $pass ) );  
return $id;  
}  
$id = add_user( 'jerry', 'pass' );  
var_dump( $id );  
?> 

이 글의 소개를 통해 PHP 데이터베이스 솔루션에 대한 이해를 높이는 데 도움이 되기를 바랍니다.

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