Я пытаюсь написать php-скрипт, который:
Дело в том, что это будет на общем хосте (и я пытаюсь сделать его универсальным и работать с разными хостами). Я предполагаю, что у пользователя базы данных и 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 ?>
Принцип KISS : просто используйте phpMyAdmin? Это почти наверняка установлено. Если это не так, установите его .
Его возможности импорта великолепны. Если ваша база данных слишком велика, gzip. Если он по-прежнему большой, попробуйте разделить его на несколько частей. Я сомневаюсь, что вам нужно перенести его как одну большую транзакцию. Вы?
После объяснения в первом комментарии, хорошо, здесь идет. Это мой очень упрощенный сценарий, который делает то, что вы хотите. Кроме того, он не рассматривает разделители: один запрос == одна строка.
<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.
Тот факт, что это находится на общем хозяине, не должен иметь такой большой разницы, на мой взгляд. Независимо от вашей среды, вам нужно будет использовать свое имя пользователя, и либо имя базы данных будет префикс с этим, либо оно не соответствует настройке хостинга. Тем не менее, вероятно, разумно принять соглашение об именах с вашим именем пользователя в качестве префикса или другого соглашения об именах префикса.
Что касается того, что вы пытаетесь сделать, у меня есть некоторые предложения:
show databases;
» и искать имя, которое вы дали в результатах. Затем используйте полное имя для полученных запросов. Использовать 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 с вашим именем пользователя, или он не сможет создать.
Что касается импорта, если ограничение на загрузку является проблемой, есть хотя бы одна альтернатива phpMyAdmin, которая позволяет вам выбирать файл на веб-сервере, а не загружать его. Например, adminer (adminer.org) позволяет это. В администраторе нажмите «Команда SQL», а затем нажмите «с сервера»,