Çalışmıyor PHP exec kullanarak MySQL exe çağırıyor

5 Cevap php

I mysql komutu çağırarak, PHP exec ile son derece basit bir komut dosyası var:

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

Ben yukarıdaki script kullanıcı kimlik bilgileri geçmek ve anında job_create.sql çalıştırmak, mysql komutu çağırır beklenebilir.

Tek şey job_create.sq Ben düzgün çalıştırmak olmadığını anlamda çalışmıyor olmasıdır. . Ben, aşağıda script kullanarak doğrudan komut satırından mysql komutu aramaya çalıştı

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

ve çalışır.

Bu nasıl düzeltmek için herhangi bir fikir?

Edit: I call this script from PHP command line. i.e., PHP.exe installdb.php

5 Cevap

I found the solution, beyler.

Sorun, açıkça $cmd "" de. Yani kapalı kalıyorsunuz

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

Bu işler tam kodu:

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

?>

Script çalışır, ama kesinlikle yerine bir-e bayrağı ve 'kaynak' komutunu kullanarak denemelisiniz < iyi uygulama meselesi olarak simsiyah.

Şansını script olduğundan daha farklı bir kullanıcı olarak çalışan ve komutu çalıştırmak için komut satırı izni yok, vardır. Kullanıcı izinlerini denetleyin.

Bu bile Ubuntu bana çok oluyordu. Sorun i aşağıdaki kodu yapıyor olmasıydı:

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

Sadece hafif bir ayrıntı shell_exec trailling karakterleri ile çıktıyı döndürür ... eksikti. Komutu yürütürken i başlamıştı bir MySQL error 127 (Record is crashed).

Çözüm basit oldu: trim function shell_exec eklemek :)

$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 ve mypass arasında boşluk olmamalıdır.

BTW Ben formunu kullanmanızı öneririz --password=mypass

Burada sorun muhtemelen olduğunu

mysql < file.sql

Kabuk ile kolaylaştırılır bir boru işlemi bağlıdır. Php doğrudan bir kabuk ile exec * gibi bir şey () API çağrılarının aile ziyade kullanarak komut yürütür bu iş olmaz. Ben kabuk aslında linux kullanılan olduğunu biliyorum, ama bu windows durum olmayabilir. Manuel komut yürütülür tam olarak nasıl belirtmiyor.

Yerine-e bayrağı ve kaynak komutunu kullanarak deneyin:

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

Bu ne olursa olsun komut çağrılır şekilde çalışması gerekir.