Php открыть файл sql

Запуск MySQL * .sql файлов в PHP

. Я никогда не получал полезного вывода, но следил за некоторыми предложениями в другом потоке и, наконец, все это работало. Я переключаюсь в формат —option=value для команд и вместо < используется --execute="SOURCE . " вместо < .

Кроме того, у меня никогда не было хорошего объяснения разницы между shell_exec() и exec() .

Разница между shell_exec() и exec() заключается в том, что shell_exec возвращает весь выходной поток в виде строки. exec возвращает последнюю строку вывода. через stackoverflow.com/a/7093892/557358

11 ответов

Этот вопрос возникает время от времени. Там нет хорошего решения для запуска .sql script непосредственно из PHP. Существуют крайние случаи, когда утверждения, общие в .sql script, не могут быть выполнены в качестве операторов SQL. Например, инструмент mysql имеет встроенные команды, которые не распознаются сервером MySQL, например. CONNECT , USE и DELIMITER .

Итак, я даю +1 для ответа @Ignacio Vazquez-Abrams . Вы должны запустить ваш .sql script в PHP, вызвав инструмент mysql , например, shell_exec() .

$command = "mysql -u -p " . "-h -D < "; $output = shell_exec($command . '/shellexec.sql'); 

Важнейшая часть состоит в том, что перед MySQL -p не следует пробел.

Я также написал его с синтаксисом переменной интерполяции вместо так много конкатенации строк.

См. также мои ответы на следующие вопросы:

Я пробую маршрут shell_exec (), но я не нахожу примеров, указывающих файл для выполнения. Это то, что у меня есть: shell_exec('mysql' . ' -u ' . $vals['db_user'] . ' -p ' . $vals['db_pass'] . ' -D ' . $vals['db_name']);

Спасибо, Билл! Я обновил свой вопрос, где я нахожусь в процессе. Это все еще не работает, и я не могу понять, почему.

Я подумал, что хотел бы дать некоторое представление всем, кто читает это, и не может заставить его работать. Одна проблема, которая может возникнуть с shell_exec, заключается в том, что mysql не находится на пути. Это легко проверить, выполнив команду mysql в консоли на зараженной машине. В этом случае MySQL необходимо будет добавить к пути, или потребуется альтернативный подход.

@AaronNewton, хорошая идея. Проблемы, связанные с путями, довольно простые, но я забываю, сколько людей все еще борются с ними.

$commands = file_get_contents($location); $this->_connection->multi_query($commands); 

Ваше решение работает для mysqli . Я использую PDO. Ваш ответ побудил меня сделать поиск, и я нашел это: stackoverflow.com/questions/6346674/…

Я использую mysqli и не могу заставить это решение работать. $ command просто возвращается как пустая строка. Для $ location я попробовал как относительный локальный путь (файл скрипта находится в той же папке, что и файл php), так и полностью определенную гиперссылку. Я получаю тот же результат в любом случае.

Это похоже на сбой для некоторых типов сложных запросов, таких как создание процедуры и ее выполнение.

function run_sql_file($location) < //load file $commands = file_get_contents($location); //delete comments $lines = explode("\n",$commands); $commands = ''; foreach($lines as $line)< $line = trim($line); if( $line && !startsWith($line,'--') )< $commands .= $line . "\n"; >> //convert to array $commands = explode(";", $commands); //run commands $total = $success = 0; foreach($commands as $command) < if(trim($command))< $success += (@mysql_query($command)==false ? 0 : 1); $total += 1; >> //return number of successful queries and total number of queries found return array( "success" => $success, "total" => $total ); > // Here a startsWith function function startsWith($haystack, $needle)

Существуют крайние случаи, когда это завершится неудачей, и не с сообщением об ошибке, а с (потенциально) неожиданным поведением. Например, многострочные строковые литералы в ваших операторах SQL могут начинаться со строки '--' , или строковые литералы могут содержать ; персонажи. Если вы собираетесь пойти по этому пути, вам действительно следует использовать полный анализатор SQL.

Для этого вам нужно создать полный парсер SQL. Я рекомендую вам использовать инструмент командной строки mysql для этого, вызывая его извне из PHP.

Я знаю, что я очень опаздываю на вечеринку, но PHP Mini Admin уже несколько раз был спасателем. Это в основном "облегченный" PHPMyAdmin, который содержится в одном файле, поэтому нет необходимости в сложных установках, просто загружайте его и входите в систему. Simples!

Мне никогда не приходилось его использовать, но класс mysqli имеет метод multi_query:

Не забывайте о phpMyAdmin. Довольно прочный интерфейс для взаимодействия с MySQL.

Я не знаю, решает ли ваша проблема вашу проблему, так как я не знаю, можете ли вы взаимодействовать с ней непосредственно из кода, но просто захотеть выбросить ее там.

Хорошее предложение тоже. Разбирая дампы MySQL в чистом PHP- отстой , phpMyAdmin избавляет от этого (хотя и не автоматизируется).

