Вызов MySQL exe с использованием PHP exec не работает
У меня очень простой скрипт с PHP exec
звонит mysql
команда:
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'mypass';
$db = 'job';
$file ='job_create.sql';
$mySQLDir='"C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql"';
if ($dbpass != '') {
$cmd = $mySQLDir.' -h '.$dbhost.' --user='.$dbuser.' --password='.$dbpass.' < "'.dirname(__FILE__).'\\'.$file.'"';
} else {
$cmd = $mySQLDir.' -h '.$dbhost.' --user='.$dbuser.' < "'.dirname(__FILE__).'\\'.$file.'"';
}
// echo $cmd;
exec($cmd,$out,$retval);
Я ожидаю, что приведенный выше скрипт вызывает mysql
введите информацию аутентификации пользователя и запустите job_create.sql
на лету.
Единственное, что это не работает, в том смысле, что job_create.sq
Я не работает должным образом., Я пытался позвонить mysql
Команда непосредственно из командной строки с использованием приведенного ниже сценария,
bin\mysql.exe -h localhost --user=root --password=mypass < "job_create.sql"
и это работает.
Есть идеи, как это исправить?
Редактировать: я вызываю этот скрипт из командной строки PHP. то есть PHP.exe installdb.php
6 ответов
Я нашел решение
Проблема в том, что вам нужно явно приложить $cmd
в "".ie,
exec('"'.$cmd.'"',$out ,$retval);
Это полный код, который работает:
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$db = 'job';
$file =dirname(__FILE__).'\\'.'job_create.sql';
$mySQLDir='"C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe"';
if ($dbpass != '') {
$cmd = $mySQLDir.' -h '.$dbhost.' --user='.$dbuser.' --password='.$dbpass.' < "'.$file.'"';
} else {
$cmd = $mySQLDir.' -h '.$dbhost.' --user='.$dbuser.' < "'.$file.'"';
}
echo $cmd;
exec('"'.$cmd.'"',$out ,$retval);
echo "\n";
echo ($retval);
?>
Проблема здесь, вероятно, в том, что
mysql < file.sql
зависит от операции на трубе, которая облегчается оболочкой. Если php выполняет команду напрямую, используя что-то вроде семейства api-вызовов exec*(), а не через оболочку, это не сработает. Я знаю, что оболочка на самом деле используется в Linux, но это может быть не так в Windows. В руководстве не указано, как именно выполняется команда.
Попробуйте вместо этого использовать флаг -e и команду источника:
bin\mysql.exe -h localhost --user=root --password=mypass -e 'source job_create.sql'
Это должно работать независимо от способа вызова команды.
Ваш сценарий должен работать, но обязательно попробуйте использовать флаг -e и команду 'source' вместо Скорее всего, скрипт запускается от имени другого пользователя и не имеет разрешения командной строки для запуска вашей команды. Проверьте разрешения пользователя.
Это происходило со мной тоже, даже в Ubuntu. Проблема заключалась в том, что я делал следующий код:
$mysql = shell_exec("sudo which mysql");
$cmd = "$mysql --host=$host --user=$user --password=$pass -D $dbname -e 'source $base_sql_file'";
exec($cmd, $output, $retvar);
Отсутствовала лишь небольшая деталь... shell_exec возвращает вывод с последующими символами. При выполнении команды я получаю MySQL error 127 (Record is crashed)
,
Решение было простым: добавить trim function
в shell_exec
:)
$mysql = trim(shell_exec("sudo which mysql"));
$cmd = "$mysql --host=$host --user=$user --password=$pass -D $dbname -e 'source $base_sql_file'";
exec($cmd, $output, $retvar);
Не должно быть места между -p
а также mypass
,
Кстати, я предлагаю вам использовать форму --password=mypass
Попробуйте использовать proc_open() вместо exec ().
proc_open позволяет отображать ошибки, которые выдает инструмент командной строки.