Вызов MySQL exe с использованием PHP exec не работает

У меня очень простой скрипт с 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 Я не работает должным образом., Я пытался позвонить mysql Команда непосредственно из командной строки с использованием приведенного ниже сценария,

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

и это работает.

Есть идеи, как это исправить?

Редактировать: я вызываю этот скрипт из командной строки PHP. то есть PHP.exe installdb.php

6 ответов

Решение

Я нашел решение

Проблема в том, что вам нужно явно приложить $cmd в "".ie,

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

?>

Проблема здесь, вероятно, в том, что

mysql < file.sql

зависит от операции на трубе, которая облегчается оболочкой. Если php выполняет команду напрямую, используя что-то вроде семейства api-вызовов exec*(), а не через оболочку, это не сработает. Я знаю, что оболочка на самом деле используется в Linux, но это может быть не так в Windows. В руководстве не указано, как именно выполняется команда.

Попробуйте вместо этого использовать флаг -e и команду источника:

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

Это должно работать независимо от способа вызова команды.

Ваш сценарий должен работать, но обязательно попробуйте использовать флаг -e и команду 'source' вместо

Скорее всего, скрипт запускается от имени другого пользователя и не имеет разрешения командной строки для запуска вашей команды. Проверьте разрешения пользователя.

Это происходило со мной тоже, даже в 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);

Не должно быть места между -p а также mypass,

Кстати, я предлагаю вам использовать форму --password=mypass

Попробуйте использовать proc_open() вместо exec ().
proc_open позволяет отображать ошибки, которые выдает инструмент командной строки.

Другие вопросы по тегам