...

View Full Version : Switch between local and live



AndrewGSW
12-17-2012, 01:34 AM
I believe that many people will comment and uncomment blocks (or individual lines) of code when switching between local and live running of their pages. This can be a pain. I use the following code and just change a value from true to false when moving to the remote/live site:

<?php
if (!defined('LOCAL')) {
define('LOCAL', true); // set this to true or false
}
if (!defined('DB_USER')) {
if (LOCAL) {
DEFINE('DB_USER', 'Andrew');
DEFINE('DB_PASSWORD', 'Password1');
DEFINE('DB_HOST', 'localhost');
DEFINE('DB_NAME', 'AndyDB');
DEFINE('EMAIL', 'andy@somemail.com');
DEFINE('BASE_URL', 'http://localhost:80/AndysProject/');
} else {
DEFINE('DB_USER', 'user2');
DEFINE('DB_PASSWORD', 'Password2');
DEFINE('DB_HOST', 'www.some.com');
DEFINE('DB_NAME', 'db2');
DEFINE('EMAIL', 'host@someother.com');
DEFINE('BASE_URL', 'http://andyshost.com/');
}
}
?>
I store this in a config.php file that is included in relevant pages.

idalatob
12-17-2012, 10:40 AM
Here's a cool way of doing it too:

//in your php config file


defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

if (APPLICATION_ENV == 'production') {
DEFINE('DB_USER', 'Andrew');
DEFINE('DB_PASSWORD', 'Password1');
DEFINE('DB_HOST', 'localhost');
DEFINE('DB_NAME', 'AndyDB');
DEFINE('EMAIL', 'andy@somemail.com');
DEFINE('BASE_URL', 'http://localhost:80/AndysProject/');
} else {
DEFINE('DB_USER', 'user2');
DEFINE('DB_PASSWORD', 'Password2');
DEFINE('DB_HOST', 'www.some.com');
DEFINE('DB_NAME', 'db2');
DEFINE('EMAIL', 'host@someother.com');
DEFINE('BASE_URL', 'http://andyshost.com/');
}



//in your vhosts file




<VirtualHost 10.0.0.253:80>

DocumentRoot "/Path/To/Folder"
ServerName helloworld.local

# This should be omitted in the production environment
# Or set to 'production'
SetEnv APPLICATION_ENV development

<Directory "/Path/To/Folder">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>

</VirtualHost>



This way, you can configure a whole host of different application environments. Useful for multiple developers all with their own way of setting up their DB's, passwords, paths, whatever etc.

idalatob
12-17-2012, 10:55 AM
Not that andrew's way isnt awesome! Just chipping in.

AndrewGSW
12-18-2012, 12:26 AM
Is APPLICATION_ENV specific to certain frameworks or servers? But I suppose it can be assigned in any comparable settings file.

idalatob
12-18-2012, 07:19 AM
Its a bit hitched from the Zend Framework.

Its not specific to any particular framework or server. (I suppose you would have to have apache and use virtualhosting)

Whats really cool about this system, is you can chain settings. EG:

Developer
setting_1 = x
setting_2 = y
setting_3 = z

Developer : Developer_1
setting_3 = a
setting_4 = i

So setting something like, APPLICATION_ENV = Developer_1, you can then chain settings and use inheritance. Like css I suppose. Of course, you have to write the logic for all that.

Its also worth taking a look at how big frameworks etc handle their settings. I really like the zend framework approach, which is why I hacked off its setting system.

tangoforce
12-18-2012, 11:21 PM
I see my idea has been copied :rolleyes:
http://www.codingforums.com/showthread.php?t=247091

Use the $_SERVER['HTTP_HOST'] to determine which system your script is running on. That way you don't even need to set anything to true or false, no constants to define etc.

Just upload all your files (including your mysql config file with no changes for once) and it'll just work straight away. It supports various names / domains for each server (handy if you have subdomains) and can be adjusted for mysqli if needed:


//Require the file
require_once('mysql.php');

//Open connection and select DB
$MySQL = run_mysql($_SERVER['HTTP_HOST']);

//Or
run_mysql($_SERVER['HTTP_HOST']);

//Need to debug this mysql connection? - Set the second parameter to true.
run_mysql($_SERVER['HTTP_HOST'], true);

This is the mysql.php file:

<?php
function load_mysql()
{
//Set Mysql connections here:
//MySQL Server 1 - Localhost
$Mysql['Name'] = array('127.0.0.1', 'localhost', '<computer_name>', '192.168.0.1');
$Mysql['Host'] = 'localhost';
$Mysql['User'] = 'root';
$Mysql['Pass'] = 'password';
$Mysql['DB'] = 'your_database_name';
$Connections[] = $Mysql;

//MySQL Server 2 - The website
$Mysql['Name'] = array('www.your-site.com', 'yoursite.com', 'sub.your-site.com');
$Mysql['Host'] = 'localhost';
$Mysql['User'] = 'your-site-mysql-user';
$Mysql['Pass'] = 'password2';
$Mysql['DB'] = 'db_name';
$Connections[] = $Mysql;

return $Connections;
}

function get_mysql($Name)
{
$Connections = load_mysql();

foreach($Connections as $Key => $MySql)
{
if (is_array($MySql['Name']))
{
if (($Search = array_search($Name, $MySql['Name'])) !== false)
{
return $MySql;
}
}
else
{
if (strtolower($Name) == strtolower($MySql['Name']))
{
return $MySql;
}
}
}

die("Database connection for $Name not defined / established.");
}

function run_mysql($Name, $Debug = false)
{
$Connection = get_mysql($Name);

If ($Connection != NULL)
{
If ($SQL = @mysql_connect($Connection['Host'], $Connection['User'], $Connection['Pass']))
{
//MySQL Connection Success
$Output = "Connected to $Connection[Host]<br>\n";

If ($Connection['DB'] != '')
{
$Output .= "Database $Connection[DB] supplied<br>\n";

If (@mysql_select_db($Connection['DB']))
{
//Table Selection Success
$Output .= "Selected $Connection[DB]<br>\n";
}
else
{
//Table Selection Failure
$Output .= "Database not selected: " .mysql_error() ."<br>\n";
}
}
else
{
$Output .= "Database not supplied<br>\n";
}
}
else
{
//MySQL Connection Failure
$Output = "Not connected to $Connection[Host]: " .mysql_error() ."<br>\n";
}
}

if ($Debug)
{
print $Output;
}

return $SQL;
}
?>

AndrewGSW
12-19-2012, 04:10 PM
I see my idea has been copied
Cheek :p. It's not quite the same anyway.

tangoforce
01-20-2013, 04:36 PM
You're right, it's better - no need to tell it what server your on as it picks the correct SQL credentials automatically :cool:

No need to manually adjust a define statement, no need to change anything really, just upload everything and you're done :) (You can probably tell I like automation lol)

The only thing mine won't do is work with cron (for obvious reasons being that there is no domain supplied by a http header). That should be relatively easy to overcome though - you could change the script to work from a machine name instead in the $_SERVER array.

AndrewGSW
01-20-2013, 07:41 PM
You're right, it's better

Thank you :p :)

tangoforce
02-10-2013, 08:34 PM
lol ;)



EZ Archive Ads Plugin for vBulletin Copyright 2006 Computer Help Forum