我有一个简单的脚本:
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$db = 'BPOJob';
$file =dirname(__FILE__).'\\'.'job_create.sql';
$mySQLDir='"C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql.exe"';
$cmd = $mySQLDir.' -h '.$dbhost.' --user='.$dbuser.' --password='.$dbpass.' < "'.$file.'"';
exec($cmd,$out,$retval);
echo "\n";
echo ($retval);
?>
问题是,当我在 PHP.exe 中运行上述命令时,它不起作用;我从 exec 获得了 1 作为返回值。
但如果我通过调用直接运行命令行
mysql.exe -h localhost --user=admin --password=password < job_create.sql
然后.sql文件就可以运行了。
我是否遗漏了什么?
编辑:抱歉!信息错误。我已编辑该问题,但仍然有效。
答案1
嗯,你不应该执行 $cmd 而不是 $mySQLDir 吗?
编辑:尝试回显 $cmd 也许您可能会看到错误。
答案2
命令行中的空格可能被视为分隔符,因此它实际上是尝试运行:
c:\program
带有参数:
files ...
尝试将传递给的整个可执行路径括在双引号中exec()
,以便 Windows Shell 知道它应该是一个单词。
答案3
我找到了解决方案:您需要明确地将其括$cmd
在引号中:
exec('"'.$cmd.'"',$out ,$retval);
这是完整的脚本,供您参考:
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$db = 'BPOJob';
$file =dirname(__FILE__).'\\'.'job_create.sql';
$mySQLDir='"C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql.exe"';
$cmd = $mySQLDir.' -h '.$dbhost.' --user='.$dbuser.' --password='.$dbpass.' < "'.$file.'"';
exec('"'.$cmd.'"',$out,$retval);
echo "\n";
echo ($retval);
?>