2009-05-02 41 views
2

我有PHP exec一個非常簡單的腳本調用MySQL的exe文件,調用mysql命令:使用PHP的exec不起作用

$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

+0

你爲什麼不使用mysql-綁定,而不是調用在外殼的? – troelskn 2009-05-02 20:34:16

回答

4

我找到了解決辦法

的問題是,你需要明確地包含在 「」 .IE的$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); 

?> 
1

-pmypass之間應該沒有空格。

順便說一句,我建議你使用表單--password=mypass

+0

你好,我試過你的建議。直接調用MySQL正在工作,但使用exec調用PHP仍然不起作用 – Graviton 2009-05-02 10:40:03

0

使用proc_open試用()而不是EXEC()。
proc_open允許您顯示命令行工具給出的錯誤。

2

這裏的問題是可能是

mysql < file.sql 

取決於由外殼推動管道操作。如果php直接使用類似exec *()系列的api調用而不是通過shell來執行命令,這將不起作用。我知道shell實際上是在linux上使用的,但在windows上可能不是這種情況。手冊沒有詳細說明命令的執行方式。

嘗試使用-e標誌和源命令:

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

這應該無論工作,該命令被調用的方式。

2

您的腳本應該可以正常工作,但絕對可以嘗試使用-e標誌和'source'命令而不是< char作爲最佳實踐。

很可能,腳本以不同的用戶身份運行,並且沒有命令行權限來運行您的命令。檢查用戶權限。

2

即使在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返回與trailling字符輸出。執行命令時,我得到一個MySQL error 127 (Record is crashed)

解決辦法很簡單:添加一個trim functionshell_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);