0

非推奨の警告が表示されるため、このページにあるデータベース バックアップ スクリプトを移植しようとしています。mysql_...

これまでの私の取り組みは以下のとおりですが、スクリプトは解決方法がわからないいくつかのエラーを投げかけています。私は PHP に少し慣れているだけなので、ここで初歩的なミスを犯している可能性は十分にあります。

スローされるエラーは次のとおりです。

Notice: Undefined variable: db in ......../index.php on line 109 Fatal error: Call to a member function query() on a non-object in ......../index.php on line 109

109行目は次のとおりです( // * ** * ** *でマークされています):

foreach( $db->query('SHOW TABLES') as $row )

public/ protected(for initializeDatabase) とglobal(for ) キーワードをいじっていますが$db、それが原因なのか、それとも間違っているのかわかりません。

ここで私が間違っていることを誰でも簡単に見つけることができますか?


<?php
/**
 * This file contains the Backup_Database class wich performs
 * a partial or complete backup of any given MySQL database
 * @author Daniel López Azaña <http://www.daniloaz.com>
 * @version 1.0
 */

/**
 * Changes by jippie:
 * ereg_replace("\n","\\n",$row[$j]); => preg_replace( '/\n/ , "\\n" , $row[$j] );
 * mysql_... => PDO
 */

// Report all errors
error_reporting(E_ALL);

/**
 * Define database parameters here
 */
define("DB_USER", 'username');
define("DB_PASSWORD", 'password');
define("DB_NAME", 'database');
define("DB_HOST", 'localhost');
define("OUTPUT_DIR", 'cache');
define("TABLES", '*');

/**
 * Instantiate Backup_Database and perform backup
 */
$backupDatabase = new Backup_Database(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$status = $backupDatabase->backupTables(TABLES, OUTPUT_DIR) ? 'OK' : 'KO';
echo "<br /><br /><br />Backup result: ".$status;

/**
 * The Backup_Database class
 */
class Backup_Database {
    /**
     * Host where database is located
     */
    var $host = '';

    /**
     * Username used to connect to database
     */
    var $username = '';

    /**
     * Password used to connect to database
     */
    var $passwd = '';

    /**
     * Database to backup
     */
    var $dbName = '';

    /**
     * Database charset
     */
    var $charset = '';

    /**
     * Constructor initializes database
     */
    function Backup_Database($host, $username, $passwd, $dbName, $charset = 'utf8')
    {
        $this->host     = $host;
        $this->username = $username;
        $this->passwd   = $passwd;
        $this->dbName   = $dbName;
        $this->charset  = $charset;

        $this->initializeDatabase();
    }

    protected function initializeDatabase()
    {
        $db = new PDO("mysql:host=$this->host;dbname=$this->dbName;charset=$this->charset", $this->username, $this->passwd );
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
/* JPH: mysql_... is deprecated
 *       $conn = mysql_connect($this->host, $this->username, $this->passwd);
 *       mysql_select_db($this->dbName, $conn);
 *       if (! mysql_set_charset ($this->charset, $conn))
 *       {
 *           mysql_query('SET NAMES '.$this->charset);
 *       }
 */
    }

    /**
     * Backup the whole database or just some tables
     * Use '*' for whole database or 'table1 table2 table3...'
     * @param string $tables
     */
    public function backupTables($tables = '*', $outputDir = '.')
    {
        try
        {
            /**
            * Tables to export
            */
            if($tables == '*')
            {
                $tables = array();
                // $result = mysql_query('SHOW TABLES');
                // while($row = mysql_fetch_row($result))
// *******
                foreach( $db->query('SHOW TABLES') as $row )
                {
                    $tables[] = $row[0];
                }
            }
            else
            {
                $tables = is_array($tables) ? $tables : explode(',',$tables);
            }

            $sql = 'CREATE DATABASE IF NOT EXISTS '.$this->dbName.";\n\n";
            $sql .= 'USE '.$this->dbName.";\n\n";

            /**
            * Iterate tables
            */
            foreach($tables as $table)
            {
                echo "Backing up ".$table." table...";

                // $result = mysql_query('SELECT * FROM '.$table);
                // $numFields = mysql_num_fields($result);
                $result = $db->query( 'SELECT * FROM ' . $table );
                $numFields = $result->columnCount();

                $sql .= 'DROP TABLE IF EXISTS '.$table.';';
                // $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
                $result2 = $db->query( 'SHOW CREATE TABLE ' . $table );
                $row2 = $result2->fetch();

                $sql.= "\n\n".$row2[1].";\n\n";

                for ($i = 0; $i < $numFields; $i++)
                {
                    // while($row = mysql_fetch_row($result))
                    while( $row = $result2->fetch() )
                    {
                        $sql .= 'INSERT INTO '.$table.' VALUES(';
                        for($j=0; $j<$numFields; $j++)
                        {
                            $row[$j] = addslashes($row[$j]);
                            $row[$j] = preg_replace( '/\n/' , "\\n" , $row[$j] );
                            if (isset($row[$j]))
                            {
                                $sql .= '"'.$row[$j].'"' ;
                            }
                            else
                            {
                                $sql.= '""';
                            }

                            if ($j < ($numFields-1))
                            {
                                $sql .= ',';
                            }
                        }

                        $sql.= ");\n";
                    }
                }

                $sql.="\n\n\n";

                echo " OK" . "<br />";
            }
        }
        catch (Exception $e)
        {
            var_dump($e->getMessage());
            return false;
        }

        return $this->saveFile($sql, $outputDir);
    }

    /**
     * Save SQL to file
     * @param string $sql
     */
    protected function saveFile(&$sql, $outputDir = '.')
    {
        if (!$sql) return false;

        try
        {
            $handle = fopen($outputDir.'/db-backup-'.$this->dbName.'-'.date("Ymd-His", time()).'.sql','w+');
            fwrite($handle, $sql);
            fclose($handle);
        }
        catch (Exception $e)
        {
            var_dump($e->getMessage());
            return false;
        }

        return true;
    }
}
4

3 に答える 3

1

$db 変数はメソッド initializeDatabase() でローカルであり、このメソッドでのみ使用できます。

プライベート属性 $db を持ち、クラス全体で $db の代わりに $this->db を呼び出すことができます。

于 2013-08-11T09:47:29.600 に答える
1

グローバルとして $db する必要があります。詳細な説明があるこのリンクを確認してください: http://php.net/manual/en/language.variables.scope.php

于 2013-08-11T09:50:44.927 に答える
1

プロパティを追加

/**
 * Connection variable
 */

 var $db = ''

$db すべてをに置き換えます$this->db

例 :

$db = new PDO("mysql:host=$this->host;dbname=$this->dbName;charset=$this->charset", $this->username, $this->passwd );

$this->db = new PDO("mysql:host=$this->host;dbname=$this->dbName;charset=$this->charset", $this->username, $this->passwd );
于 2013-08-11T09:51:46.720 に答える