1

私はOOPが初めてなので、チュートリアルに従っています。そのため、次のコードを使用してデータベースに接続しますが、私の場合は接続していません

データベース.php

<?php
require_once("config.php");

class MySQLDatabase {

    private $connection;

  function __construct() {
    $this->open_connection();
  }

    public function open_connection() {
        $this->connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS);
        if (!$this->connection) {
            die("Database connection failed: " . mysql_error());
        } else {
            $db_select = mysql_select_db(DB_NAME, $this->connection);
            if (!$db_select) {
                die("Database selection failed: " . mysql_error());
            }
        }
    }

    public function close_connection() {
        if(isset($this->connection)) {
            mysql_close($this->connection);
            unset($this->connection);
        }
    }

    public function query($sql) {
        $result = mysql_query($sql, $this->connection);
        $this->confirm_query($result);
        return $result;
    }

    public function mysql_prep( $value ) {
        $magic_quotes_active = get_magic_quotes_gpc();
        $new_enough_php = function_exists( "mysql_real_escape_string" ); // i.e. PHP >= v4.3.0
        if( $new_enough_php ) { // PHP v4.3.0 or higher
            // undo any magic quote effects so mysql_real_escape_string can do the work
            if( $magic_quotes_active ) { $value = stripslashes( $value ); }
            $value = mysql_real_escape_string( $value );
        } else { // before PHP v4.3.0
            // if magic quotes aren't already on then add slashes manually
            if( !$magic_quotes_active ) { $value = addslashes( $value ); }
            // if magic quotes are active, then the slashes already exist
        }
        return $value;
    }

    private function confirm_query($result) {
        if (!$result) {
            die("Database query failed: " . mysql_error());
        }
    }

}

$database =& new MySQLDatabase();
$db =& $database;

?>

config.php

<?php

// Database Constants                             
defined('DB_SERVER') ? null : define("DB_SERVER", "localhost");
defined('DB_USER')   ? null : define("DB_USER", "oop_project");
defined('DB_PASS')   ? null : define("DB_PASS", "");
defined('DB_NAME')   ? null : define("DB_NAME", "oop_project");

?>

関数.php

<?php

function strip_zeros_from_date( $marked_string="" ) {
  // first remove the marked zeros
  $no_zeros = str_replace('*0', '', $marked_string);
  // then remove any remaining marks
  $cleaned_string = str_replace('*', '', $no_zeros);
  return $cleaned_string;
}

function redirect_to( $location = NULL ) {
  if ($location != NULL) {
    header("Location: {$location}");
    exit;
  }
}

function output_message($message="") {
  if (!empty($message)) { 
    return "<p class=\"message\">{$message}</p>";
  } else {
    return "";
  }
}

?>

接続をテストしようとすると、これらのエラーが発生しました。

Deprecated: Assigning the return value of new by reference is deprecated in J:\xampp\htdocs\oop_project\includes\database.php on line 60

Deprecated: Assigning the return value of new by reference is deprecated in J:\xampp\php\PEAR\Config.php on line 80

Deprecated: Assigning the return value of new by reference is deprecated in J:\xampp\php\PEAR\Config.php on line 166

Notice: Use of undefined constant DB_SERVER - assumed 'DB_SERVER' in J:\xampp\htdocs\oop_project\includes\database.php on line 13

Notice: Use of undefined constant DB_USER - assumed 'DB_USER' in J:\xampp\htdocs\oop_project\includes\database.php on line 13

Notice: Use of undefined constant DB_PASS - assumed 'DB_PASS' in J:\xampp\htdocs\oop_project\includes\database.php on line 13

Warning: mysql_connect() [function.mysql-connect]: php_network_getaddresses: getaddrinfo failed: No such host is known. in J:\xampp\htdocs\oop_project\includes\database.php on line 13

