【问题标题】:Calling MySQL exe using PHP exec doesn't work使用 PHP exec 调用 MySQL exe 不起作用
【发布时间】:2009-05-02 10:10:53
【问题描述】:

我有一个非常简单的 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.sql 没有正常运行。 .我尝试使用以下脚本直接从命令行调用mysql 命令,

bin\mysql.exe -h localhost --user=root --password=mypass < "job_create.sql"

它有效。

知道如何解决这个问题吗?

编辑:我从 PHP 命令行调用这个脚本。即 PHP.exe installdb.php

【问题讨论】:

  • 为什么不使用 mysql-bindings 而不是通过 shell 调用?

标签: php mysql


【解决方案1】:

我找到了解决办法

问题是您需要将$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);

?>

【讨论】:

    【解决方案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'
    

    无论调用命令的方式如何,这都应该有效。

    【讨论】:

      【解决方案3】:

      您的脚本应该可以工作,但作为最佳实践,请务必尝试使用 -e 标志和 'source' 命令而不是

      很可能,脚本以与您不同的用户身份运行,并且没有命令行权限来运行您的命令。检查用户权限。

      【讨论】:

        【解决方案4】:

        即使在 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);
        

        【讨论】:

          【解决方案5】:

          -pmypass 之间不应有空格。

          顺便说一句,我建议您使用--password=mypass 的形式

          【讨论】:

          • 您好,我尝试了您的建议。直接调用 MySQL 是有效的,但是使用 exec 从 PHP 调用仍然不起作用
          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2016-04-17
            • 2016-08-11
            • 2015-10-20
            • 2013-01-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-23
            相关资源
            最近更新 更多