2009-07-09 14 views
2

で共有ホスト上のMySQLデータベースを作成し、インポート:私は希望PHPスクリプト記述しようとしているPHP

  • がデータベース
  • は、ユーザーを追加、ユーザーとパスワード
  • を作成作成
  • をMySQLへの接続をデータベースへ
  • インポートに準備されたSQLファイルデータベースへ

T彼のことは、それが共有ホスト上にあることです(そして、私はそれを普遍的なものにして、異なるホストで作業しようとしています)。私は、データベースとdbユーザーのプレフィックスに私のアカウント名(私は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 
?> 
+1

私が使用した共有ホストは、コントロールパネル以外の場所からデータベースやユーザーを作成させないようにしてください。 – grapefrukt

答えて

1

KISS principle:phpMyAdminを使用しますか?それはほぼ確実にインストールされています。そうでなければ、install it

そのインポート機能は素晴らしいです。あなたのデータベースが多すぎる場合は、gzipしてください。それでもまだ大きければ、いくつかの部分に分割してみてください。私はあなたが単一の大きな取引としてそれを転送する必要があるかどうかは疑問です。あなたは?


最初のコメントの説明の後、よく、ここに行きます。これはあなたが望むことをする非常に単純なスクリプトです。セパレータを見ない限り、1つのクエリ== 1行です。

<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

しかし、限り、それは私のための作品として(TM)、そしておそらくあなたが... :-)


コードを完了するには、ここではinclude/db.phpとサンプルinclude/config.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 

?> 

を含めますdはSQLite、MySQL、PostgreSQLのサンプル接続文字列です。

+0

私は普遍的なスクリプトを作り、phpmyadmin curlを避けようとしています(グレープフルークが私のホスト上で問題になると言えば、カールは私の唯一の選択肢になるでしょう)。 1つのサイトではなく、複数の使用のためのスクリプトになります。 – Phil

+0

ありがとう:) include_onceに含まれるもの 'include/db.php' ;?作成するデータベースの名前、ユーザー名などはどこで指定しますか? – Phil

+0

db.phpにはデータベース初期化ルーチンが含まれています。 *一息*私はそれらを上に置くでしょう。それはPDO関連のものですが、コードは箱の外で動作するはずです:-) –

1

これは、共有ホスト上にあるという事実は、それを行うべきではありません私の意見の多くの違い。どのような環境であれ、ユーザー名を使用する必要があります。データベース名には接頭辞が付いているか、ホスティング設定に従わないものがあります。それは恐らくスマートで、あなたのユーザ名に接頭辞または他の接頭辞命名規則として命名規則を採用すると言いました。あなたが何をしようとしてのよう

私はいくつかの提案を持っている:

    あなたは(あなたがそうであるように)個別のステートメントを実行しますが、あなたがソースを試みないように、各ステップの間、エラーチェックを追加する必要があります
  1. たとえば、データベースが作成されていない場合はファイル。
  2. 操作の種類ごとに別々の関数を作成し、値のパラメータを送信することがあります。これは、より長い実行でコードをクリーンアップします。
  3. あなたが入力した名前に自動的にプレフィックスが付けられ、最終的な名前を検出する必要がある場合は、「show databases;」というクエリを実行して、結果に名前を付けて検索することができます。次に、結果の照会に完全名を使用します。
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については、アカウントのユーザー名とパスを使用する必要があります。その後、あなたのユーザ名に接頭辞をつけたようにするか、作成に失敗します。

0

アップロードに関する制限がある場合、アップロードする代わりにウェブサーバー上のファイルを選択できるphpMyAdminの代替方法が少なくとも1つあります。たとえば、の管理者(adminer.org)がそうです。管理者で「SQLコマンド」をクリックし、「サーバーから」をクリックしてください

関連する問題