在php中共享主机上创建和导入mysql数据库

时间:2009-07-09 00:16:05

标签: php mysql

我正在尝试编写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 个答案:

答案 0 :(得分:1)

这是在共享主机上的事实不应该在我看来有太多不同。无论您的环境如何,您都必须使用您的用户名,并且数据库名称会以此为前缀,或者根据主机设置不具备。也就是说,使用您的用户名作为前缀或其他一些前缀命名约定,采用命名约定可能是 smart

关于你想要做什么,我有一些建议:

  1. 您应该单独运行每个语句(就像您一样),但在每个步骤之间添加错误检查,这样如果没有例如创建数据库,则不会尝试获取文件。
  2. 可能为每种操作创建单独的函数并发送值的参数。这将在较长时间内清理代码。
  3. 如果您的某个名称会自动为您提供的名称添加前缀,并且您必须检测最终名称,则可以执行“show databases;”查询并搜索您在结果中提供的名称。然后使用完整查询的完整名称。

答案 1 :(得分:1)

使用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,我认为您必须使用您的帐户用户名并通过。然后就像你说你的db名称用你的用户名作为前缀,否则它将无法创建。

答案 2 :(得分:1)

KISS principle:只使用phpMyAdmin?它几乎肯定安装。如果不是,install it

它的进口能力非常强大。如果你的数据库太大了,那就试试吧。如果它仍然很大,请尝试将其分成几块。我怀疑你需要把它作为一个大的交易转移。你呢?


在第一条评论中解释之后,好了,这里有。这是我非常简单的脚本,可以满足您的需求。除了它没有看看分隔符:一个查询==一行。

<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_*()函数应该是微不足道的,如果由于某种原因你更喜欢它。

再一次:是的,我知道这很糟糕。但只要它适合我(tm),可能你......: - )


要完成代码,请参阅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的示例连接字符串。

答案 3 :(得分:0)

关于导入,如果上传限制是一个问题,至少有一个phpMyAdmin的替代方法,它允许您选择Web服务器上的文件而不是上传它。例如, adminer (adminer.org)允许这样做。在adminer中,单击“SQL命令”,然后单击“从服务器”