2015-04-24 3 views
0

Решение принято из комментария, поэтому я не могу принять ответ, чтобы это было закрыто. Но я опубликовал фактическое решение, которое работает для меня нижеПовторное использование соединения mysql в oop php

Я новичок в ООП, и я просто не могу понять, даже после прочтения нескольких примеров, как использовать одно и то же соединение mysql без использования $ GLOBALS.

Если кто-то может объяснить это, как будто я два года, это было бы очень полезно.

Это мой файл подключения.

$hostname = 'hostname'; 
$username = 'db'; 
$password = 'password'; 

try { 
$dbh = new PDO("mysql:host=$hostname;dbname=db", $username, $password); 
} 
catch(PDOException $e) 
    { 
    echo $e->getMessage(); 
} 

, но затем использовать это в классе или функции я это сделать:

class basic { 

function simple($id) { 

$query = $GLOBALS['dbh']->query("SELECT * FROM table WHERE id = $id"); 
$row = $query->fetch(PDO::FETCH_OBJ); 
$thing = $row->partoftable; 
echo $thing; 
} 
} 

$first = new basic(); 
$first->simple(12); 

Это, конечно, вернуть то, что я искал $ вещь с идентификатором 12. Но как мне это сделать без GLOBALS ['dbh'] для подключения к db?

Также не стесняйтесь разорвать все остальное, но просто имейте в виду, что это был самый простой пример того, что я говорю.

Заранее спасибо.

Это решение, которое работает для меня на основе приведенного ниже комментария.

class basic { 

function __construct($dbh) 
    { 
     $this->dbh = $dbh; 
    } 

function simple($id) { 

$query = $this->dbh->query("SELECT * FROM table WHERE id = $id"); 
$row = $query->fetch(PDO::FETCH_OBJ); 
$thing = $row->partoftable; 
echo $thing; 
} 
} 

$first = new basic($dbh); 
$first->simple(12); 

Thanks. надеюсь, это поможет кому-то другому.

+1

Основные сведения о '$ dbh', passit through' __constructor' подробнее [Dependecy Инъекция] (http://fabien.potencier.org/article/11/what-is-dependency-injection) – cske

+0

@cske Спасибо! это было так просто, что я просто не мог изначально обзавестись моим мозгом. Мне просто нужно передать его в $ first = new basic ($ dbh), а затем использовать __constructor, чтобы это произошло в классе. Просто пытайтесь быть более явным, если кто-то другой сталкивается с этой проблемой. Еще раз спасибо! – mikescorelle

ответ

2
class basic { 

var $CONNECTION; 

function __construct($dbh) { 
    $this->CONNECTION = $dbh; 
    } 

function simple($id) { 
$conn = $this->CONNECTION; 
$query = $conn->prepare("SELECT * FROM table WHERE id = $id"); 
$query->execute(); 
$row = $query->fetch(PDO::FETCH_OBJ); 
$thing = $row->partoftable; 
echo $thing; 
} 
} 

//class ends you can use thae class like this 

$hostname = 'hostname'; 
$username = 'db'; 
$password = 'password'; 

try { 
$dbh = new PDO("mysql:host=$hostname;dbname=db", $username, $password); 
} 
catch(PDOException $e) 
    { 
    echo $e->getMessage(); 
} 

$first = new basic($dbh); 
$first->simple(12); 
-1

Мне нравится это решение:

class db_connection 
{ 
    public static $sql_object = NULL; 

    public function __construct() 
    { 
     if ($sql_object === NULL) 
     { 
      // Initialize self::$sql_object 
     } 
    } 
} 

Затем вы можете использовать его с:

$db = new db_connection(); 
// Do something with $db->sql_object 

Поскольку $sql_object не статична, она будет инициализирован только один раз, независимо от того, сколько раз вы используете new db_connection().

+0

Наличие глобальной вещи 'db_connection' на самом деле не является ООП. – PeeHaa

+0

'$ db_connection' не является глобальным. Я полагаю, вы могли бы считать '$ sql_object' глобальным в том смысле, что он является статичным, но я не думаю, что использование статических членов нарушает ООП. – bytesized

0

Вы можете создать класс для подключения к базе данных:

class MysqlDB 
{ 
    private $conn; 
    public function __construct($hostName, $userName, $passWord, $databaseName) 
    { 
     $this->conn = new PDO("mysql:host=$hostName;dbname=$databaseName", $userName, $passWord); 
    } 

    public function query($id) 
    { 
     //This is just a sample query 
     $this->conn->query("SELECT * FROM table WHERE id = $id"); 
     return $query->fetch(PDO::FETCH_OBJ); 
    } 
} 

И тогда вы можете использовать в другом классе, как:

class basic { 
    private $dbConn; 
    function __construct(){ 
     $dbConn = new MysqlDB('hostName', 'username', 'password', 'database') 
    } 
    function simple($id) { 

    $row = $dbConn->query($id); 
    $thing = $row->partoftable; 
    echo $thing; 
} 
} 

Вы также можете создать соединение с базой данных общего класса и расширить его с вами класс

+0

Вы создаете новый экземпляр каждый раз при создании экземпляра класса.Это противоположность тому, что пытается сделать OP. – PeeHaa

-1
<?php 
define('DB_SERVER','localhost'); 
define('DB_USER','root'); 
define('DB_PASS' ,''); 
define('DB_NAME', 'db'); 
class DB_con { 
    function __construct() 
    { 
      $conn = mysql_connect(DB_SERVER,DB_USER,DB_PASS) or die('localhost connection problem'.mysql_error()); 

       mysql_select_db(DB_NAME, $conn); 
    } 

    public function insert($fname,$lname,) 
    { 
     $res = mysql_query("INSERT users(first_name,last_name,) VALUES('$fname','$lname')"); 
     return $res; 
    } 
    public function select($id) 
    { 
     $res=mysql_query("SELECT * FROM users WHERE id = $id"); 
     return $res; 
    } 
} ?> 
Смежные вопросы