check() 공개 정적인 메소드

Check the database
public static check ( array $db ) : string
$db array
리턴 string
예제 #1
0
 /**
  * Set the field values
  *
  * @param  array $values
  * @param  array $filters
  * @return \Pop\Form\Form
  */
 public function setFieldValues(array $values = null, $filters = null)
 {
     parent::setFieldValues($values, $filters);
     if ($_POST) {
         // Check the content directory
         if (!file_exists($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . $this->content_path)) {
             $this->getElement('content_path')->addValidator(new Validator\NotEqual($this->content_path, $this->i18n->__('The content directory does not exist.')));
         } else {
             $checkDirs = \Phire\Project::checkDirs($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . $this->content_path, true);
             if (count($checkDirs) > 0) {
                 $this->getElement('content_path')->addValidator(new Validator\NotEqual($this->content_path, $this->i18n->__('The content directory (or subdirectories) are not writable.')));
             }
         }
         // If not SQLite, check the DB parameters
         if (strpos($this->db_adapter, 'Sqlite') === false) {
             $this->getElement('db_name')->addValidator(new Validator\NotEmpty(null, $this->i18n->__('The database name is required.')));
             $this->getElement('db_username')->addValidator(new Validator\NotEmpty(null, $this->i18n->__('The database username is required.')));
             $this->getElement('db_password')->addValidator(new Validator\NotEmpty(null, $this->i18n->__('The database password is required.')));
             $this->getElement('db_host')->addValidator(new Validator\NotEmpty(null, $this->i18n->__('The database host is required.')));
         }
         // Check the database credentials
         if ($this->isValid()) {
             $oldError = ini_get('error_reporting');
             error_reporting(E_ERROR);
             $dbCheck = Dbs::check(array('database' => $this->db_name, 'username' => $this->db_username, 'password' => $this->db_password, 'host' => $this->db_host, 'type' => str_replace('\\', '_', $this->db_adapter)));
             // If there is a DB error
             if (null != $dbCheck) {
                 $this->getElement('db_adapter')->addValidator(new Validator\NotEqual($this->db_adapter, wordwrap($dbCheck, 50, '<br />')));
             } else {
                 // Check the database version
                 if (strpos($this->db_adapter, 'Sqlite') === false) {
                     $adapter = stripos($this->db_adapter, 'Pdo\\') !== false ? str_replace('Pdo\\', '', $this->db_adapter) : $this->db_adapter;
                     $db = Db::factory($adapter, array('database' => $this->db_name, 'username' => $this->db_username, 'password' => $this->db_password, 'host' => $this->db_host, 'type' => strtolower(str_replace('Pdo\\', '', $this->db_adapter))));
                     $version = $db->adapter()->version();
                     $version = substr($version, strrpos($version, ' ') + 1);
                     if (strpos($version, '-') !== false) {
                         $version = substr($version, 0, strpos($version, '-'));
                     }
                     if (stripos($this->db_adapter, 'Mysql') !== false) {
                         $dbVerKey = 'Mysql';
                     } else {
                         if (stripos($this->db_adapter, 'Pgsql') !== false) {
                             $dbVerKey = 'Pgsql';
                         } else {
                             $dbVerKey = null;
                         }
                     }
                     if (null !== $dbVerKey && version_compare($version, self::$dbVersions[$dbVerKey]) < 0) {
                         $this->getElement('db_adapter')->addValidator(new Validator\NotEqual($this->db_adapter, wordwrap($this->i18n->__('The %1 database version must be %2 or greater. (%3 detected.)', array($dbVerKey, self::$dbVersions[$dbVerKey], $version)), 45, '<br />')));
                     }
                 }
             }
             error_reporting($oldError);
         }
     }
     return $this;
 }
