我在PDO中使用抽象类。我想知道是否有必要$conn每次都使该变量为空,或者在脚本结束时本身是否为空?
您还能告诉我这种结构的最佳方法是$conn什么?
abstract class DB_Connection
{
protected static $tbl_admin = "prof_admin";
//protected static $tbl_admin = "prof_admin";
protected static function obj_db()
{
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "salmanshahid";
$conn = null;
try
{
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conn;
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
}
protected static function select($query)
{
try
{
$conn = self::obj_db();
$stmt = $conn->prepare($query);
$stmt->execute();
// set the resulting array to associative
$stmt->setFetchMode(PDO::FETCH_ASSOC);
return $stmt->fetchAll();
}
catch(PDOException $e)
{
throw new Exception("Error In SELECT STATMENT: " . $e->getMessage());
}
}
protected static function insert($query)
{
try
{
$conn = self::obj_db();
$stmt = $conn->prepare($query);
$stmt->execute();
}
catch(PDOException $e)
{
throw new Exception("Error In INSERT STATMENT: " . $e->getMessage());
}
}
}
Run Code Online (Sandbox Code Playgroud)
还是脚本结束时自己这样做?
是的,可以肯定,PHP自动关闭并清除脚本执行期间打开的所有资源,因此,不必担心手动关闭它。
无论如何,要使conn无效,只需使其无效:$this->conn = NULL;;
但是,与您班上其他不安全,效率低下和无法使用的问题相比,这些东西完全可以忽略不计。
select()没有insert()功能支持预处理语句,这使得他们很没用:您可以使用PDO ::查询()来代替,具有完全相同的结果。但是,您真正需要做的是通过在查询中使用占位符,同时将实际变量发送给execute(); 来正确使用prepare / execute 。select()函数仅限于一种类型的结果集,而insert()根本不返回任何结果。相反,您可以仅使用单个函数来运行所有查询,并使它返回该语句,这将非常有用。它可以让您以PDO支持的多种格式获取返回的数据,甚至可以从DML查询中获取受影响的行数。让我为您建议另一种方法,一个简单的PDO包装器,可以让您以最简单和安全的方式使用PDO:
<?php
define('DB_HOST', 'localhost');
define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_CHAR', 'utf8');
class DB
{
protected static $instance = null;
public function __construct() {}
public function __clone() {}
public static function instance()
{
if (self::$instance === null)
{
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => TRUE,
);
$dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHAR;
self::$instance = new PDO($dsn, DB_USER, DB_PASS, $opt);
}
return self::$instance;
}
public static function __callStatic($method, $args)
{
return call_user_func_array(array(self::instance(), $method), $args);
}
public static function run($sql, $args = [])
{
$stmt = self::instance()->prepare($sql);
$stmt->execute($args);
return $stmt;
}
}
Run Code Online (Sandbox Code Playgroud)
它极其强大,安全且易于使用。
您可以通过在DB::前缀后面添加调用来使用任何PDO函数:
$stmt = DB::query("SELECT * FROM table WHERE foo='bar'");
Run Code Online (Sandbox Code Playgroud)
因此,首先,它是一个PDO包装器,它能够通过使用魔术__call()方法来运行任何PDO 方法。我添加的唯一功能是run()。
而是你自己的不安全和不可靠select()和insert()方法,让我建议你使用一个通用的run()方法,它无非是一个速记以下三行:
$stmt = DB::prepare($query);
$stmt->execute($params);
$data = $stmt->fetch();
Run Code Online (Sandbox Code Playgroud)
因此,您可以将其编写为整洁的单行代码:
$data = DB::run($query, $params)->fetch();
Run Code Online (Sandbox Code Playgroud)
请注意,它可以运行任何类型的查询,并以PDO支持的任何格式返回结果。
我写了一篇有关此简单包装的文章,您可以在其中找到一些用法示例。所有示例代码都可以按原样运行,只需将其复制并粘贴到脚本中并设置凭据即可:http : //phpdelusions.net/pdo/pdo_wrapper#samples
| 归档时间: |
|
| 查看次数: |
2098 次 |
| 最近记录: |