MySQL备份代码未定义变量:return

时间:2015-05-18 20:03:41

标签: php mysql

我试图做一个我按下按钮时调用的MySQL *备份代码,但问题是,当我要关闭我用来编写数据库的文件时,会发生这种情况跟随错误。

  

注意:未定义的变量:在C:\

中返回

这是我的代码:

     <? php

    backup_tables('localhost', 'root', '123456', 'students');


/* backup the db OR just a table */
function backup_tables($host,$user,$pass,$name,$tables = '*')
{

$link = mysql_connect($host,$user,$pass);
mysql_select_db($name,$link);

//get all of the tables
if($tables == '*')
{
    $tables = array();
    $result = mysql_query('SHOW TABLES');
    while($row = mysql_fetch_row($result))
    {
        $tables[] = $row[0];
    }
}
else
{
    $tables = is_array($tables) ? $tables : explode(',',$tables);
}
$return = ""; 
//cycle through
foreach($tables as $table)
{
    $result = mysql_query('SELECT * FROM '.$table);
    $num_fields = mysql_num_fields($result);

    $return.= 'DROP TABLE '.$table.';';
    $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
    $return.= "\n\n".$row2[1].";\n\n";

    for ($i = 0; $i < $num_fields; $i++) 
    {
        while($row = mysql_fetch_row($result))
        {
            $return.= 'INSERT INTO '.$table.' VALUES(';
            for($j=0; $j<$num_fields; $j++) 
            {
                $row[$j] = addslashes($row[$j]);
                $row[$j] = ereg_replace("\n","\\n",$row[$j]);
                if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
                if ($j<($num_fields-1)) { $return.= ','; }
            }
            $return.= ");\n";
        }
    }
    $return.="\n\n\n";
}

//save file
$handle = fopen('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+');
fwrite($handle,$return);
fclose($handle);
}

    ?>

如果你们中的任何人能够帮助我理解这个问题或帮助我解决另一个问题,我将非常感激。

2 个答案:

答案 0 :(得分:1)

您对if的第一次引用是试图附加到它。首先初始化它。在功能的顶部执行此操作。

$return

不推荐使用$return = ""; 接口。请改用 mysqli PDO

您是否知道MySQL提供了名为mysql的实用程序?

对于设计,这将尝试在将内容写入文件之前在内存中创建整个脚本。这适用于少量表和少量行。但对于真正的大桌子来说,这在内存方面会很昂贵。您可能需要考虑打开文件,然后将备份片段写入文件,而不是尝试在内存中构建整个文件。

<强>后续

你在这里遇到了严重的问题:

mysqldump

for ($i = 0; $i < $num_fields; $i++) { while ($row = mysql_fetch_row($result)) { for ($j = 0; $j < $num_fields; $j++) { 循环在获取循环之外没有意义。您希望遍历返回的每一行,并且在每一行上,您希望遍历该行上的列。

答案 1 :(得分:0)

您正尝试将字符串追加到变量$return,此时尚未声明:

$return. = 'DROP TABLE '.$table.

在循环开始之前简单地声明它:

$return = "";   

foreach($tables as $table) {
    \\ ...     

    $return. = 'DROP TABLE '.$table.;

    \\ ...     
}