$db_connection = $_SERVER['DOCUMENT_ROOT'] . '/includes/install/database_connection.php';
if (!file_exists($db_connection)) {
require("install/xmlapi.php");
if (isset($_POST['cpname'])) {
$opts['user'] = $_POST['cpname'];
$opts['pass'] = $_POST['cppass'];
$opts['temp'] = substr(str_shuffle(md5(time())),0,'12');
$xmlapi = new xmlapi($_SERVER['HTTP_HOST']);
$xmlapi->set_port( 2083 );
$xmlapi->password_auth($opts['user'],$opts['pass']);
$xmlapi->set_debug(0);
$cpaneluser=$opts['user'];
$databasename="OSMP_DAT";
$databaseuser="OSMP_admin";
$databasepass=$opts['temp'];
$db = $databasename;
$user = $databaseuser;
$pass = $databasepass;
$loc = 'localhost';
$createdb = $xmlapi->api1_query($cpaneluser, "Mysql", "adddb", array($databasename));
$usr = $xmlapi->api1_query($cpaneluser, "Mysql", "adduser", array($databaseuser, $databasepass));
$addusr = $xmlapi->api1_query($cpaneluser, "Mysql", "adduserdb", array("".$cpaneluser."_".$databasename."", "".$cpaneluser."_".$databaseuser."", 'all'));
include ('install/installer.php');
exit;
}
if (!isset($_POST['dbhost'])) { include ('install/db_installer.php'); }
if (isset($_POST['dbhost'])) {
// save connection details to $db_connection
}
}
Приведенный выше код работает безупречно, как и следовало ожидать.
Сначала он проверяет существование database_connection.php. Если он существует, он включает в себя файл, который содержит детали базы данных.
Если нет — мы предполагаем, что его установили впервые. Поэтому мы запрашиваем у пользователя данные для входа в cpanel, и наш скрипт создает базу данных и сохраняет ее в database_connection.php.
Единственная проблема … это префиксы базы данных. При создании базы данных, если WHM имеет префиксы базы данных, установленные для учетной записи пользователя, тогда префикс базы данных добавляется к имени базы данных.
Я хочу знать, как определить, есть ли префикс, и если да, то как узнать, что это такое, чтобы скрипт мог также префиксировать его в имени базы данных.
Примечание. Я не ищу префикс таблицы, а префикс базы данных, добавленный cpanel / whm
Таким образом, по-видимому, cpanel по умолчанию, если включен префикс, использует первые 8 символов имени пользователя, за которыми следует подчеркивание. Это используется как для базы данных, так и для имен базы данных.
Поэтому я просто изменил приведенный выше код следующим образом:
$db_connection = $_SERVER['DOCUMENT_ROOT'] . '/includes/install/database_connection.php';
if (!file_exists($db_connection)) {
require("install/xmlapi.php");
if (isset($_POST['cpname'])) {
$opts['user'] = $_POST['cpname'];
$prefix = substr($opts['user'],0,8).'_';
if ($prefix === FALSE) {$prefix = $opts['user'];}
$opts['pass'] = $_POST['cppass'];
$opts['temp'] = substr(str_shuffle(md5(time())),0,'12');
$xmlapi = new xmlapi(localhost);
$xmlapi->set_port( 2083 );
$xmlapi->password_auth($opts['user'],$opts['pass']);
$xmlapi->set_debug(1);
$cpaneluser=$opts['user'];
$databasename="OSMP_DAT";
$databaseuser="osmp";
$databasepass=$opts['temp'];
$pass = $databasepass;
$loc = 'localhost';
$createdb = $xmlapi->api1_query($cpaneluser, "Mysql", "adddb", array($databasename));
$usr = $xmlapi->api1_query($cpaneluser, "Mysql", "adduser", array($databaseuser, $databasepass));
$addusr = $xmlapi->api1_query($cpaneluser, "Mysql", "adduserdb", array($databasename, $databaseuser, 'all'));
$db = $prefix.$databasename;
$user = $prefix.$databaseuser;
include ('install/installer.php');
exit;
}
if (!isset($_POST['dbhost'])) { include ('install/db_installer.php'); }
if (isset($_POST['dbhost'])) {
// save connection details to $db_connection
}
}
Итак, теперь выполняется проверка, чтобы определить длину имени пользователя и, если оно длиннее 8 символов, оно усекается до 8. Затем склад добавляется и выводится как переменные для передачи следующей части скрипта.
Единственный недостаток, который я вижу, это то, что хост отключил префикс в whm, так что я уже в пути.
Для тех, кто пытается использовать этот код в будущем — обратите внимание на вас
необходимо защитить включенные файлы, или вы будете иметь колоссальные
проблемы безопасности. Поскольку этот код стоит, кто-то может вручную вызвать
установить / db_installer.php или установить / installer.php и обойти
(! file_exists ($ db_connection)) проверьте и if (isset ($ _ POST)) и
(! isset ($ _ POST [‘dbhost’])).
НЕ ИСПОЛЬЗУЙТЕ ЭТОТ КОДЕКС, ЕСЛИ ВЫ НЕ ЗНАЕТЕ, КАК ЭТО ОБЕСПЕЧИТЬ!
Других решений пока нет …