使用PHP exec调用MySQL exe不起作用

时间:2009-05-02 10:10:54

标签: php mysql

我有一个非常简单的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

6 个答案:

答案 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)

-pmypass之间不应有空格。

BTW我建议您使用--password=mypass

表格

答案 5 :(得分:0)

使用proc_open()而不是exec()来尝试 proc_open允许您显示命令行工具提供的错误。