过去,我总是创建一个数据库类,并在该类中为__construct方法中的mysql_connect指定了一个$ connection属性连接。在同一个文件中,我将实例化该类,以便它可以运行。然后,每当我需要该连接时,我只需要该数据库文件并在需要$ connection的方法中添加全局$连接。使用php的PDO获得类似或更好的东西的最佳方法是什么?
答案 0 :(得分:2)
我相信没有“最佳”方式来实现你的要求,但这就是我的用法。函数execute是根据我的需要设计的,你可以根据需要改变它。
**编辑**
顺便说一句,我在这个类中使用单例方法,因为我从不同的文件中多次调用该类。因此,您也可以改变它。
class DB
{
/* Connection settings */
private static $host = 'localhost';
private static $user = 'root';
private static $pass = 'your_pass';
private static $base = 'your_db';
private static $ins; // pdo instance
private static $class; // class object for singleton
public static $counter; // counts how many times execute is called
public function __construct()
{
}
public static function connect($errMode = PDO::ERRMODE_SILENT)
{
if (!isset(self::$ins))
{
try
{
self::$ins = new PDO("mysql:host=" . self::$host . ";" ."dbname=" . self::$base . ";", self::$user, self::$pass);
self::$ins->setAttribute(PDO::ATTR_ERRMODE, $errMode);
// PDO::ERRMODE_EXCEPTION
}
catch (Excpetion $ex)
{
self::raiseError($ex);
}
$className = __CLASS__;
self::$class = new $className;
}
return self::$class;
}
/**
* Function to execute a given query
* @param string $query : query string
* @param string | array $param : parameter (either array of parameters or string)
* @param bool $useBind : if true bindParam method will be used, else execute method will be called
* @return PDOStatement
*/
public function execute($query, $param, $useBind=true)
{
self::$counter++;
$stmt = self::$ins->prepare($query);
if (!$useBind)
$stmt->execute($param);
else
{
if (is_array($param))
{
$size = sizeof($param);
// if items within param param are array (e.g. array(array(value, name, type, length),
// array(value, name, type, length))
if ($size >= 1 && is_array($param[0]))
{
$i = 1; // ? placeholder counter
foreach ($param as $arr)
{
$size = sizeof($arr);
if ($size == 1) // e.g. array('red')
$stmt->bindParam($i, $arr[0]);
else if ($size == 2) // e.g. array(':color', 'red')
$stmt->bindParam($arr[0], $arr[1]);
else if ($size == 3) // e.g. array(':color', 'red', PDO::PARAM_STR)
$stmt->bindParam($arr[0], $arr[1], $arr[2]);
else // e.g. array(':color', 'red', PDO::PARAM_STR, 12)
$stmt->bindParam($arr[0], $arr[1], $arr[2], $arr[3]);
$i++;
}
}
else if ($size == 1) // e.g. array(15)
$stmt->bindParam(1, $param[0]);
else if ($size == 2) // e.g. array(':color', 'red')
$stmt->bindParam($param[0], $param[1]);
else if ($size == 3) // e.g. array(':color', 'red', PDO::PARAM_STR)
$stmt->bindParam($param[0], $param[1], $param[2]);
else if ($size == 4) // e.g. array(':color', 'red', PDO::PARAM_STR, 12)
$stmt->bindParam($param[0], $param[1], $param[2], $param[3]);
}
else // e.g. $db::execute($query, 15)
$stmt->bindParam(1, $param);
$stmt->execute();
}
return $stmt;
}
public function query($query)
{
self::$counter++;
$result = self::$ins->query($query);
return $result;
}
public function close()
{
self::$ins = null;
}
public function lastId()
{
$id = self::$ins->lastInsertId();
return $id;
}
public function trans()
{
self::$ins->beginTransaction();
}
public function commit()
{
self::$ins->commit();
}
public function rollBack()
{
self::$ins->rollBack();
}
private function raiseError($er)
{
throw new Exception($er);
}
public function counter()
{
return self::$counter;
}
}
答案 1 :(得分:1)
我认为“最佳”方法取决于情况。通常我使用PDO,因为它的内置功能主要需要覆盖。我喜欢创建自己的类,扩展PDO。
如果应用程序很小,我个人(这并不意味着'最好的方式')我使用'fat-database-class'模型,它将所有微小的函数保存在SQL查询中,只是用数据库获取/检查/设置信息。 'fat-database-class'扩展PDO,这意味着我不需要写函数,如执行或 get lastId ,因为PDO已经有了这些方法。 如果应用程序更大,我使用Framework&使得管理更容易管理的学说。如果您还没有尝试使用任何PHP框架,我建议您选择一个并尝试一下。框架有自己的规则,因此您不需要搜索和思考如何为自己的应用程序创建“完美规则”。