Создание и импорт базы данных mysql на общем хосте в php - PullRequest
2 голосов
/ 09 июля 2009

Я пытаюсь написать PHP-скрипт, который бы:

  • подключиться к mysql
  • создать базу данных
  • создать пользователя и пароль
  • добавить пользователя в базу данных
  • импортировать подготовленный файл sql в базу данных

Дело в том, что он будет на общем хосте (и я пытаюсь сделать его универсальным и работать с разными хостами). Я предполагаю, что для базы данных и пользователя базы данных будет указан префикс моего имени учетной записи (что я использую для ftp, для входа в панель управления и т. Д.) На общих хостах? Что-то вроде mylogin _ dbname и mylogin _ dbuser. Это видно, например, в cpanel - когда я добавляю базу данных, я ввожу ее имя, и после ее создания cpanel показывает его как mylogin _ somedb. Как мне заставить мой скрипт работать с этим на нескольких разных хостах - добавить мой префикс автоматически в зависимости от моего основного логина?

Теперь работаем с таким кодом (не имею понятия, работает ли он, вот что мне пришло в голову):

<?php
mysql_connect("host", "user", "password"); // Connection to MySQL

$query = "CREATE DATABASE somedb;
USE somedb;
SOURCE path/to/sqlfile.sql;
CREATE USER someuser IDENTIFIED BY PASSWORD 'somepass';
GRANT SELECT,INSERT,UPDATE,DELETE ON somedb.* TO 'someuser'@'host';";

$arr= explode( ';', $query );
foreach( $arr as $command )
{
mysql_query( $command );
}  
mysql_close(); // Disconnection from MySQL
?>

Ответы [ 4 ]

1 голос
/ 09 июля 2009

Использовать mysql_error () http://us3.php.net/manual/en/function.mysql-error.php

Так что вы можете видеть, что пошло не так.

например:

if (mysql_query( $command ) === false) {
  echo mysql_error();
  die;
}

То же самое для mysql_connect ()

if (($link = mysql_connect("host", "user", "password")) === false) {
  echo mysql_error();
  die;
}

Вы должны убедиться, что у пользователя, которого вы используете, есть права на создание баз данных.

Для CPanel я считаю, что вы должны использовать свое имя пользователя и пройти. Затем, как вы сказали, префикс вашего имени базы данных с вашим именем пользователя, или он не сможет создать.

1 голос
/ 09 июля 2009

Принцип поцелуя : просто использовать phpMyAdmin? Это почти наверняка установлено. Если это не так, установите его .

Великолепен импорт. Если ваша база данных слишком велика, распакуйте ее. Если он все еще большой, попробуйте разделить его на несколько частей. Я сомневаюсь, что вам нужно передать это как одну большую транзакцию А ты?


После объяснения в первом комментарии, хорошо, здесь идет. Это мой очень упрощенный сценарий, который делает то, что вы хотите. За исключением того, что не смотрите на разделители: один запрос == одна строка.

<link rel="stylesheet" href="style/contents.css"/>
<?

function timesanitize($v) {
    if ($v > 0)
        return round($v, 4);
    else
        return 0;
}

$startmt = microtime();
include_once 'include/db.php';
$f = fopen("db.sql","r");
echo dbGetEngine() . "<br>";
echo "<ul>";
do {
    $l = rtrim(fgets($f));
    if (strlen($l) == 0)
        continue;
    if (substr($l, 0, 1) == '#')
        continue;
    $l = str_replace(
        array("\\n"),
        array("\n"),
        $l);
    if (dbGetEngine() == "pgsql")
        $l = str_replace(
            array("IF NOT EXISTS", "LONGBLOB"),
            array("", "TEXT"),
             $l);
    try {
        echo "<li>".nl2br(htmlspecialchars($l));
        $mt = microtime();
        $db->query($l);
        echo "<ul><li>ok - " . timesanitize(microtime() - $mt) . "</ul>";
    } catch (PDOException $e) {
        echo "<ul><li>".$e->getMessage() . "</ul>";
    }
} while (!feof($f));
fclose($f);

echo 'total: ' . timesanitize(microtime() - $startmt);
?>

Он также выводит небольшую статистику того, сколько времени занимал каждый запрос. Он основан на PDO; Я считаю, что PDO был введен в PHP5.1 или PHP5.2. Я думаю, что это должно быть тривиально изменить его для работы непосредственно с mysql_*() функциями, если по какой-то причине вы предпочитаете это.

И еще раз: да, я знаю, это отстой. Но пока это работает для меня (тм), и, возможно, вы ...: -)


Чтобы завершить код, вот include/db.php и пример include/config.php:

include/db.php

<?
include_once 'include/config.php';

try {

        $attribs =  
                array(
                        PDO::ATTR_PERSISTENT => $config['db']['persistent'],
                        PDO::ATTR_ERRMODE => $config['db']['errormode']
                );


        $db = new PDO(
                $config['db']['uri'],
                $config['db']['user'],
                $config['db']['pass'],
                $attribs
        );
        $db->query("SET NAMES 'utf8'");
        $db->query("SET CHARACTER SET 'utf8'");

} catch (PDOException $e) {
        print "Error!: " . $e->getMessage() . "<br/>";
        die();
}

function dbGetEngine() {
        global $config;
        return substr($config['db']['uri'], 0, strpos($config['db']['uri'], ':'));
}
?>

include/config.php

<?

//$config['db']['uri'] = 'sqlite:' . realpath('.') . '/site.db'; // PDO's database access URI
$config['db']['uri'] = 'mysql:host=localhost;dbname=sitedb'; // server should be : 195.78.32.7
//$config['db']['uri'] = 'pgsql:host=localhost;dbname=sitedb';
$config['db']['user'] = 'user_goes_here'; // database username
$config['db']['pass'] = 'pass_goes_here'; // database password
$config['db']['persistent'] = false; // should the connection be persistent
$config['db']['errormode'] = PDO::ERRMODE_EXCEPTION; // PDO's error mode

?>

Включены примеры строк подключения для SQLite, MySQL и PostgreSQL.

1 голос
/ 09 июля 2009

То, что это на общем хосте, не должно иметь большого значения, по моему мнению. В какой бы среде вы ни находились, вам придется использовать свое имя пользователя, и либо к имени базы данных будет добавляться префикс, либо нет, в соответствии с настройками хостинга. Тем не менее, вероятно умно принять соглашение о присвоении имен с вашим именем пользователя в качестве префикса или какое-либо другое соглашение о присвоении имен.

Что касается того, что вы пытаетесь сделать, у меня есть несколько предложений:

  1. Вы должны выполнять каждый оператор отдельно (как и вы), но добавлять проверку ошибок между каждым шагом, чтобы не пытаться получить исходный файл, если база данных не была создана, например.
  2. Может быть, создать отдельные функции для каждого вида операции и отправить параметры для значений. Это позволит очистить код в долгосрочной перспективе.
  3. Если у вас есть ситуация, когда к имени, которое вы предоставляете, автоматически добавляется префикс, и вам необходимо определить окончательное имя, вы, вероятно, можете выполнить запрос "show databases;" и найти имя, которое вы дали в результатах. Затем используйте полное имя для полученных запросов.
0 голосов
/ 08 сентября 2013

Что касается импорта, если лимит загрузки является проблемой, есть по крайней мере одна альтернатива phpMyAdmin, которая позволяет вам выбрать файл на веб-сервере вместо его загрузки. Например, adminer (adminer.org) позволяет это. В админке нажмите «SQL команда», а затем «с сервера»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...