2009-11-25 2 views
0

저는 PHP를 처음 사용하기 때문에이 질문에 대한 답변은 PHP의 기본 사항에 대한 간단한 설명으로 해결할 수 있습니다.PHP에서 데이터베이스 전환

내 응용 프로그램에 대해 사용자별로 여러 데이터베이스를 설정하고 싶습니다. 사용자가 로그인하면 DB-1에 대해 사용자를 인증하고 다른 데이터베이스에 사용할 데이터베이스를 검색합니다. 다음과 같이

<?php 
    $db_hostname = 'localhost'; 
    $db_database = 'testing'; 
    $db_username = 'someuser'; 
    $db_password = 'somepass'; 
?> 

을 한 후 나는 또 다른 PHP 파일 정의 :

<%php 
require_once 'login.php'; 

$db_server = mysql_connect($db_hostname, $db_username, $db_password); 
if (!$db_server) die ("Unable to connect to MySQL: " . mysql_error()); 

mysql_select_db($db_database) 
    or die ("Unable to select database: " . mysql_error()); 

function check_login($user, $password) { 
    $user = mysql_entities_fix_string($user); 
    $password = mysql_entities_fix_string($password); 
    $password = secure_password($password); 
    $query = "SELECT DB_NAME, DB_USER FROM USERS WHERE USER_NAME='$user' AND PASSWORD='$password'"; 
    $result = mysql_query($query); 
    if (!$result) 0; //no access to the database 
    elseif (mysql_num_rows($result)) { 
     $row = mysql_fetch_row($result); 
     $db_database = $row[0]; 
     $db_username = $row[1]; 
     $db_password = $password; 
     return 1; //login succeeded 
    } else { 
     return 2; //login failure 
    } 
} 
?> 

내가 궁금하면 함수의 종료에 관한 다음과 같이

나는 나의 login.php 파일을 정의 check_login(). USERS 테이블이 데이터베이스의 이름 (예 : 'db123522')과 해당 데이터베이스의 사용자 이름 (예 : 'jsmith')을 반환하고 비밀번호가 해시 및 해싱 된 비밀번호와 같을 것이라고 가정합니다. 즉, 각 사용자는 생성 된 사용자 이름과 암호가 해시 된 + 해시 된 암호와 일치하는 자체 데이터베이스를 갖게됩니다.

이 경우 두 번째 PHP 파일에 데이터베이스에 액세스 할 수있는 다른 기능이 있다면 login.php의 데이터베이스 정의가 아닌 새 데이터베이스 정의를 사용할 수 있도록하려면 어떻게해야합니까?

이 PHP 파일의 함수 호출과 다음 호출 사이에 메모리에 남아있는 것은 무엇이며 이는 사용자를 구별 할 수 있습니까? 다음 호출에서 적절한 데이터베이스를로드 할 수 있도록이 정보 중 일부를 세션에 넣어야하는 경우 응용 프로그램의 보안을 손상시키지 않고 최소한의 정보만으로도이를 수행 할 수 있습니다 (즉, 나는 분명히 세션에 암호를 넣고 싶지 않다)?

이 작업을 수행하는 더 좋은 방법이 있습니까 (누군가가 나를 설명하거나 올바른 방향으로 나를 가리킬 수 있습니까?).

+4

왜 각 사용자마다 다른 DB를 사용 하시겠습니까? – mpen

+0

중복 : http://stackoverflow.com/questions/1580540/max-tables-design-pattern –

+0

다른 복제본 : http://stackoverflow.com/questions/1618792/mysql-using-unique-table-names-vs- using-ids –

답변

4

여러 데이터베이스에 연결하려는 경우 mysql_connect()은 해당 데이터베이스의 리소스를 반환하며 이는 mysql_select_db(), mysql_query() 등의 선택적 매개 변수로 사용할 수 있습니다. 당신이 사용할 수있는 링크를 지정하지 않으면

, 열린 마지막은 이렇게 사용됩니다

mysql_connect($hostname, $username, $password); 
mysql_select_db($database); 
... 
mysql_connect($host2, $user2, $pass2); 
mysql_select_db($db2); // uses the database just opened 
mysql_query('SELECT * FROM sometable'); // also uses the second database 

또는 더 명시 적으로 모든 말했다되고 그건

$res1 = mysql_connect($host1, $user1, $pass1); 
$res2 = mysql_connect($host2, $user2, $pass2); 
mysql_query('...', $res1); // use first database 
mysql_query('...', $res2); // use second database 

거의 없다 분할 스키마로 사용자별로 다른 데이터베이스에 좋은 아이디어입니다. 한 가지로, 대부분의 사람들은 데이터베이스의 크기 또는 성능 요구 사항 또는 사용 가능성 또는 저장 요구 사항을 크게 과대 평가하는 경향이 있습니다. 둘째, 특정 프로필에 맞는 모든 사용자 (데이터베이스)를 찾는 것과 같이 실제로 관심을 가질만한 일을 크게 복잡하게 만들 수 있습니다. 이제는 N 개의 데이터베이스에 연결하고 N 개의 쿼리를 실행하며 단순한 (또는 간단하지는 않은) SQL 쿼리를 실행하는 대신 결과를 모아야합니다.

편집 : 당신은 연결이 요청 사이에 유지하려면 당신은 mysql_pconnect()를 사용할 수 있습니다. PHP의 어떤 요구도 요청간에 유지되지 않습니다 (세션이나 데이터베이스와 같은 일부 지속성 매체에 대한 저장 영역 제외). 그러나 그것은 실제로 PHP의 아름다움입니다. 영구적 인 연결을 사용하는 경우에도 끊임없이 문제가 발생하고 다시 연결해야하는 등 완전히 새로운 문제가 발생합니다.

간단하게 유지하십시오.

또한 세션에 저장하는 것이 합당한 접근 방법이지만 세션의 모든 내용은 공유 호스팅 환경의 다른 사이트에서 읽을 수 있음을 알고 있어야합니다 (어렵지는 않지만 불가능할 수도 있음).).

+0

이 정보는이 PHP 파일을 여러 번 호출 할 때 유지됩니까? 아니면 사용자를 구별하기 위해 매번이 데이터를 전달해야합니까? – Elie

관련 문제