Calling MySQL exe using PHP exec doesn't work

后端 未结 6 1090
一整个雨季
一整个雨季 2020-12-20 02:52

I have an extremely simple script with PHP exec, calling mysql command:

  $dbhost = \'localhost\';
  $dbuser = \'root\';
  $dbpass          


        
相关标签:
6条回答
  • 2020-12-20 03:13

    This was happening to me too even on Ubuntu. The problem was that i was doing the following code:

    $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);
    

    Only a slight detail was missing... the shell_exec returns the output with trailling characters. When executing the command i was getting a MySQL error 127 (Record is crashed).

    The solution was simple: add a trim function to 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);
    
    0 讨论(0)
  • 2020-12-20 03:14

    Your script should work, but definitely try using the -e flag and the 'source' command instead of the < char as a matter of best practice.

    Chances are, the script is running as a different user than you are, and doesn't have command line permission to run your command. Check user permissions.

    0 讨论(0)
  • 2020-12-20 03:15

    Try it using proc_open() instead of exec().
    proc_open allows you to display the errors a commandline tool gives.

    0 讨论(0)
  • 2020-12-20 03:18

    there should be no space between -p and mypass.

    BTW I suggest you use the form --password=mypass

    0 讨论(0)
  • 2020-12-20 03:28

    I found the solution

    The problem is that you need to explicitly enclosed the $cmd in "".i.e.,

    exec('"'.$cmd.'"',$out ,$retval);
    

    This is the full code that works:

    <?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);
    
    ?>
    
    0 讨论(0)
  • 2020-12-20 03:30

    The problem here is probably that

    mysql < file.sql
    

    depends on a pipe operation that is facilitated by the shell. If php executes the command directly using something like the exec*() family of api calls rather than through a shell this won't work. I know that the shell actually is used on linux, but this might not be the case on windows. The manual doesn't specify exactly how the command is executed.

    Try using the -e flag and the source command instead:

    bin\mysql.exe -h localhost --user=root --password=mypass -e 'source job_create.sql'
    

    This should work regardless of the way that the command is invoked.

    0 讨论(0)
提交回复
热议问题