2013-01-23 79 views
-1
我使用

傳遞的PHP export script from 1 and 1Exec和唯一的變量應參考

<?php 
//ENTER THE RELEVANT INFO BELOW 
$mysqlDatabaseName ='db123456789'; 
$mysqlUserName ='dbo123456789'; 
$mysqlPassword ='myPassword'; 
$mysqlHostName ='db1234.perfora.net'; 
$mysqlExportPath ='chooseFilenameForBackup.sql'; 

//DONT EDIT BELOW THIS LINE 
//Export the database and output the status to the page 
$command='mysqldump --opt -h' .$mysqlHostName .' -u' .$mysqlUserName .' -p' .$mysqlPassword .' ' .$mysqlDatabaseName .' > ~/' .$mysqlExportPath; 
exec($command,$output=array(),$worked); 
switch($worked){ 
    case 0: 
     echo 'Database <b>' .$mysqlDatabaseName .'</b> successfully exported to <b>~/' .$mysqlExportPath .'</b>'; 
     break; 
    case 1: 
     echo 'There was a warning during the export of <b>' .$mysqlDatabaseName .'</b> to <b>~/' .$mysqlExportPath .'</b>'; 
     break; 
    case 2: 
     echo 'There was an error during export. Please check your values:<br/><br/><table><tr><td>MySQL Database Name:</td><td><b>' .$mysqlDatabaseName .'</b></td></tr><tr><td>MySQL User Name:</td><td><b>' .$mysqlUserName .'</b></td></tr><tr><td>MySQL Password:</td><td><b>NOTSHOWN</b></td></tr><tr><td>MySQL Host Name:</td><td><b>' .$mysqlHostName .'</b></td></tr></table>'; 
     break; 
} 
?> 

如果我執行它,我得到Strict Standards: Only variables should be passed by reference in並指向此行

exec($command,$output=array(),$worked); 

應該如何我適應腳本?

+1

http://php.net/exec < - 請重新閱讀如何使用該功能。 - http://php.net/language.references.pass – hakre

回答

3

調用exec之前,您應該定義$output:因爲PHP不喜歡被當場創建傳遞的值作爲參考(即使在這種情況下,這將是十分明顯的出現

$output = array(); 
exec($command, $output, $worked); 

錯誤更高級的編譯器如何不應該成爲一個問題)。

+0

原因是'$ output = array()'是一個**表達式**,在分配給它後解析爲'$ output'的值到'array()'。這是來自1and1的一些不好的代碼,分配array()甚至沒有意義。 –

+0

@fab:實際上它不能解析爲'$ output'的值(否則它可以引用它並且一切都會正常),它會解析爲'array()',那就是問題所在。在對象上使用__get()來嘗試使用動態屬性進行鏈分配以查看差異。 PHP中的賦值不像在例如C++。 – Jon

+0

兩者都是正確的。 $ output **的**值**在*賦值後是**'array()'*。不,PHP不能引用它,因爲它不是ZVal容器,只是一個普通的值。 –

1

不要函數調用內部分配,只是把它想:

exec($command, $output, $worked); 

的$輸出無功不必由第一方式初始化。

1

正如我在上面的評論中強調的那樣,這只是你犯的一個小錯誤,這很容易糾正。

一般而言,您只能通過引用傳遞變量,但是您傳遞了這樣一個表達式pass-by-reference function parameter

傳遞變量而不是提供表達式將解決您的問題,並且警告將消失。

例如使用的

$output    # variable 

代替

$output = array() # expression 

爲第二個參數。


有趣的事實:變量類型,例如返回通過引用參數返回 - 不輸入 - 類型。這意味着,在傳遞變量之前,您不需要使$output成爲數組。你只需要傳遞變量,你就會得到一個數組。