Вы можете использовать этот script для запуска файлов MySQL script. Вам, конечно, нужно будет задавать $hostName, $userName, $password, $dataBaseName, $port и $fileName.

 2) < $delimiter = $matches[3][0]; $script = substr($script, $matches[3][1] + 1); >else < if (strlen($statement = trim(substr($script, 0, $matches[0][1])))) < $result[] = $statement; >$script = substr($script, $matches[0][1] + 1); > > return $result; > function executeScriptFile($fileName, $dbConnection) < $script = file_get_contents($scriptFleName); $statements = parseScript($script); foreach($statements as $statement) < mysqli_query($dbConnection, $statement); >> $hostName = ''; $userName = ''; $password = ''; $dataBaseName = ''; $port = ''; $fileName = ''; if ($connection = @mysqli_connect($hostName, $userName, $password, $dataBaseName, $port)) < executeScriptFile($fileName, $connection); >else

При написании ответа на свой вопрос, не могли бы вы опубликовать объяснение, а также код. Без объяснения мы все еще не знаем, почему проблема была решена без изучения большого количества бесполезного кода.

Это был не мой вопрос. ТС спросил: «Я хотел бы выполнить эти файлы из PHP». Я дал сценарий, как это сделать. Если вы не можете прочитать такой маленький кусочек кода (не так много, чтобы изучать, он слишком мал и очевиден), и если вам не нужно решение - почему вы можете просто пропустить мой ответ вместо того, чтобы быть таким грубым? 🙂

Я не пытаюсь быть грубым. Видите это голосование сверху вниз (кто-то другой положил его туда, если вы думаете, что это я)? Я пытаюсь рассказать вам, почему вы получаете его, и предлагаю, что вы можете сделать, чтобы получить вместо него голоса. Я только пытаюсь помочь. также он был отредактирован 3 минуты назад и теперь выглядит лучше. К сожалению, для новичков пользователи здесь ожидают фантастический ответ (и вопрос), а также рабочий код. Это ловкость. Как только вы это сделаете, вы сможете делать хорошие ответы (и вопросы) и получать положительные отзывы.

Надеюсь я не обидел, я не хотел. Как я уже говорил выше, я пытаюсь завоевать репутацию, улучшая ваши ответы и вопросы.

Я создал миграцию script с multi_query . Он может обрабатывать вывод mysqldump и экспорт phpmyadmin без инструмента командной строки mysql. Я также сделал несколько логических операций для обработки нескольких файлов миграции на основе временной метки, хранящейся в БД, например Rails. Я знаю, что для этого требуется больше обработки ошибок, но в настоящее время работает для меня.

Я думаю, что если вы не будете обрабатывать ввод пользователя с помощью только скриптов, созданных разработчиками или инструментами экспорта, вы можете безопасно использовать его.

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

$hostname = "localhost"; $database = "databasename"; $username = "rootuser"; $UserPassword = "password"; $myconnection = mysql_pconnect($hostname, $username , $UserPassword) or trigger_error(mysql_error(),E_USER_ERROR); mysql_connect($hostname , $username , $UserPassword ) or die(mysql_error()); mysql_select_db($database) or die(mysql_error()); if ( !$myconnection ) < echo "Error connecting to database.\n";>$userstableDrop = " DROP TABLE IF EXISTS `users`"; $userstableCreate = " CREATE TABLE IF NOT EXISTS `users` ( `UserID` int(11) NOT NULL, `User_First_Name` varchar(50) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=15" ; $userstableInsert = "INSERT INTO `users` (`UserID`, `User_First_Name`) VALUES (1, 'Mathew'), (2, 'Joseph'), (3, 'James'), (4, 'Mary')"; $userstableAlter1 = "ALTER TABLE `users` ADD PRIMARY KEY (`UserID`)"; $userstableAlter2 = " ALTER TABLE `users` MODIFY `UserID` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=15"; $createDb_sql = $userstableDrop; $insertSite = mysql_query($createDb_sql); $createDb_sql = $userstableCreate; $insertSite = mysql_query($createDb_sql); $createDb_sql = $userstableInsert; $insertSite = mysql_query($createDb_sql); $createDb_sql = $userstableAlter1; $insertSite = mysql_query($createDb_sql); $createDb_sql = $userstableAlter2; $insertSite = mysql_query($createDb_sql); echo "Succesful!"; mysql_close($myconnection ); 
// connect to db. if (mysql_query("SOURCE myfile.sql"))

Есть способы обойти это. но, пожалуйста, будьте очень внимательны к запросам; если не соблюдать осторожность, они склонны к инъекции SQL. Прочитайте: php.net/manual/en/function.mysql-query.php и dev-explorer.com/articles/multiple-mysql-queries