예제 #2
0
 /**
  * Install the project based on the available config files
  *
  * @param string $installFile
  * @return void
  */
 public static function install($installFile)
 {
     // Display instructions to continue
     $dbTables = array();
     self::instructions();
     $input = self::cliInput();
     if ($input == 'n') {
         echo I18n::factory()->__('Aborted.') . PHP_EOL . PHP_EOL;
         exit(0);
     }
     // Get the install config.
     $installDir = realpath(dirname($installFile));
     $install = (include $installFile);
     // Check if a project folder already exists.
     if (file_exists($install->project->name)) {
         echo wordwrap(I18n::factory()->__('Project folder exists. This may overwrite any project files you may already have under that project folder.'), 70, PHP_EOL) . PHP_EOL;
         $input = self::cliInput();
     } else {
         $input = 'y';
     }
     // If 'No', abort
     if ($input == 'n') {
         echo I18n::factory()->__('Aborted.') . PHP_EOL . PHP_EOL;
         exit(0);
         // Else, continue
     } else {
         $db = false;
         $databases = array();
         // Test for a database creds and schema, and ask
         // to test and install the database.
         if (isset($install->databases)) {
             $databases = $install->databases->asArray();
             echo I18n::factory()->__('Database credentials and schema detected.') . PHP_EOL;
             $input = self::cliInput(I18n::factory()->__('Test and install the database(s)?') . ' (Y/N) ');
             $db = $input == 'n' ? false : true;
         }
         // Handle any databases
         if ($db) {
             // Get current error reporting setting and set
             // error reporting to E_ERROR to suppress warnings
             $oldError = ini_get('error_reporting');
             error_reporting(E_ERROR);
             // Test the databases
             echo I18n::factory()->__('Testing the database(s)...') . PHP_EOL;
             foreach ($databases as $dbname => $db) {
                 echo I18n::factory()->__('Testing') . ' \'' . $dbname . '\'...' . PHP_EOL;
                 if (!isset($db['type']) || !isset($db['database'])) {
                     echo I18n::factory()->__('The database type and database name must be set for the database ') . '\'' . $dbname . '\'.' . PHP_EOL . PHP_EOL;
                     exit(0);
                 }
                 $check = Install\Dbs::check($db);
                 if (null !== $check) {
                     echo $check . PHP_EOL . PHP_EOL;
                     exit(0);
                 } else {
                     echo I18n::factory()->__('Database') . ' \'' . $dbname . '\' passed.' . PHP_EOL;
                     echo I18n::factory()->__('Installing database') . ' \'' . $dbname . '\'...' . PHP_EOL;
                     $tables = Install\Dbs::install($dbname, $db, $installDir, $install);
                     if (count($tables) > 0) {
                         $dbTables = array_merge($dbTables, $tables);
                     }
                 }
             }
             // Return error reporting to its original state
             error_reporting($oldError);
         }
         // Install base folder and file structure
         Install\Base::install($install);
         // Install project files
         Install\Projects::install($install, $installDir);
         // Install table class files
         if (count($dbTables) > 0) {
             Install\Tables::install($install, $dbTables);
         }
         // Install controller class files
         if (isset($install->controllers)) {
             Install\Controllers::install($install, $installDir);
         }
         // Install form class files
         if (isset($install->forms)) {
             Install\Forms::install($install);
         }
         // Install model class files
         if (isset($install->models)) {
             Install\Models::install($install);
         }
         // Create 'bootstrap.php' file
         Install\Bootstrap::install($install);
         echo I18n::factory()->__('Project install complete.') . PHP_EOL . PHP_EOL;
     }
 }
