我有一个非常简单的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
l运行不正常。 。我尝试使用以下脚本直接从命令行调用mysql
命令,
bin\mysql.exe -h localhost --user=root --password=mypass < "job_create.sql"
它有效。
知道如何解决这个问题吗?
编辑:我从PHP命令行调用此脚本。即,PHP.exe installdb.php
答案 0 :(得分:4)
我找到了解决方案
问题是你需要在{“。i.e。中明确地附上$cmd
,
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);
?>
答案 1 :(得分:2)
这里的问题可能是那个
mysql < file.sql
取决于shell所促成的管道操作。如果php直接使用类似exec *()系列的api调用而不是通过shell执行命令,这将无效。我知道shell实际上是在linux上使用的,但在Windows上可能不是这种情况。手册没有具体说明命令的执行方式。
请尝试使用-e标志和源命令:
bin\mysql.exe -h localhost --user=root --password=mypass -e 'source job_create.sql'
无论调用命令的方式如何,这都应该有效。
答案 2 :(得分:2)
你的脚本应该可以运行,但是一定要尝试使用-e标志和'source'命令而不是&lt; char是最佳实践的问题。
可能是,脚本以与您不同的用户身份运行,并且没有命令行权限来运行您的命令。检查用户权限。
答案 3 :(得分:2)
甚至在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返回带有trailling字符的输出。执行命令时,我得到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);
答案 4 :(得分:1)
-p
和mypass
之间不应有空格。
BTW我建议您使用--password=mypass
答案 5 :(得分:0)
使用proc_open()而不是exec()来尝试 proc_open允许您显示命令行工具提供的错误。