PHP veritabanları anahtarlama

1 Cevap php

Ben PHP için yeni değilim, bu yüzden bu soruya en iyi yerine (ki çok yararlı olacaktır ancak) ben yapmaya çalışıyorum ne ele daha PHP temelleri kısa bir açıklama ile cevap olabilir.

Ben kullanıcı dayanarak benim uygulama için birden fazla veritabanı kurmak istiyorum. Kullanıcı günlükleri, bu DB-1 karşı doğrulamak, ve her şey için kullanılacak olan veritabanı oradan almak ne zaman.

Aşağıdaki gibi benim login.php dosyasını tanımlayın:

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

ve sonra aşağıdaki gibi tanımlanan başka bir PHP dosyası vardır:

<%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
	}
}
?>

Ne ben merak ediyorum fonksiyon check_login sonunda () ilgili. KULLANICILAR tablo veritabanında (örneğin, 'db123522') adını ve bu veritabanı (örneğin, 'jsmith') için kullanıcı adı dönecekti varsayalım ve şifrenizi kendi tuzlu ve karma şifre olarak aynı olacaktır. Yani her kullanıcı oluşturulan kullanıcı adı ve tuzlanmış + karma şifrenizi uyan bir şifre ile, kendi veritabanı olurdu olduğunu.

Benim ikinci PHP dosyası veritabanına erişmek için başka bir işlevi olsaydı, bu durumda, nasıl ben bunu login.php gelen veritabanı tanımı yeni veritabanı tanımı kullanmak, ve olmaz sağlanması hakkında gitmek istiyorsunuz?

Ne bu PHP dosyası ve bir sonraki çağrı fonksiyonları tek görüşme arasında bellekte tutulur ve bu kullanıcılar arasında ayırt edebilirsiniz? Ben bir sonraki çağrı uygun veritabanı yükleyebilirsiniz böylece oturumuna bu bilgilerin bazılarını koymak varsa, ne olduğunu (uygulama güvenlik ödün vermeden, bana bu yapalım bilgi az miktarda olacaktır Açıkçası) oturumuna bir şifre koymak istemiyorum?

Bunu yapmak için daha iyi bir yolu (Ben orada, ama birisi bana bunu açıklayabilir veya bana doğru yönde işaret edebilir emin değilim) var mı?

1 Cevap

Birden veritabanlarına bağlanmak istiyorsanız, o mysql_connect() returns a resource for that database, which can be used as an optional parameter with mysql_select_db() , mysql_query() ve böylece farkında.

Kullanmak için bir bağ belirtmek istemiyorsanız, açılan sonuncusu yani kullanılacaktır:

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

ya da, daha açık:

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

Tüm bu söyleniyor, nadiren bir bölümleme düzeni olarak kullanıcı tarafından farklı veritabanları için iyi bir fikirdir. Bir kere, çoğu kişi fena halde kendi veritabanları veya muhtemel kullanım veya depolama gereksinimleri boyutu veya performans gereksinimlerini abartma eğilimindedir. İkincisi, büyük ölçüde belli bir profile uyan tüm kullanıcı (veritabanları) bulma gibi muhtemelen yapmak isteyen olacak şeyler, karmaşık hale getirebilir. Bu şimdi, N veritabanlarına bağlanırken N sorguları çalışan ve bir şekilde sonuçlarını toplayarak yerine sadece basit bir (hatta o kadar basit değil) SQL sorgusu çalıştıran içerecektir.

Edit: Sen kullanabilirsiniz mysql_pconnect() bağlantıları istekleri arasında korunur istiyorsanız. PHP Nothing istekleri (oturumu veya bir veritabanı gibi bazı sebat ortama depolama engelleme) arasında korunur. Ama bu aslında PHP güzelliği. Hatta kalıcı bağlantılarını kullanarak onları böylece, bayat oluyor onları yeniden gerek ve benzeri sorunların yepyeni bir dizi içerir.

Basit tutun.

(Bunu kime ait anlamaya, zor, ama imkansız değil olabilir rağmen) Ayrıca, oturumda depolamak makul bir yaklaşımdır ama oturumda şey paylaşılan bir barındırma ortamında diğer siteler tarafından okunabilir olduğunu unutmayın.