Oluşturun ve php paylaşılan ana ithalat MySQL veritabanı

4 Cevap php

Bunun olacağını php komut dosyası yazmak çalışıyorum:

  • mysql bağlanmak
  • veritabanı oluşturmak
  • kullanıcı ve şifre oluşturun
  • veritabanına kullanıcı eklemek
  • ithalat veritabanına sql dosyası hazırlandı

Şey paylaşılan bir ana olacağım (ve bunu evrensel yapmak ve farklı bilgisayarlar ile çalışmak için çalışıyorum). Ben veritabanı ve db kullanıcı hesabım adı (I vb, kontrol paneline giriş, ftp için kullanmak ne) paylaşılan ana öneki olacak sanırım? Mylogin gibi bir şey * _ * Dbname ve mylogin * _ * dbuser. Bu cpanel örneğin görünür - Ben veritabanı eklediğinizde Ben onun adını girin ve oluşturulduktan sonra cpanel mylogin * _ * somedb olarak gösterir. Nasıl birden fazla farklı paylaşılan bilgisayarlar bu benim komut dosyası iş yapabilirim - benim ana giriş bağlı olarak otomatik olarak benim önek eklemek?

Şimdi (eğer çalışırsa, o aklıma geldi sadece ne bir ipucu yok) böyle bir kod ile çalışma:

<?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 Cevap

KISS principle: Sadece phpMyAdmin kullanmak? Bu, neredeyse kesinlikle kurulu. Değilse, install it.

Onun alma yeteneği muhteşem. Veritabanı çok büyük bir ihtimal varsa, bunu gziplemek. O büyük hala varsa, bir kaç parçaya o kadar ayırmayı deneyin. Ben tek bir büyük işlem olarak aktarmak gerekir şüpheliyim. Öyle mi?


Ilk yorumda açıklamadan sonra, işte gidiyor. Bu ne istediğinizi yapar, benim çok basit bir betik. Bir sorgu == bir satır: Bu ayırıcılar bir göz almaz hariç.

<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);
?>

Ayrıca her sorgu ne kadar sürdü küçük bir istatistik verir. Bu PDO etrafında dayanıyor; Ben PDO PHP5.1 veya PHP5.2 tanıtıldı inanıyorum. Ben nedense İsterseniz mysql_*() fonksiyonları ile doğrudan çalışmak için değiştirmek için önemsiz olması gerektiğini düşünüyorum.

Ve bir kez daha: evet, ben berbat biliyorum. Ama sürece o Me (tm) için çalışır gibi, ve muhtemelen sen ... :-)


Kodunu tamamlamak için, burada include/db.php ve bir örnek vardır 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 ve PostgreSQL için örnek bağlantı dizeleri bulunuyor.

Bu paylaşılan bir bilgisayar üzerinde olması bence bir fark bu kadar yapmamalıyız. Ne olursa olsun ortam, sizin adınızı kullanmak ve veritabanı adı ile o ya da öneki alır veya kurulum hosting göre değildir olacak. Yani smart bir önek veya başka bir önek adlandırma kuralı olarak kullanıcı adınız ile bir adlandırma kuralı kabul muhtemelen olduğunu söyledi.

Yapmanız çalıştığınız ne gibi bazı önerileri var:

  1. Sen (gibi) ayrı ayrı her bir deyimi çalıştırın ama veritabanı örneği için oluşturulan değildi eğer dosyayı kaynak çalışmayın böylece her adım arasında hata denetimini eklemek gerekir.
  2. Belki operasyon her tür için ayrı ayrı işlevler oluşturmak ve değerleri için parametrelerin göndermek. Bu uzun vadede kodunu temizlemek olacaktır.
  3. Bir şey otomatik olarak sağlamak adının önüne bir durum var ve finale adını tespit varsa, muhtemelen bir "show databases;" sorgu yapmak ve sonuçlar verdi adı arayabilirsiniz. Sonra çıkan sorguları için tam adını kullanın.

Use mysql_error() http://us3.php.net/manual/en/function.mysql-error.php

Yani neyin yanlış gittiğini görebilirsiniz.

örneğin:

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

Aynı mysql_connect için ()

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

Eğer kullandığınız kullanıcı veritabanlarını oluşturmak için gereken ayrıcalıklara sahip olduğundan emin olmak gerekir.

CPanel için ben size hesap adınızı kullanmak ve geçmek zorunda inanıyorum. Eğer kullanıcı adı ile db adı öneki, ya da oluşturmak için başarısız olur dedi sonra gibi.

Yükleme sınırı sorunu ise ithalat ile ilgili olarak, yerine onu yükleme web sunucusu üzerinde bir dosya seçmenizi sağlar phpMyAdmin en az bir alternatif vardır. Örneğin adminer (adminer.org) ulaşmasını sağlar. Adminer "SQL komutu" ve ardından "sunucu" tıklayın