我刚刚开始学习面向对象编程的概念,并且我已经用函数编写了这个类。
它工作正常,但我很想知道我是否正确地做到了这一点......
这是我的代码:
class Database{
const DB_HOSTNAME = 'localhost';
const DB_USERNAME = 'root';
const DB_PASSWORD = 'password';
const DB_NAME = 'shop';
protected $_db_connect;
protected $_sql;
protected $_result;
protected $_row;
function db_connect(){
$this->_db_connect = mysql_connect(self::DB_HOSTNAME,self::DB_USERNAME,self::DB_PASSWORD) or die(mysql_error());
}
function slect_db(){
mysql_select_db(self::DB_NAME) or die(mysql_error());
}
function sql(){
$this->_sql = 'SELECT * FROM users';
}
function query(){
$this->_result = mysql_query($this->_sql);
}
function fetch_array(){
while($this->_row = mysql_fetch_array($this->_result)){
$username = $this->_row['user_USERNAME'];
echo "<ul>";
echo "<li>".$username."</li>";
echo "</ul>";
}
}
function db_close(){
mysql_close($this->_db_connect);
}
}
$database = new Database();
$database->db_connect();
$database->slect_db();
$database->sql();
$database->query();
$database->fetch_array();
$database->db_close();
答案 0 :(得分:14)
请使用PDO或MySQLi,因为它更安全,并且如上所述不推荐使用mysql_ *函数,我提供了一些使用PDO的通用代码来帮助您进行新的冒险。正如评论中所述,如果你正在寻找面向对象的设计,你真的不应该回应数据,你应该做的是在你进行查询之后,返回你提取的行并从那里使用一些东西比如foreach循环然后显示你的数据。以这种方式执行数据库类还将确保一次不打开多个数据库连接!请注意,此代码仅供您参考,应在生产中使用之前进行测试或任何实时测试。
的config.php:
<?php
//Enter your database connection details here.
$host = 'localhost'; //HOST NAME.
$db_name = 'databasename'; //Database Name
$db_username = 'root'; //Database Username
$db_password = ''; //Database Password
try
{
$pdo = new PDO('mysql:host='. $host .';dbname='.$db_name, $db_username, $db_password);
}
catch (PDOException $e)
{
exit('Error Connecting To DataBase');
}
?>
database.class.php:
<?php
class database
{
function __construct($pdo)
{
$this->pdo = $pdo;
}
function getData()
{
$query = $this->pdo->prepare('SELECT * FROM database');
$query->execute();
return $query->fetchAll();
}
}
?>
的index.php:
<?php
require_once 'config.php';
require_once 'database.class.php';
$db = new database($pdo);
$rows = $db->getData();
?>
答案 1 :(得分:3)
Sieu Phan的回答是可以的,但它实际上确实确保你只打开了一个连接(你是否会多次包含config.php
文件 创建多个连接。)
可以使用自动加载和依赖注入容器改进连接数据库的方式。这是一种使用Auryn连接到您的数据库的方法,同时确保只打开了一个连接,而不必在整个应用程序中手动需要文件。
我将在这里仅介绍PDO和Auryn。还有其他依赖注入容器,特别是连接到数据库的mysqli扩展,但如果您愿意,内容应该可以帮助您使用另一个容器。
数据库类
拥有一个数据库类是多余的。 \PDO
类已经提供了查询数据库所需的所有方法。拥有一个数据库类可以让你实际重复它已经提供的所有功能,并且当你想要根据你在特定方法中的需要使用多种不同的提取样式时,实际上限制你的操作(或者让你创建许多功能)。 p>
依赖注入
如果您还没有,请read on dependency injection。关键是当一个类需要访问数据库时,它不应该打扰构造\PDO
对象,它应该用它构造:
class Mapper {
private $pdo;
public function __construct(\PDO $pdo) {
$this->pdo = $pdo;
}
public function createFromId($id) {
$stmt = $this->pdo->prepare("SELECT name FROM foo WHERE id=:id");
$stmt->execute([
":id" => $id,
]);
return $stmt->fetchObject();
}
}
请注意,我直接传递\PDO
对象,而不是包装类。这样,我总是可以访问它的所有功能,而不仅仅是用户定义函数的一个子集。
依赖注入容器
依赖注入容器有助于构建类,为它们提供所需的对象,并为您提供实际构建这些对象的极大灵活性。在这里,我只关注通过使用Auryn配置和共享 \PDO
对象。
我假设您已经安装了所需的Auryn类,使用composer更简单。这超出了本答案的范围,关于如何使用它有多种资源。
创建注射器
$injector = new \Auryn\Injector();
定义\PDO
类参数
$injector->define("PDO", [
":dsn" => "mysql:host=localhost;charset=utf8;dbname=dbname",
":username" => "user",
":passwd" => "passwd",
":options" => [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
],
]);
您可以直接在此处编写配置参数,也可以从配置文件中获取配置参数。我喜欢使用config.ini文件并使用parse_ini_file()
来获取配置选项,因为我可以通过编辑配置文件轻松切换数据库。
分享\PDO
对象
$injector->share("PDO");
这部分真的很重要。这条线使得注入器每次负责构建需要连接的类时都会提供相同的\PDO
对象。请注意,行的顺序并不重要,您可以在定义类之前共享该类,只需确保在写完这些行之后创建需要类的数据库。
创建对象
$mapper = $injector->make("Mapper");
那就是它。注入器将创建您的映射器对象,如果它已经存在,则创建\PDO
对象,如果有,则传递现有实例。
<强>自动加载强>
假设您使用过composer,您可以使用它的优秀自动加载器。否则你也可以自己推出autoloader。
这里的要点是停止在代码中到处都有require()
,特别是如果你有复杂的类层次结构,那么你应该在single responsibility兼容的类系统中拥有它。
结束
通过此设置,您现在可以在类中使用\PDO
对象,同时确保每个请求只有一个实例,无需在任何地方都需要文件,并且不使用单例反模式
答案 2 :(得分:-1)
$database = new Connection();
class Connection
{
function __construct()
{
switch($_SERVER['DOCUMENT_ROOT'])
{
case 'path':
$this->host = 'hostname';
$this->user = 'username';
$this->passwd = 'password';
$this->database = 'dbname';
break;
default :
$this->host = 'localhost';
$this->user = 'root';
$this->passwd = 'root';
$this->database = 'dbname';
break;
}
$this->clink = @mysql_connect($this->host,$this->user,$this->passwd);
@mysql_select_db($this->database,$this->clink);
}
}
答案 3 :(得分:-3)
$ objConn = new mysqlconnect(); $ Conn = $ objConn-&gt; setobjConnect(&#34; localhost&#34;,&#34; root&#34;,&#34; P @ ssw0rd&#34;);
答案 4 :(得分:-3)
class Database{
var $last_query; //Saved result of the last query made
var $last_result; //Results of the last query made
var $func_call; //A textual description of the last query/get_row/get_var call
var $link; //database link
var $lastquery; //last query
var $result; //query result
// Connect to MySQL database
function database() {
$this->link=mysql_connect(DB_HOST, DB_USER, DB_PASS) or die('Server connexion not possible.');
//Set All Charsets to UTF8
mysql_query("SET character_set_results=utf8 , character_set_client=utf8 , character_set_connection=utf8 , character_set_database=utf8 , character_set_server=utf8");
mysql_select_db(DB_NAME) or die('Database connection not possible.');
}
/** Query the database.
* @param $query The query.
* @return The result of the query into $lastquery, to use with fetchNextObject().
*/
function query( $query ){
$this->lastquery=$query;
$this->result=@mysql_query( $query, $this->link );
return $this->result;
}
/** Do the same as query() but do not return nor store result.
* Should be used for INSERT, UPDATE, DELETE...
* @param $query The query.
* @param $debug If true, it output the query and the resulting table.
*/
function execute($query)
{
@mysql_query($query);
}
/** Convenient method for mysql_fetch_object().
* @param $result The ressource returned by query().
* @return An ARRAY representing a data row.
*/
function fetchArray($result){
if ($result == NULL)
$result = $this->result;
if ($result == NULL || mysql_num_rows($result) < 1)
return NULL;
else
return mysql_fetch_assoc($result);
}
/** Close the connecion with the database server.
* It's usually unneeded since PHP do it automatically at script end.
*/
function close()
{
mysql_close($this->link);
}
/** Get the number of rows of a query.
* @param $result The ressource returned by query(). If NULL, the last result returned by query() will be used.
* @return The number of rows of the query (0 or more).
*/
function numRows($result = NULL)
{
if ($result == NULL)
return @mysql_num_rows($this->result);
else
return mysql_num_rows($result);
}
}
答案 5 :(得分:-6)
![<?php
class mysqlconnect{
private $server=null;private $user=null;private $password=null;private $objConnect=null;
function setobjConnect($s,$u,$p){
$this->server = $s;
$this->user = $u;
$this->password = $p;
return $this->objConnect = mysql_connect($this->server,$this->user,$this->password);
}
}
$objConn = new mysqlconnect();
$Conn = $objConn->setobjConnect("localhost","root","P@ssw0rd");
if($Conn)
{
echo "Database Connect";
}
else
{
echo "Database Connect Failed.";
}
mysql_close($Conn);
?>]