Ещё вопросы

  • 0 Оператор C ++ >> перегрузка
  • 1 ICAL Recurrence RULE Generation (RRULE)
  • 0 Изменение непрозрачности Javascript
  • 1 Как использовать атрибут «android: inputMethod»?
  • 1 Как нарезать MultiIndex и столбец?
  • 1 Повторение вызова метода
  • 0 Встроенное переполнение: скрыто, только частично работает
  • 0 Обновление mongodb из php формы
  • 0 httpd: Как перенаправить все звонки из одного каталога в другой?
  • 0 Раскрывающееся меню jQuery открывает все подменю
  • 0 Не удается обновить поле даты и времени MS SQL с помощью PHP
  • 1 Почему я не могу определить элемент DOM как глобальную переменную?
  • 0 memset устанавливает случайные значения [дубликаты]
  • 0 используя дублированные переменные JavaScript
  • 0 Показать ссылку в jquery datagrid
  • 0 Как написать поисковый запрос в MySQL, который сопоставляет столбцы из разных таблиц и возвращает другой столбец из первой таблицы?
  • 0 Как сделать логотип сайта typo3 динамичным, включив typoscript в сайт typo3
  • 1 Каков наилучший способ построить набор объектов динамической длины в Java?
  • 1 Рассчитать RA DEC / AZ EL точек Лагранжа, видимых с места на земле
  • 0 Выбор опций в angular-ui впереди не влияет
  • 0 Magento - Доступ к сеансу вне magento
  • 0 Как по-разному отображать данные в угловых аккордеонах для каждого аккордеона
  • 0 Почему модальное содержимое не скрывается, если модальное не отображается?
  • 1 Кодировка Javax.ws при несовместимости парсинга
  • 0 SQL: запрос отображает максимальную дату (первая и вторая максимальная дата) [дубликаты]
  • 0 Каталоги поиска из исходников кода
  • 0 Динамический выпадающий список с использованием HTML и PHP
  • 1 Как я могу скопировать триангуляцию Делоне в новые точки?
  • 0 Как показать данные MySQL в HTML-текст ввода?
  • 1 Разбор строки данных: split против регулярного выражения
  • 0 Пользовательский ввод для фильтрации строк таблицы
  • 0 CSS-стиль не отображается в браузере
  • 0 Контактная форма сайта вдруг перестала работать после нескольких лет работы?
  • 0 Пагинация в Yii без базы данных
  • 0 Codeigniter - передача нескольких значений для просмотра
  • 0 HTML читается как недопустимый, перемещая содержимое HTML в
  • 0 Qt: joinMulticastGroup для всего интерфейса
  • 1 Как я могу сделать интервал?
  • 0 Гиперссылка не открывается в Iframe, а открывается в новой вкладке
  • 0 Обновление JQuery до более новой версии, но какой?
  • 1 Добавить более одного видео
  • 1 Как вытащить данные с сервера sas в hdfs, используя Java?
  • 0 Как поместить в текст внутри

    в html + css?

  • 0 использовать мод начальной загрузки без отдельного контроллера
  • 1 Руководство по GStreamer для Android не удалось построить
  • 0 Настройка списка в спящем запросе Hibernate не работает
  • 1 Android Studio не может разрешить ресурсы для пользовательских представлений в предварительном просмотре макета
  • 0 Остановить браузер от чтения медиа-запросов
  • 0 шаблон angularjs (из ng-repeat) и пользовательская директива для того же вопроса элемента

Источник

Load and execute SQL files with PHP

How to load a SQL query from a file instead of having an inline query. This is done to help with formatting and easier understanding of the code.

All that is needed is the simple file_get_contents() in the place of the query string.

fetch_all_colors.sql in the sql/ directory

SELECT `color` FROM `objects` ORDER BY `color` DESC;

PHP file running the PDO MySQL query:

$db = new PDO("mysql:host=127.0.0.1;dbname=test;charset=utf8mb4", 'root', ''); $select = $db->query(file_get_contents('sql/fetch_all_colors.sql')); while ($row = $select->fetch(PDO::FETCH_ASSOC)) < echo $row['color'].'
'; >

This loads the fetch_all_colors.sql and executes it.

Prevent index and viewing of the SQL files

By using .htaccess and deny from all on SQL only files this prevents the viewing and indexing for the SQL files.

 Order allow,deny Deny from all 

Better use case:

The example uses a small SQL query were putting it inline would make perfect sense. Loading the SQL query from a file would be more beneficial for large join queries like this query taken from here:

SELECT country.country_name_eng, SUM(CASE WHEN call.id IS NOT NULL THEN 1 ELSE 0 END) AS calls, AVG(ISNULL(DATEDIFF(SECOND, call.start_time, call.end_time),0)) AS avg_difference FROM country LEFT JOIN city ON city.country_id = country.id LEFT JOIN customer ON city.id = customer.city_id LEFT JOIN call ON call.customer_id = customer.id GROUP BY country.id, country.country_name_eng HAVING AVG(ISNULL(DATEDIFF(SECOND, call.start_time, call.end_time),0)) > (SELECT AVG(DATEDIFF(SECOND, call.start_time, call.end_time)) FROM call) ORDER BY calls DESC, country.id ASC;

Источник

Читайте также:  Сохранение базы данных java
Оцените статью