Вызов MySQL exe с использованием PHP exec не работает - PullRequest
2 голосов
/ 02 мая 2009

У меня очень простой скрипт с 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 ]

4 голосов
/ 02 мая 2009

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

Проблема заключается в том, что вам нужно явно заключить $cmd в "" .i.e.,

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 голосов
/ 12 февраля 2012

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

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

2 голосов
/ 02 мая 2009

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

mysql < file.sql

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

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

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

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

1 голос
/ 02 мая 2009

не должно быть пробела между -p и mypass.

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

0 голосов
/ 02 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...