Intereting Posts
Переупорядочить XML-результаты на основе данных XML Абстрактный класс против интерфейса PDO Обновление нескольких записей Передача PHP параметров по URL-адресу Невозможно заставить Laravel 4 работать на localhost Получение данных из базы данных и использование их для заполнения формы – WordPress Блокирование возможности создания классов непосредственно в обход фабрики Является ли это подходящей системой регистрации и регистрации Вкладка и препровождение в JSON-выход в Chrome Проблемы с установкой PHP 5.3 с apache на centos Можно ли получить специальную информацию о локальном диске с PHP? Как добавить поле ввода динамически в пустой форме? Запрещено У вас нет разрешения на доступ к этому серверу. Сервер не может читать файл htaccess, запрещающий доступ к безопасности Хотите подключиться к серверу iCloud caldav и добавить событие, желательно из PHP Получить результаты разбивки на страницы в Active Collab API

Создание и импорт базы данных mysql на общий хост в php

Я пытаюсь написать php-скрипт, который:

  • подключиться к mysql
  • создать базу данных
  • создать пользователя и пароль
  • добавить пользователя в базу данных
  • импортировать подготовленный sql-файл в базу данных

Дело в том, что это будет на общем хосте (и я пытаюсь сделать его универсальным и работать с разными хостами). Я предполагаю, что у пользователя базы данных и 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 ?> 

Solutions Collecting From Web of "Создание и импорт базы данных mysql на общий хост в php"

Принцип 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.

Тот факт, что это находится на общем хозяине, не должен иметь такой большой разницы, на мой взгляд. Независимо от вашей среды, вам нужно будет использовать свое имя пользователя, и либо имя базы данных будет префикс с этим, либо оно не соответствует настройке хостинга. Тем не менее, вероятно, разумно принять соглашение об именах с вашим именем пользователя в качестве префикса или другого соглашения об именах префикса.

Что касается того, что вы пытаетесь сделать, у меня есть некоторые предложения:

  1. Вы должны запускать каждую инструкцию отдельно (как вы это делаете), но добавляете проверку ошибок между каждым шагом, чтобы вы не пытались исправить файл, если база данных не была создана, например.
  2. Возможно, создайте отдельные функции для каждого вида операций и отправьте параметры для значений. Это позволит очистить код в более продолжительном режиме.
  3. Если у вас есть ситуация, когда что-то автоматически присваивается имени, которое вы предоставляете, и вам нужно определить окончательное имя, вы, вероятно, можете выполнить запрос « 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», а затем нажмите «с сервера»,