2012-01-07 5 views
0

新しいデータベースを作成せずに.sqlファイルを使用してリモートサーバーへのデータベースの更新を許可するphpMyAdminのインポートオプションのような、PHPでユーティリティを作成したいとします。PHPスクリプトを使用して.sqlファイルでリモートサーバーのデータベースを更新するには?

クライアント側のユーティリティなので、cpanelへのアクセスは許可されていません。

このアプリケーションには、オフライン&オンラインの2種類の作業環境があります。

クライアントがオフラインで動作する場合は、データベースのバックアップを取る必要があり、オンラインの場合と同様にリモートサーバーでデータベースを更新する必要があります。

次に、リモートサーバーのデータベースを更新する必要があります。

+4

だから、私たちはあなたにそれを書いて欲しいですか? –

+0

@ダゴン:私を間違ってはいけません。私はこのすべてのものを初心者です。私はスタートを得るためのアイデアを与えてください。 –

+0

@VijinPaulraj、PHPMyAdmin自体を使わないのはなぜですか?これは、私が状況を完全に理解していないので、ちょうど提案のためです。 – Abhay

答えて

2

ソリューション1

Linuxシステム上のPHPを実行している場合は、「mysqlの」コマンド自体を使用して試すことができます。しかし、だからここ

を、あなたのPHPのインストールは、「システム」コマンドを実行する権限を持っていることに注意してシステムのような()、EXEC()などしてください、私が言うことを意味するものである:

system("mysql -U{db_user_name} -h{db_host} -P{db_password} < {full_path_to_your_sql_file}"); 

交換してください、

DBユーザ名と{db_user_name}、

DBホストと{DB_HOST}、

{DB_PASSWORD} DBパスワードと、

{full_path_to_your_sql_file}にSQLファイルへのパスを入力します。

もちろん、これにはSQLファイルをアップロードする必要があります。

解決方法2:

ラインでとPHPの標準のMySQLライブラリを使用して各ステートメントを実行読みながらSQLファイルの行を読んでください。次のようなものがあります:

$arrFile = file("full_path_to_sql_file.sql", FILE_IGNORE_NEW_LINES); 
foreach ($arrFile as $q) { 
    mysql_query($q); 
} 

しかし、これはそう簡単ではないかもしれません。 SQLファイルにコメントやその他の.sql固有の文がある場合は、それらを無視するチェックを行う必要があります。または、SQLファイルにSQL文だけが含まれている方が良いでしょう。

+2

SQLファイルには、1行に1つのクエリがあると仮定することはできません。 – ThiefMaster

+0

あなたは ';'で分割することができますが、まだいくつかの文字列の中で ';'が見つかるかもしれません – emaillenin

0

あなたはそれを持っていたら、あなたは、

move_uploaded_file($_FILES["file"]["tmp_name"],"tmpdb/" . $_FILES["file"]["name"]); 

、あなただけ.sqlファイルとテキストタイプを取得するために適切に入力された文字列をサニタイズを確認して、.sqlファイルを取得するために定期的にアップロードスクリプトを使用することができます

mysql_select_db('dbname'); 

次に、fopen()でSQLファイルを開きます。変数にその吸盤を平手打ち

$file = fopen("userdb.sql","r"); 
$usersql = fread($file, 5); 
fclose($file); 

そしてちょうどするmysql_queryでそれを投げます();

$uploaddb = mysql_query($usersql) or die(mysql_error()); 

者は、代わりにあなただけの他のセキュリティ問題を切り開くことを、シェルexecを使うことができますが、私はお勧めし概念です。

+0

なぜ地球上で5バイトしか読まないのですか?また、mysql_query()は正しく覚えていれば、一度に1つのクエリしか実行できません。 –

+0

あなたは正しいですfilesize()を使用して5をスワップすることができます、MySQLのクエリは、完全な.sqlファイルを処理することでした。 – krazybean

+0

@krazybean:あなたの貴重なレスポンスをありがとう。既存のデータベースを削除しなければならないのだろうか、それとも置き換えられるのかどうかは分かっていないだろうか?スクリプトでは、既存のデータベースに自動的に置き換えてほしい。 HoshSadiq @ –

0

BigDumpを使用するとよいでしょうか?

0

最終的に私は自分の質問に答えました。私は設定やその他のものを使わずにPHPコーディングを貼り付けました。

$filename ="test.sql";   
    mysql_select_db("test"); 

    //truncate the database. 

    $result_t = mysql_query("SHOW TABLES"); 
    while($row = mysql_fetch_assoc($result_t)) 
    { 
     mysql_query("TRUNCATE " . $row['Tables_in_' . $mysql_database]); 
    } 
    // Temporary variable, used to store current query 
    $templine = ''; 
    // Read in entire file 
    $lines = file($filename); 
    // Loop through each line 
    foreach ($lines as $line) 
    { 
     // Skip it if it's a comment 
     if (substr($line, 0, 2) == '--' || $line == '') 
      continue; 

     // Add this line to the current segment 
     $templine .= $line; 
     // If it has a semicolon at the end, it's the end of the query 
     if (substr(trim($line), -1, 1) == ';') 
     { 
      // Perform the query 
      mysql_query($templine) or print('Error performing query \'<strong>' . $templine . '\': ' . mysql_error() . '<br /><br />'); 
      // Reset temp variable to empty 
      $templine = ''; 
     } 
    } 
+0

は解決策ですか? – Karthi

関連する問題