Я запускаю MySql + PHP внутри IIS и Windows 7. Это PHP-код, который я использую, чтобы попытаться создать новую базу данных somedb:
$cmd = escapeshellcmd('mysql -u root -p myPasswd -h localhost -Bse "create database somedb;" ');
$test = shell_exec("C:\\Program^ Files^ ^(x86)\\MySQL\\MySQL^ Server^ 5.6\\bin\\".$cmd);
var_dump($test);
echo "<br>============<br>";
print_r($test);
Я ставил var_dump и print_r только для проверки вывода. После запуска кода у меня есть этот вывод:
string 'C:\Program Ver 14.14 Distrib 5.6.23, for Win32 (x86)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Usage: C:\Program [OPTIONS] [database]
-?, --help Display this help and exit.
-I, --help Synonym for -?
--auto-rehash Enable automatic rehashing. One doesn't need to use
'rehash' to get table'... (length=12085)
=========================================================================================
C:\Program Ver 14.14 Distrib 5.6.23, for Win32 (x86) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Usage: C:\Program [OPTIONS] [database] -?, --help Display this help and exit. -I, --help Synonym for -? --auto-rehash Enable automatic rehashing. One doesn't need to use 'rehash' to get table and field completion, but startup and reconnecting may take a longer time. Disable with --disable-auto-rehash. (Defaults to on; use --skip-auto-rehash to disable.) -A, --no-auto-rehash No automatic rehashing. One has to use 'rehash' to get table and field completion. This gives a quicker start of mysql and disables rehashing on reconnect. --auto-vertical-output Automatically switch to vertical output mode if the result is wider than the terminal width. -B, --batch Don't use history file. Disable interactive behavior. (Enables --silent.) --bind-address=name IP address to bind to...
Поэтому кажется, что shell_exec может вызывать mysql внутри директивы bin, но не создает базу данных. Это не проблема разрешения. Я попытался создать с использованием sql-инструкции внутри командной строки, и он работает хорошо. Я уже пытался создать без -h localhost или изменить -Bse для -e или - -e xecute. Я пробовал все предложения этого сообщения Создать базу данных в Shell Script - конвертировать из PHP, но он не работает для меня. Что мне не хватает?
================================================== =========================
Только для обновления, это код, который работает хорошо, если я запускаю Apache + win7:
echo shell_exec("C:\\xampp\\mysql\\bin\\mysql -u root -e \"CREATE DATABASE IF NOT EXISTS somedb\" ");
Он создает базу данных и ничего не отображает в браузере. Примечание: независимо от пространства между -u и корнем.
Хорошо, я нашел решение:
Перейдите в php-код и удалите путь к mysql. Новый shell_exec должен выглядеть следующим образом:
echo shell_exec ("mysql -umYusername -p mYpassword -e \" CREATE DATABASE, ЕСЛИ НЕ СУЩЕСТВУЕТ somedb\"");
Примечание. AsConfused был полностью установлен. Мы должны избегать пустого пространства между -u и -p
Запустите код. База данных должна быть создана!
Поставьте пробелы после -u и -p для стартеров. Я знаю, что это выглядит странно, но у mysql есть аневризма, если нет.
Также, если вы в php, почему вы это делаете? Просто стреляйте из команды mysql из php и без оболочки. Если для активного соединения у вас отсутствуют учетные данные, используйте новый объект подключения с соответствующими учетными данными, сделайте это, а затем закройте это соединение.
Это приводит меня к смущающему, но необходимому вопросу о том, когда U shell, в какой коробке работает эта оболочка, клиентская машина, которая не является сервером?