2013-01-23 52 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成为数组。你只需要传递变量,你就会得到一个数组。