文件{$psrc}不存在!"); } $driver = $arr[1] . "Model"; include_once $pto; } if (!file_exists($to) || filemtime($src) > filemtime($to)) { $classContent = preg_replace('/classs+(.+?)s*{/i', 'class ' . $className . ' extends ' . $driver . ' {', $classContent, 1); // 生成model file_put_contents($to, $classContent); } } else { // 数据模型不存在,用户没有定义对应的数据模型,如果没有生成,则生成该数据模型 if (!file_exists($to)) { // 继承Driver对应的父类,PDO的父类为Dpdo,MySQLi的父类为Dmysqli $classContent = "1.2、 获取数据库结构信息
获取数据模型对应的数据库表的字段以及其他表信息由setTable该方法处理,不同的数据驱动程序处理数据库操作的方法是不同的,所以对应的数据库驱动类需要重写该方法,下面是PDO驱动对应的setTable方法
/** * 自动获取表结构 */ function setTable($tabName) { $cachefile = PROJECT_PATH . "runtime/data/" . $tabName . ".php"; $this->tabName = TABPREFIX . $tabName; //加前缀的表名 if (!file_exists($cachefile)) { try { $pdo = self::connect(); $stmt = $pdo->prepare("desc {$this->tabName}"); $stmt->execute(); $auto = "yno"; $fields = array(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { if ($row["Key"] == "PRI") { $fields["pri"] = strtolower($row["Field"]); } else { $fields[] = strtolower($row["Field"]); } if ($row["Extra"] == "auto_increment") $auto = "yes"; } //如果表中没有主键,则将第一列当作主键 if (!array_key_exists("pri", $fields)) { $fields["pri"] = array_shift($fields); } if (!DEBUG) file_put_contents($cachefile, "<?php " . json_encode($fields) . $auto); $this->fieldList = $fields; $this->auto = $auto; } catch (PDOException $e) { Debug::addmsg("<font color='red'>异常:" . $e->getMessage() . '</font>'); } } else { $json = ltrim(file_get_contents($cachefile), "<?ph "); $this->auto = substr($json, -3); $json = substr($json, 0, -3); $this->fieldList = (array)json_decode($json, true); } Debug::addmsg("表<b>{$this->tabName}</b>结构:" . implode(",", $this->fieldList), 2); //debug }2、 查询
$article->query("SELECT * FROM article", "select");代码执行的是查询的功能,查询方法是最基础的方法,上层的total()、select()、find()、insert()、update()、delete() 等数据库操作的方法都依赖于该方法的处理,不同的数据驱动程序处理数据库操作的方法是不同的,所以对应的数据库驱动类需要重写该方法,下面是PDO驱动对应的query方法
/**
* 执行SQL语句的方法
* @param string $sql 用户查询的SQL语句
* @param string $method SQL语句的类型(select,find,total,insert,update,other)
* @param array $data 为prepare方法中的?参数绑定值
* @return mixed 根据不同的SQL语句返回值
*/
function query($sql, $method, $data = https://www.isolves.com/it/cxkf/yy/php/2019-12-16/array())
{
$startTime = microtime(true);
$this->setNull(); //初使化sql
?
$value = https://www.isolves.com/it/cxkf/yy/php/2019-12-16/$this->escape_string_array($data);
$marr = explode("::", $method);
$method = strtolower(array_pop($marr));
if (strtolower($method) == trim("total")) {
$sql = preg_replace('/select.*?from/i', 'SELECT count(*) as count FROM', $sql);
}
$addcache = false;
$memkey = $this->sql($sql, $value);
if (defined("USEMEM")) {
global $mem;
if ($method == "select" || $method == "find" || $method == "total") {
$data = https://www.isolves.com/it/cxkf/yy/php/2019-12-16/$mem->getCache($memkey);
if ($data) {
return $data; //直接从memserver中取,不再向下执行
} else {
$addcache = true;
}
}
}
?
try {
$return = null;
$pdo = self::connect();
$stmt = $pdo->prepare($sql); //准备好一个语句
$result = $stmt->execute($value); //执行一个准备好的语句
?
//如果使用mem,并且不是查找语句
if (isset($mem) && !$addcache) {
if ($stmt->rowCount() > 0) {
$mem->delCache($this->tabName); //清除缓存
Debug::addmsg("清除表<b>{$this->tabName}</b>在Memcache中所有缓存!"); //debug
}
}
?
switch ($method) {
case "select": //查所有满足条件的
推荐阅读
- win7提示explorer.exe应用程序错误的解决方法
- 新买的Mac电脑如何设置更好用
- Mac小技巧|小技能有大作用
- 涌泉穴位位置图和作用 涌泉穴正确的按摩方法
- 浙江松阳启用茶叶质量IC卡 力求以质兴茶
- 原地热车究竟有啥作用?不少老司机都搞不明白,看看维修师傅怎么说?
- 汽车上的转速表究竟有什么用?我们开车时如何利用转速表?
- 汽车内外循环该怎样使用?
- 汽车上用的铅酸蓄电池,“铅”和“酸”是如何反应产生电能的?
- 暖脚宝可以在被窝用吗,暖脚宝可不可以睡觉用