2012-09-19 36 views
1

嘿,对不起,这个愚蠢的问题。我已经读了很多关于在OOP的所以我决定尝试。我有一个博客运行程序化的PHP和所有工作正常,但我有代码的MySQL不mysqli,我决定升级到新的mysqli。这里的问题实际上是查询数据库以获得结果。我现在已经解决了这个问题两天了。这里是我想要实现的代码示例。如何将mysqli类扩展为其他类的方法

class myDB extends mysqli 
{ 
    //perform mysqli connection to host here and return $connection_handle 
} 

class siteConfig 
{ 
    private function getConfig($id) 
    { 
    $res = $connection_handle->query("SELECT * from config where id='1'"); 
    $row = $res->fetch_assoc(); 
    return $row['option']; 
    } 

} 

主索引文件,我会做到这一点

$c = new siteConfig(); 
echo $c->getConfig(1); 
//and this will return the result of the query. 

也请原谅我的编程逻辑仍然是一个非常可怕的新手在接力世界

任何想法会有所帮助谢谢。

PS

,这是工作示例代码我使用

$db_link = mysqli_connect(DB,HOST,DB_USER,DB,PASS,DB_NAME) or die(mysql_error()); 

class myDB extends mysqli 
{ 
    public function getConfig($id, $db_link) // thanks cbuckley 
{ 
$db_link = $this->db_link; 
    $res = mysqli_query($this->db_link,"SELECT * from config where id='1'"); 
    $row = mysqli_fetch_array($res); 
    return $row['option']; 
}  
} 

我已经定义的常量和连接成功,但选择不工作。在索引页面上,这是[code] include('inc/dbc.php');

$db = new MyDB(); 
echo $db->getConfig(1, $db_link); 

请让我知道我失踪了,或者如果可能的重构代码,我在哪里neccessary

+0

能否请您解释一下什么是目的更高效的查询扩展mysqli类(专业化?业务逻辑封装)? – ibtarek

+0

否则,你的代码中有一个错误:如果“getConfig”函数是私有的,你不能从类之外调用它“$ c-> getConfig”会触发错误 – ibtarek

+0

原谅人们......就像我说的一样一个新手来哟...你有什么建议? @ibatarek – jcobhams

回答

2

为什么不延长的mysqli类,并添加功能MYDB?

class myDB extends mysqli 
{ 
    public function getConfig($id) // thanks cbuckley 
    { 
    $res = $this->query("SELECT * from config where id='1'"); 
    $row = $res->fetch_assoc(); 
    return $row['option']; 
    }  
} 

$db = new myDB; 
$db->getConfig($id); 

您可以通过使用$ this关键字调用内部MYDB任何mysqli的功能(这是指本身,因为“它的自我”扩展mysqli的,它将拥有所有的mysqli具有的功能+您添加的)

+0

当我想对数据库进行其他查询时如何?我是否将所有这些方法作为方法添加到mydb类中?...您是否有任何想法可以编写通用查询代码,并且博客将有足够的数据库查询...感谢您的答案,尽管您可以始终调用$ – jcobhams

+0

DB->查询();在上面的例子中,因为所有的mysqli函数仍然是你的一部分。但是您可能想要为myDB类中的插入更新和删除创建查询包装器。另外考虑使用框架,包括模型..像Yii或Zend(其中包括许多其他:); –

+0

我有yii和zend安装在我的本地机器上,但他们不是新手友好的 – jcobhams

2

保持数据库连接和任何业务逻辑之间的分离是很好的,所以你的例子很好。只有一些额外的东西需要整理,即应用程序逻辑如何访问数据库处理程序。这里有一个例子:

class MyDB extends mysqli { 
    // any custom DB stuff here 
} 

class SiteConfig { 
    protected $db; 

    public function __construct(MyDB $db) { 
     $this->db = $db; 
    } 

    public function getConfig($id) { 
     $statement = $this->db->prepare('SELECT * FROM config WHERE id = ?'); 
     $statement->bind_param('i', $id); 

     if ($statement->execute()) { 
      $row = $statement->get_result()->fetch_assoc(); 
      return $row['option']; 
     } 
    } 
} 

$db = new MyDB('host', 'user', 'password', 'db'); 
$config = new SiteConfig($db); 
var_dump($config->getConfig(1)); 

一对夫妇的兴趣点的位置:

+0

谢谢soooo多cbuckley ....如何,这是非常先进的像我这样的noob pls分解...一个刚刚开始与mysqli和我的理解非常有限pse expanciate上自定义数据库的东西和什么myDB类返回....再次感谢 – jcobhams

+1

MyDB只是mysqli的一个孩子,所以你会像[正常示例](http://php.net/mysqli)一样使用它。构建体#refsect1-mysqli.construct-例子)。在我的代码中,MyDB没有增加真正的价值,但它是放置数据库连接错误处理等事情的最佳位置。我已经添加了连接参数以使其更清晰。然后,你所做的只是将连接传递给SiteConfig [构造函数](http://php.net/__construct)。我还添加了几个兴趣点:-) – cmbuckley