예제 #3
0
 /**
  * Install command
  *
  * @return void
  */
 protected function install()
 {
     if (!is_writable(PH_CLI_ROOT . '/config.php')) {
         echo '  The configuration file is not writable. Please make it writable before continuing.' . PHP_EOL . PHP_EOL;
     } else {
         // Install config file and database
         $input = array('language' => null, 'db_adapter' => null, 'db_name' => null, 'db_username' => null, 'db_password' => null, 'db_host' => defined('DB_HOST') && DB_HOST != '' ? DB_HOST : 'localhost', 'db_prefix' => defined('DB_PREFIX') && DB_HOST != '' ? DB_PREFIX : 'ph_', 'app_uri' => defined('APP_URI') ? APP_URI : '/phire', 'content_path' => defined('CONTENT_PATH') ? CONTENT_PATH : '/phire-content', 'password_encryption' => 4);
         $langs = \Pop\I18n\I18n::getLanguages();
         $langKeys = array_keys($langs);
         $langsList = null;
         $i = 1;
         foreach ($langs as $key => $value) {
             $num = $i < 10 ? ' ' . $i : $i;
             $langsList .= '  ' . $num . ' : [' . $key . '] ' . $value . PHP_EOL;
             $i++;
         }
         $db = array('Mysqli', 'Pdo\\Mysql', 'Pdo\\Pgsql', 'Pdo\\Sqlite', 'Pgsql', 'Sqlite');
         echo 'Installation' . PHP_EOL;
         echo '------------' . PHP_EOL;
         echo PHP_EOL;
         echo '  Select Language:' . PHP_EOL . PHP_EOL;
         echo $langsList . PHP_EOL;
         echo PHP_EOL;
         $inputLang = -1;
         while (!isset($langKeys[$inputLang])) {
             $inputLang = self::cliInput('  Enter Language # (Enter for English): ');
             if (empty($inputLang)) {
                 $inputLang = 3;
             } else {
                 $inputLang--;
             }
         }
         $input['language'] = $langKeys[$inputLang];
         echo PHP_EOL . '  Select DB Adapter:' . PHP_EOL . PHP_EOL;
         foreach ($db as $key => $value) {
             echo '  ' . ($key + 1) . ' : ' . $value . PHP_EOL;
         }
         echo PHP_EOL;
         $inputDb = -1;
         while (!isset($db[$inputDb])) {
             $inputDb = self::cliInput('  Enter DB Adapter #: ');
             $inputDb--;
         }
         $input['db_adapter'] = $db[$inputDb];
         if (stripos($input['db_adapter'], 'sqlite') === false) {
             $input['db_name'] = self::cliInput('  DB Name: ');
             $input['db_username'] = self::cliInput('  DB Username: '******'db_password'] = self::cliInput('  DB Password: '******'  DB Host (Enter for \'' . $input['db_host'] . '\'): ');
             $input['db_host'] = empty($inputHost) ? 'localhost' : $inputHost;
         }
         $inputPrefix = self::cliInput('  DB Prefix (Enter for \'' . $input['db_prefix'] . '\'): ');
         $input['db_prefix'] = empty($inputPrefix) ? $input['db_prefix'] : $inputPrefix;
         $inputAppUri = self::cliInput('  Application URI (Enter for \'' . $input['app_uri'] . '\'): ');
         $input['app_uri'] = empty($inputAppUri) ? $input['app_uri'] : $inputAppUri;
         $inputContentPath = self::cliInput('  Content Path (Enter for \'' . $input['content_path'] . '\'): ');
         $input['content_path'] = empty($inputContentPath) ? $input['content_path'] : $inputContentPath;
         // Check the content directory
         if (!file_exists(PH_CLI_ROOT . $input['content_path'])) {
             echo PHP_EOL . '  The content directory does not exist.' . PHP_EOL . PHP_EOL;
             exit;
         } else {
             $checkDirs = Project::checkDirs(PH_CLI_ROOT . $input['content_path'], true);
             if (count($checkDirs) > 0) {
                 echo PHP_EOL . '  The content directory (or subdirectories) are not writable.' . PHP_EOL . PHP_EOL;
                 exit;
             }
         }
         echo PHP_EOL . '  ...Checking Database...';
         if (stripos($input['db_adapter'], 'sqlite') === false) {
             $oldError = ini_get('error_reporting');
             error_reporting(E_ERROR);
             $dbCheck = \Pop\Project\Install\Dbs::check(array('database' => $input['db_name'], 'username' => $input['db_username'], 'password' => $input['db_password'], 'host' => $input['db_host'], 'type' => str_replace('\\', '_', $input['db_adapter'])));
             error_reporting($oldError);
             if (null != $dbCheck) {
                 echo PHP_EOL . PHP_EOL . '  ' . wordwrap($dbCheck, 70, PHP_EOL . '  ') . PHP_EOL . PHP_EOL;
                 echo '  Please try again.' . PHP_EOL . PHP_EOL;
                 exit;
             }
         }
         echo '..OK!' . PHP_EOL . '  ...Installing Database...';
         $install = $install = new Model\Install();
         $install->config(new \ArrayObject($input, \ArrayObject::ARRAY_AS_PROPS), realpath(PH_CLI_ROOT));
         // Install initial user
         echo 'OK!' . PHP_EOL . PHP_EOL . '  Initial User Setup:' . PHP_EOL . PHP_EOL;
         $user = array('email' => null, 'username' => null, 'password' => null);
         $email = '';
         $username = '';
         $password = '';
         $emailValidator = new \Pop\Validator\Email();
         $usernameValidator = new \Pop\Validator\AlphaNumeric();
         while (!$emailValidator->evaluate($email)) {
             $email = self::cliInput('  Enter User Email: ');
         }
         while (strlen($username) < 4 || !$usernameValidator->evaluate($username)) {
             $username = self::cliInput('  Enter Username (> 4 characters): ');
         }
         while (strlen($password) < 6) {
             $password = self::cliInput('  Enter Password (> 6 characters): ');
         }
         $user['email'] = $email;
         $user['username'] = $username;
         $user['password'] = $password;
         echo PHP_EOL . '  ...Saving Initial User...' . PHP_EOL . PHP_EOL;
         if (stripos($input['db_adapter'], 'Pdo') !== false) {
             $dbInterface = 'Pdo';
             $dbType = substr($input['db_adapter'], strpos($input['db_adapter'], '\\') + 1);
         } else {
             $dbInterface = $input['db_adapter'];
             $dbType = null;
         }
         if (stripos($input['db_adapter'], 'sqlite') !== false) {
             $input['db_name'] = PH_CLI_ROOT . $input['content_path'] . '/.htphire.sqlite';
             chmod(realpath(PH_CLI_ROOT . $input['content_path'] . '/.htphire.sqlite'), 0777);
         }
         $db = \Pop\Db\Db::factory($dbInterface, array('type' => $dbType, 'database' => $input['db_name'], 'host' => $input['db_host'], 'username' => $input['db_username'], 'password' => $input['db_password']));
         $db->adapter()->query("INSERT INTO " . $input['db_prefix'] . "users (type_id, role_id, username, password, email, verified, failed_attempts, site_ids, created) VALUES (2001, 3001, '" . $user['username'] . "', '" . Model\User::encryptPassword($user['password'], 4) . "', '" . $user['email'] . "', 1, 0, '" . serialize(array(0)) . "', '" . date('Y-m-d H:i:s') . "')");
         $db->adapter()->query('UPDATE ' . $input['db_prefix'] . 'config SET value = \'' . $user['email'] . '\' WHERE setting = \'system_email\'');
     }
 }