我正在尝试构建一个连接到单个数据库的简单脚本。我想将类文件放到我的许多网站上,并希望能够在我的数据库中“注册”该网站。
为了避免必须为类的每个实例化运行SQL查询,我想使用PHP常量“注册”域。
在我的方法中,我定义了常量并检查它 - 它可以工作,但是当我检查构造函数中的常量时,不再定义常量。
这是我的类文件,我确信这只是我对常量的理解。
<?php
/**
* @author bailz777
*
*
*/
class db_interface {
public $ServerName = 'localhost:3306'; //hostname:port
public $UserName = '******'; //mysql user
public $Password = '******'; //mysql password
public $DataBase = '******'; //database name
public $Domain = 'test.com'; //Full domain name (no host)
public $con = '';
function __construct() {
//on construction, we must ensure that the domain is registered in our system
//first check if it was defined locally to avoid extra DataBase Work
var_dump(defined('DOMAIN_REGISTERED'));
if(!defined('DOMAIN_REGISTERED')) {
$this->db_connect();
$result = $this->validate_domain();
if($result) {
echo "<p>Domain Validated!!</p>";
}
$this->db_disconnect();
}
else {
echo "<p>Domain Validated!!</p>";
}
}
/**
*
*/
function __destruct() {
}
/**
*
* @param unknown_type $domain
* @return boolean
*/
private function validate_domain() {
$constants = get_defined_constants();
// return $this->con;
// print_r($constants);
var_dump(defined('DOMAIN_REGISTERED'));
if(defined('DOMAIN_REGISTERED')) {//Check DOMAIN_REGISTERED to avoid unnecessary db work
return TRUE;
}
elseif (!defined('DOMAIN_REGISTERED')) {//Check the domain is in the db
echo '<p>Domain was not locally registered, checking DataBase</p>';
$query = "SELECT `name` FROM `$this->DataBase`.`registered_domains` WHERE `name` = '$this->Domain'";
$result = mysql_query($query,$this->con);
//var_dump($result);
if(!$result) {
die('No result found : ' . mysql_error());
}
elseif (mysql_num_rows($result)==0) { //if no rows returned, then domain is not in DataBase
$domain_exists = FALSE;
}
elseif (mysql_num_rows($result)>0) { //if rows returned, then domain is in DataBase
$domain_exists = TRUE;
//If a domain does not exist, a mysql will be passed, use @ to suppress the error
//The domain will be written to the db and on the next run of this function, the
//constant will be defined
}
if($domain_exists) {//If it exists Then assign CONSTANT DOMAIN_REGISTERED to TRUE
echo '<p>Domain Found in DataBase</p>';
echo '<p>Registering domain locally</p>';
define("DOMAIN_REGISTERED", TRUE);
if(DOMAIN_REGISTERED) {
echo '<p>Successfully registered domain locally</p>';
}
//var_dump(defined('DOMAIN_REGISTERED'));
//echo DOMAIN_REGISTERED;
return TRUE;
}
elseif(!$domain_exists) {//If it does not exist then add it to the registered_domains table, and assign CONSTANT __DOMAIN_TRUE__ to TRUE
echo '<p>Domain not found in DataBase</p>';
echo '<p>Now Registering Domain</p>';
$query = "INSERT INTO `$this->DataBase`.`registered_domains` (`name`) VALUES ('$this->Domain')";
$result = mysql_query($query);
if(!$result) {
die('Domain not added : ' . mysql_error());
}
else{
define("DOMAIN_REGISTERED", TRUE);
return TRUE;
}
}
}
}
//Connect to mysql and define the active database
private function db_connect() {
$this->con = $con = mysql_connect($this->ServerName,$this->UserName,$this->Password);
if (!$con) {
die('Could not connect: ' . mysql_error());
}
else {
echo 'Successfully connected to MySQL<br />';
//define active database
$this->db = mysql_select_db($this->DataBase);
if(!$this->db) {
die('Could not connect to Database : ' . mysql_error());
}
else {
echo 'Successfully connected to DataBase<br />';
}
}
}
//disconnect from mysql
private function db_disconnect() {
$close = mysql_close($this->con);
if($close) {
echo 'Successfully disconnected from MySQL<br />';
}
}
public function add_record($fname,$lname,$email) {
$ip = $_SERVER['REMOTE_ADDR'];
$authorized_date = time();
}
}
?>
答案 0 :(得分:1)
您可以尝试使用静态类变量来保存该值。首先,这将限制您的类的常量值,这比将值暴露给整个应用程序更好。另一方面,常量的意图是它们永远不会改变,看起来你正试图将它用作旗帜。
答案 1 :(得分:1)
构造函数是第一个在创建对象后立即调用的函数。
如果在类中的某个其他函数中定义常量,则不能指望在构造函数中定义它。原因如下:
这是完全正常的行为。
答案 2 :(得分:1)
我认为你可能没有按照预期的方式使用常量。首先,在执行代码期间,常量值不会改变(因此不变)。
我们使用它们来分配我们可以在整个代码中使用的硬编码值(只是非常简单的值)。关键是你最终可以知道它们永远不会有所不同。
除此之外,您不一定需要知道常量本身的实际值,因为您只需引用变量名称,允许在不破坏代码的情况下随时更改这些值。
考虑以下示例:
<?php
class pizza
{
const SIZE_SMALL = 1;
const SIZE_MEDIUM = 2;
const SIZE_LARGE = 3;
public function getCookingTime($size)
{
if ($size == self::SIZE_SMALL) {
$time = 10;
} else if ($size == self::SIZE_MEDIUM || $size == self::SIZE_LARGE) {
$time = 15;
}
return $size;
}
}
$pizza = new pizza();
$time = $pizza->getCookingTime(3);
// or more usefull:
$time = $pizza->getCookingTime(pizza::SIZE_SMALL);
?>
答案 3 :(得分:0)
我找不到您在代码中致电define('DOMAIN_REGISTERED', '...');
的任何地方
无论如何,正如monitorjbl所提到的,考虑使用static
保留字作为数据库连接,这样就可以避免重新定义连接,重新注册域名等等。
答案 4 :(得分:-1)
想要掌握OO编程是一件好事。一个(众多)优点是您可以构建可重用且可测试的代码。
如果您想构建一个连接到数据库的类,并且可以在许多站点中重用,那么您要避免的一件事就是依赖。对常量或其他类的依赖使得重用代码变得更加困难。或测试和调试您的代码。
说这意味着您要避免使用预定义的常量和预先初始化的公共。
你班级的构建应如下所示:
class mydb
{
private $host;
private $database;
..
public function __construct($host, $database ..)
{
$this->host = $host;
$this->database = $database;
}
}
你可以像这样使用你的课程:
$mydb = new mydb('localhost', 'mydatabase', ..);
如果您希望能够向您的数据库注册站点,请编写注册方法:
class mydb
{
private $host;
private $database;
..
public function __construct($host, $database ..)
{
$this->host = $host;
$this->database = $database;
}
public function Register( $domainname )
{
//connect to the database and do register stuff
}
}
并像这样使用它:
$mydb = new mydb('localhost', 'mydatabase', ..);
$mydb->Register('MyDomain');