Warning: mysql_connect() [function.mysql-connect]: [2002] php_network_getaddresses: getaddrinfo failed: No such host is known. (trying to connect via tcp://DB_SERVER:3306) in J:\xampp\htdocs\oop_project\includes\database.php on line 13

Warning: mysql_connect() [function.mysql-connect]: php_network_getaddresses: getaddrinfo failed: No such host is known. in J:\xampp\htdocs\oop_project\includes\database.php on line 13
Database connection failed: php_network_getaddresses: getaddrinfo failed: No such host is known.

どうすればこれを修正できますか...? ありがとうございました。

4

4 に答える 4

3

「非推奨」の警告は、使用しているためです

$database =& new MySQLDatabase();

と置換する

$database = new MySQLDatabase();

通知は、クラス (新しい MySQLDatabase) を試行してインスタンス化する前に、定数 (DB_SERVER など) が定義されていないように見えるためです。config.php が事前にロードされていることを確認してください。他の警告は、同じ問題に関連しています。config.php のインクルードには、ローカルの構成ファイルではなく、実際には J:\xampp\php\PEAR\Config.php が含まれています。

于 2012-08-18T02:44:05.297 に答える
2

DB_SERVER、DB_USER、DB_PASS 変数またはサーバーに何か問題があるようです。非推奨の oop クラスを使用せずに、この例を試すことに間違いなく時間を費やす必要があります。

ただし、最初に $database =& new MySQLDatabase(); を変更してみてください。よりクリーンに $database = new MySQLDatabase();

于 2012-08-18T02:44:10.393 に答える
1

PDO に移行したい場合は、達成しようとしていると思われる簡単な例を次に示します。CreateReadUpdateDelete ( CRUD) クラス。

<?php 
class MySQLDatabase{
    public $db;
    function __construct($dsn, $user=null, $pass=null){
        $this->dsn = $dsn;
        $this->user = $user;
        $this->pass = $pass;
        //Connect
        $this->connect();
    }

    function connect(){
        try{
            $this->db = new PDO($this->dsn, $this->user, $this->pass);
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
            $this->db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
        }catch (Exception $e){
            die('Cannot connect to databse. Details:'.$e->getMessage());
        }
    }

    function Select($table, $fieldname=null, $fieldvalue=null){
        $sql = "SELECT * FROM $table"; 
        $sql .=($fieldname != null && $fieldvalue != null)?" WHERE $fieldname=:id":null;
        $statement = $this->db->prepare($sql);
        if($fieldname != null && $fieldvalue != null){$statement->bindParam(':id', $fieldvalue);}
        $statement->execute();
        return $statement->fetchAll(PDO::FETCH_ASSOC);
    }

    function Insert($table, $values){
        $fieldnames = array_keys($values[0]);

        $sql = "INSERT INTO $table";
        $fields = '( ' . implode(' ,', $fieldnames) . ' )';
        $bound = '(:' . implode(', :', $fieldnames) . ' )';
        $sql .= $fields.' VALUES '.$bound;

        $statement = $this->db->prepare($sql);
        foreach($values as $vals){
            $statement->execute($vals);
        }
    }

    function Update($table, $fieldname, $value, $where_key, $id){
        $sql = "UPDATE `$table` SET `$fieldname`= :value WHERE `$where_key` = :id";
        $statement = $this->db->prepare($sql);
        $statement->bindParam(':id', $id);
        $statement->bindParam(':value', $value);
        $statement->execute();
    }

    function Delete($table, $fieldname=null, $id=null){
        $sql = "DELETE FROM `$table`";
        $sql .=($fieldname != null && $id != null)?" WHERE $fieldname=:id":null;
        $statement = $this->db->prepare($sql);
        if($fieldname != null && $id != null){$statement->bindParam(':id', $id);}
        $statement->execute();
    }

}


//Sample Usage
$db = new MySQLDatabase('mysql:host=localhost;dbname=test','root','password');


//Multi insert:
$insert = array(array('some_col'=>'This was inserted by the $db->Insert() method'),
                array('some_col'=>'Test insert 2'),
                array('some_col'=>'Test insert 3'),
                );
$db->Insert('pdo_test', $insert);

//Select All
$result = $db->Select('pdo_test');
/*
Array
(
    [0] => Array
        (
            [id] => 2
            [some_col] => This was inserted by the $db->Insert() method
        )

    [1] => Array
        (
            [id] => 3
            [some_col] => Test insert 2
        )

    [2] => Array
        (
            [id] => 4
            [some_col] => Test insert 3
        )
)
*/

//Single select
$result = $db->Select('pdo_test','id','2');
/*
Array
(
    [0] => Array
        (
            [id] => 2
            [some_col] => This was inserted by the $db->Insert() method
        )

)
*/

/* Delete Single record*/
$db->Delete('pdo_test', 'id', '2');

/*Delete All*/
$db->Delete('pdo_test');

//Array ( ) 
$result = $db->Select('pdo_test');
?>
于 2012-08-18T03:32:19.060 に答える