精华内容
下载资源
问答
  • 首先介绍IFC标准并分析其数据特点,随后针对利用IFC实体对象所表示的简单信息、组合信息及复杂信息,利用面向对象数据库Versant ObjectDatabase 8和关系数据库SQLServer 2005进行数据管理,并对其处理效率进行了比较...
  • 面向对象数据库系统是被动的,主动数据库系统提供一种机制监视数据库的状态。能够主动对数据库内部的值或外部条件变化作出反应。面向主动对象的数据库系统将两者功能有机地结合在一起,一方面增强了面向对象数据库...
  • 针对面向对象技术和关系数据库特点,将两者相结合,建立了对象关系数据库管理系统,既支持已经被广泛使用的SQL,不仅具有良好的通用性,又具有面向对象特性,能支持复杂对象和复杂对象的复杂行为,是对象技术和...
  • # 他是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 # 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。 # 再简单点:用面向对象操作...

    什么是orm

    # 什么是orm
    # 
    # 对象关系映射(Object Relational Mapping,简称ORM)模式
    #
    # 他是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
    # 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
    # 再简单点:用面向对象操作数据库。
    

    orm的技术特点  

    # 几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。
    # 当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。
    # 当你开发一个应用程序的时候(不使用ORM), 你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。
    # 你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。
    #
    # ORM解决的主要问题是对象关系的映射。域模型和关系模型分别是建立在概念模型的基础上的。
    # 域模型是面向对象的,而关系模型是面向关系的。
    # 一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段。
    # 对应关系:
    # 类 --->表
    # 对象-- >行
    # 属性-- >列

    # ORM技术特点:
    # 1.提高了开发效率。由于ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射我们实际可能已经不需要一个专用的、庞大的数据访问层。
    # 2.ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数(但是因此失去了一些性能)。

      

     orm的优缺点

    在提高开发效率的同时,不可避免的降低了执行效率性能。
    

      

     

    转载于:https://www.cnblogs.com/adamans/articles/7513501.html

    展开全文
  • OstrivDB是用于Microsoft .NET和Mono的嵌入式NoSQL面向对象数据库引擎。 OstrivDB以Oster河(作者居住的小镇上的小河)的名字命名。 特点:-缓存选择查询。 -索引。 -批查询。 -意见。 -InMemory对象和视图。 -...
  • 面向对象思想在数据库开发方面的应用[摘要]由于关系数据库在业界深远的影响及强势的地位,使得数据库开发方面关系数据库仍然是首选。...基于面向对象的分析和设计的特点正好可以解决这方面的问题。...
    面向对象思想在数据库开发方面的应用[摘要]由于关系数据库在业界深远的影响及强势的地位,使得数据库开发方面关系数据库仍然是首选。但随着计算机的普及,使用计算机作为信息管理和工业控制正成为众多商家的选择。随之而来的是软件的设计变得越来越复杂,当前以数据库设计为中心的数据库应用系统的开发已经难以适应需求,而且设计出来的系统难以维护和升级。基于面向对象的分析和设计的特点正好可以解决这方面的问题。面向对象的分析和设计的特点,使得客户可以参与到系统分析及设计的整个过程,需求的满足成为一件很轻松的事情。另面向对象技术的封装和扩展特性,使得代码的维护和升级变得简单起来。本文论述的是面向对象的思想如何与传统的数...

    转载于:https://www.cnblogs.com/kl2009/archive/2007/12/20/1547699.html

    展开全文
  • PDO对象PDO 是什么PDO 的特点开启 PDO扩展使用PDO连接数据库创建 PDO 对象使用PDO执行SQL语句1) exec() 方法2) query() 方法3) 预处理语句方式实战:完善登录注册功能 PDO 是什么 PDO 是 PHP Date Object(PHP 数据...

    PDO 是什么

    PDO 是 PHP Date Object(PHP 数据对象)的简称,它是 PHP 为访问数据库定义的一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样无论你使用什么数据库,都可以通过同一函数执行查询和获取数据,大大简化了数据库的操作,并能够屏蔽不同数据库之间的差异。

    PDO 是与 PHP5.1 版本一起发行的,使用 PDO 可以很方便地进行跨数据库程序的开发,以及不同数据库间的移植,目前 PDO 支持的数据库包括 Firebird、FreeTDS、Interbase、MySQL、SQL Server、ODBC、Oracle、Postgre SQL、SQLite 和 Sybase 等。

    PDO 的特点

    我们可以将 PDO 看作是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口。与 MySQL 和 MSSQL 函数库相比,PDO 让跨数据库的使用更具有亲和力,与 ADODB 和 MDB2 相比,PDO 更加高效。

    PDO 将通过一种轻型、清晰、方便的函数,统一各种不同的数据库的共有特性,实现 PHP 脚本在最大程度上的抽象性和兼容性。

    PDO 吸取了现有数据库扩展成功和失败的经验教训,利用 PHP5 的最新特性,可以轻松地与各种数据库进行交互。

    PDO 扩展是模块化的,能够在运行时为用户数据库后端加载驱动程序,而不必重新编译或重新安装整个 PHP 程序。例如,PDO_MySQL 扩展会替代 PDO 扩展实现 MySQL 数据库 API,它还有一些用于 Oracle、Postgre SQL、ODBC 和 Firebird 的驱动程序。

    开启 PDO扩展

    默认情况下,PDO 在 PHP 中为开启状态,但是要启用对某个数据库驱动程序的支持,仍需要进行相应的配置操作。

    以 Windows 系统下为例,在配置文件 php.ini 中有关 PDO 相关的配置信息如下所示:

    ;extension=pdo_firebird
    ;extension=php_pdo_mysql.dll
    ;extension=pdo_oci
    ;extension=pdo_odbc
    ;extension=pdo_pgsql
    ;extension=pdo_sqlite
    

    提示:开启相应的配置只需要去除配置项前面的分号;,然后重启 Apache 服务器即可。

    验证相关的配置是否开启成功,只需要执行 phpinfo() 函数就行,在输出的页面中搜索配置的名称,如果存在则说明开启成功

    使用PDO连接数据库

    在使用 PDO 与不同数据库之间交互时,PDO 对象中的成员方法是统一各种数据库的访问接口,所以在使用 PDO 与数据库交互之前,首先要创建一个 PDO 对象,然后再通过对象的构造函数来连接数据库。

    new PDO(string $dsn[, string $username [, string $password [, array $driver_options]]]);

    参数说明如下:

    • $dsn:数据源名称或叫做 DSN(Data Source Name 的缩写),包含了请求连接到数据库的信息。通常一个 DSN 是由 PDO 驱动程序的名称,紧随其后是一个冒号,再后面是可选的驱动程序的数据库连接信息,比如主机名、端口和数据库名。以 MySQL 数据库为例 $dsn 可以定义为:mysql:host=localhost;port=3306;dbname=dbname;charset=utf8,分别定义了数据库类型、端口号、数据库名和字符集;
    • $username:可选参数,用来表示 DSN 字符串中的用户名;
    • $password:可选参数,用来表示 DSN 字符串中的密码;
    • $driver_options:可选参数,一个具体驱动的连接选项的键/值数组。

    PHP 数据对象:https://www.php.net/manual/zh/book.pdo.php

    预定义常量:https://www.php.net/manual/zh/pdo.constants.php

    创建 PDO 对象

    $pdo = new PDO($dsn, $user, $pwd); 参数:dsn,数据库用户名,数据库密码

    <?php
        $type = 'mysql';     //数据库类型
        $host = 'localhost'; //数据库主机名
        $dbname = 'test';    //使用的数据库名称
        $username = 'root';  //数据库连接用户名
        $username  = 'root'; //数据库连接密码
        $dsn="$type:host=$host;dbname=$dbname";
    	 try{
            // 可选,设置错误提示级别为WARNING
            $params = array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING);
             //初始化一个PDO对象
            $pdo= new PDO($dsn,$user,$pwd,$params);
             # 设置结果集的默认获取的方式 (默认索引数组和关联数组)
       		$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
        }catch(Exception $e){
            die('数据库连接失败:'.$e -> getMessage());
        }
    ?>
    

    使用PDO执行SQL语句

    在 PDO 中,我们可以使用三种方式来执行 SQL 语句,分别是 exec() 方法,query() 方法,以及预处理语句 prepare() 和 execute() 方法。

    执行sql语句: exec() 、query()、 perpare();

    1、query用来处理有结果集的,如select, 返回 PDOStatement 对象,失败返回false(当为 PDO::ERRMODE_SILENT,这也是默认的值)

    2、exec用来处理有返回影响行数的(int),如 insert(插入的行数)、 delete(删除的行数) 、update(和原数值不等才算), 失败返回false (当为 PDO::ERRMODE_SILENT,这也是默认的值)

    3、prepare 执行所有sql,可以完全替代 query,exec的功能,并且可以防止SQL注入

    错误报告是针对执行的sql出错时

    PDO::ERRMODE_SILENT(0) :默认 不提示任何错误 ,连接时无论如何都会提示,只有在执行后面的方法时才会起作用
    PDO::ERRMODE_WARNING(1) : 警告
    PDO::ERRMODE_EXCEPTION(2):异常(推荐使用) 用try catch捕获,也可以手动抛出异常 new PDOException($message, $code, $previous)

    1) exec() 方法

    当执行 INSERT、UPDATE 和 DELETE 等不需要返回结果集的 SQL 语句时,可以使用 PDO 对象中的 exec() 方法。该方法成功执行后,将返回受影响的行数

    主要思路:
    (1)连接数据库、数据库的用户名、数据库的密码
    (2)生成PDO对象
    (3)执行查询

    <?php
        # $stmt = $pdo->exec($sql); 执行SQL增删改语句,返回值是false或 受影响的整型数量
        $dsn  = 'mysql:host=localhost;dbname=users;';
        $username = 'root';
        $password  = 'root';
    	// 生成PDO对象  
    	$pdo = new PDO($dsn,$user,$pwd);
    	$sql = "insert into user(name,age,sex) values('zhang','18','男')";
        $res = $pdo -> exec($sql);
        if($res) echo '成功添加 '.$res.' 条数据!';
    ?>
    
    # exec用法
    try {
        $sql = "insert into users (`user_name`, `user_pwd`) values('zhang', '123'),('admin', 'admin')";
        $rows = $pdo->exec($sql);  // 影响的条数 2
        $id = $pdo->lastInsertId(); //最后插入的id,有多条时返回的是第一条的id
    } catch (Exception $e) {
       echo $pdo->errorInfo();
    }
    

    注释:exec主要用于执行没有返回结果集的操作,比如insert、delete、update,返回的是影响的记录条数

    2) query() 方法

    当执行需要返回结果集的 SELECT 查询语句时,可以使用 PDO 对象中的 query() 方法。如果该方法执行成功,则会返回一个 PDOStatement 对象。如果使用了query() 方法,并想了解获取的数据行总数,可以使用 PDOStatement 对象中的 rowCount() 方法获取。

    PDO::query(string $sql)
    # 执行SQL查询语句,返回值是false或 PDOStatement 类型的对象
    $stmt = $pdo->query($sql); 
    # 读取结果中的数量
    echo $stmt->rowCount();
    # 返回结果集第一条数据
    $stmt->fetch(PDO::FETCH_ASSOC);
    # 返回结果集全部数据
    $stmt->fetchAll(PDO::FETCH_ASSOC);
    # 直给pdo对象全局设置返回类型
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
    

    通过设置第二个参数可以调整返回值的样式:

    • PDO::FETCH_BOTH 关联+索引数组(默认值)
    • PDO::FETCH_ASSOC 关联数组
    • PDO::FETCH_NUM 索引数组
    • PDO::FETCH_OBJ 对象类型
    <?php  
    	$dsn  = 'mysql:host=127.0.0.1;dbname=mydb';
        $user = 'root';
        $pwd  = 'root';
        $pdo = new PDO($dsn,$user,$pwd);
        $sql = "SELECT * FROM users ";
        // 获取PDOStatement对象
        $stmt = $pdo -> query($sql,PDO::FETCH_ASSOC);
        echo "<pre>";
        print_r($stmt);
        // 获取结果集全部数据
        print_r($stmt->fetchAll());
        
    ?>
    

    设置结果集参数也可以通过fetch和fetchAll()传入

    <?php  
    	$sql = "SELECT * FROM users ";
        // 获取PDOStatement对象
        $stmt = $pdo -> query($sql);
        // 获取结果集中第一条数据 返回关联数组
    	$res = $stmt->fetchAll(PDO::FETCH_ASSOC);
    	echo "<pre>";
        print_r($res);
    ?>
    

    为了避免每次获取结果集都反复的设置参数, setAttribute()方法是设置部分属性我们可以直接在连接数据库时给pdo对象统一的来设置

    <?php  
    	$dsn  = 'mysql:host=127.0.0.1;dbname=mydb';
        $user = 'root';
        $pwd  = 'root';
        $pdo = new PDO($dsn,$user,$pwd);
        # 设置结果集的默认获取的方式 (默认索引数组和关联数组)
       	$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
        $sql = "SELECT * FROM users ";
        // 获取PDOStatement对象
        $stmt = $pdo -> query($sql);
        // 获取结果集中第一条数据 返回关联数组
    	$res = $stmt->fetchAll();
    	echo "<pre>";
        print_r($res);
        
    ?>
    

    使用 query() 和 exec() 方法有以下几点需要注意:

    • query() 和 exec() 都可以执行所有的 SQL 语句,只是返回值不同而已;
    • query() 可以实现所有 exec() 的功能;
    • 当把 select 语句应用到 exec() 时,总是返回 0;
    • 如果要看查询的具体结果,可以通过 foreach 语句完成循环输出。

    3) 预处理语句方式

    当同一个查询需要多次执行时(有时需要迭代传入不同的条件参数),使用预处理语句的方式来实现效率会更高。使用预处理语句就需要使用 PDO 对象中的 prepare() 方法去准备一个将要执行的查询,再使用 PDOStatement 对象中的 execute() 方法来执行。

    
    $stmt = $pdo -> prepare($sql);
    $stmt -> execute([参数1,参数2]);
    
    $args = $stmt->fetchAll(参数):读取查询结果数组
    
    $arg = $stmt->fetch(参数):读取一条查询结果数组,参数同上
    
    $obj = $stmt->fetchObject():直接读取一条结果为对象类型
        
    $pdo->errorInfo():读取错误信息,返回值是数组类型
    
    

    SQL 语句模板中可以包含零个或多个参数占位标记,格式可以是命名(:name)或问号(?)的形式,当它执行时将用真实数据取代。在同一个 SQL 语句里,命名和问号形式不能同时使用,只能选择其中一种参数形式。如果使用命名形式的占位标记,那么标记的命名必须是唯一的。使用预处理语句可以有效的避免传统的方式中SQL注入问题

    使用命名形式的参数占位符,查询指定的 SQL 语句

    <?php  
    	#无序方式 命名占位符
        $dsn  = 'mysql:host=127.0.0.1;dbname=mydb';
        $user = 'root';
        $pwd  = 'root';
    
        $pdo = new PDO($dsn,$user,$pwd);
        $sql = "SELECT user_name,user_email FROM users WHERE user_sex = :sex";
        $sth = $pdo -> prepare($sql);
    
        $sth -> execute([':sex'=>0]);
        $res = $sth -> fetchAll();
    	echo '<pre>';
        print_r($res);
        
    ?>
    

    使用问号形式的参数占位符,查询指定的 SQL 语句

    <?php
         #有序方式 问号占位符
        $dsn  = 'mysql:host=127.0.0.1;dbname=mydb';
        $user = 'root';
        $pwd  = 'root';
    
        $pdo = new PDO($dsn,$user,$pwd);
        $sql = "SELECT user_name,user_email FROM users WHERE user_sex= ?";
        
        $sth = $pdo -> prepare($sql);
        $sth -> execute([0]);
        $res = $sth -> fetchAll(PDO::FETCH_ASSOC);
        echo '<pre>';
        print_r($res);
       
    ?>
    

    使用PDOStatement::bindParam() 提前引用绑定参数,而不是执行的时候绑定参数。

    // 连接数据库
    $dsn = "mysql:host=127.0.0.1;port=3306;dbname=mydb";
    $opts = array(PDO::ATTR_AUTOCOMMIT=>0, PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_AUTOCOMMIT=>0);
    try {
        $pdo = new PDO($dsn, 'root', 'root', $opts);
    }catch(PDOException $e){
        echo $e->getMessage();
    }
    
    
    /* pdo中有两种占位符号
     *
    *  ? 参数占位符            --- 索引数组, 按索引顺序使用
    *  命名参数占位符           ----关联数组, 按名称使用,和顺序无关
    */
    
    
    //准备好了一条语句,并入到服务器端,也已经编译过来了,就差为它分配数据过来
    //同样适用于更新操作
    
    // 命名参数占位符
    $stmt=$pdo->prepare("insert into users (`user_name`, `user_pwd`,'user_email','create_time') values(:name,:pwd,:email,:time)");
    
    //绑定参数,引用方式传递
    $stmt->bindParam(":name", $name);
    $stmt->bindParam(":pwd", $pwd);
    $stmt->bindParam(":email", $email);
    $stmt->bindParam(":time", $time);
    
    #变量放到 bindParam 前后都可
    $name="zhang";
    $pwd = '1234';
    $email = 'zhang@qq.com';
    $time = time();
    
    
    // 问号参数占位符
    $stmt=$pdo->prepare("insert into users (`user_name`, `user_pwd`,'user_email','create_time') values(?,?,?,?)");
    //绑定参数,引用方式传递
    $stmt->bindParam(1, $name, PDO::PARAM_STR); #起始值为 1 
    $stmt->bindParam(2, $pwd, PDO::PARAM_STR);
    $stmt->bindParam(3, $email, PDO::PARAM_INT);
    $stmt->bindParam(4, $time, PDO::PARAM_INT);
    
    // 执行预处理语句
    if($stmt->execute()){
        echo "执行成功";
        echo "最后插入的ID:".$pdo->lastInsertId();
    }else{
        echo "执行失败!";
    }
    
    • PDO类 数据库连接有关(连接、执行sql)
      • PDO::prepare — 准备要执行的语句,并返回语句对象
      • PDO::query — 执行 SQL 语句,以 PDOStatement 对象形式返回结果集
    • PDOStatement 处理结果集 (pdo>query()pdo->query()和pdo->prepare()可以返回PDOStatement)
    • PDOException 异常处理类

    https://www.php.net/manual/zh/class.pdostatement.php

    总结:

    1、query和exec都可以执行所有的sql语句,只是返回值不同而已。

    2、query可以实现所有exec的功能。

    3、当把select语句应用到 exec 时,总是返回 0

    预处理语句(prepare)示例,sql只编译一次,执行相同的sql效率会高。单个相比exec,query效率也高。

    注意:批量插入时,依次插入当遇到错误时后面的插入失败,但是前面的会插入成功。

    pdo 预处理中 bindParam() 和 bindValue() 的不同之处:

    • PDOStatement::bindParam — 绑定一个参数到指定的变量名

    • PDOStatement::bindValue — 把一个值绑定到一个参数

    • 区别就是前者使用一个php变量绑定参数,而后者使用一个值。说白了一个是变量,一个是固定值

    所以使用bindParam是第二个参数只能用变量名,而不能用变量值,而bindValue至可以使用具体值。

    $stm = $pdo->prepare("select * from users where user = :user");  
    $user = "jack";  
    //正确  
    $stm->bindParam(":user",$user);  
    //错误  
    //$stm->bindParam(":user","jack");  
    //正确  
    $stm->bindValue(":user",$user);  
    //正确  
    $stm->bindValue(":user","jack");  
    
    
    // 另外在存储过程中,bindParam可以绑定为input/output变量,如下面
    $stm = $pdo->prepare("call func(:param1)");  
    $param1 = "abcd";  
    $stm->bindParam(":param1",$param1); //正确  
    $stm->execute(); 
    

    存储过程执行过后的结果可以直接反应到变量上。

    对于那些内存中的大数据块参数,处于性能的考虑,应优先使用前者


    下面来演示一下SQL注入:

    <?php  
    	$dsn  = 'mysql:host=127.0.0.1;dbname=mydb';
        $user = 'root';
        $pwd  = 'root';
        $pdo = new PDO($dsn,$user,$pwd);
        # 设置结果集的默认获取的方式 (默认索引数组和关联数组)
       	$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
       	// 模拟用户输入的用户名和密码
       	$name = "' or 1=1 # ";
       	$pwd = '1234';
        $sql = "select user_name,user_pwd from users where user_name = '{$name}' and user_pwd = '{$pwd}'";
        // 获取PDOStatement对象
        $stmt = $pdo -> query($sql);
        echo "<pre>";
        print_r($stmt);
        // 获取结果集中第一条数据 返回关联数组
    	$res = $stmt->fetchAll();
        print_r($res);
        
    ?>
    

    生成的sql语句是这样的,存在严重问题

    select user_name,user_pwd from users where user_name='zhang' and user_pwd='1234';
    
    # 但用户如果输入的用户名是 ' or 1=1 # 
    select user_name,user_pwd from users where user_name='' or 1=1 #' and user_pwd='1234';
    

    下面我们用预处理语句方式来查询看一下生成的SQL语句和执行结果

    <?php  
    	$dsn  = 'mysql:host=127.0.0.1;dbname=mydb';
        $user = 'root';
        $pwd  = 'root';
        $pdo = new PDO($dsn,$user,$pwd);
        # 设置结果集的默认获取的方式 (默认索引数组和关联数组)
       	$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
       	// 模拟用户输入的用户名和密码
       	$name = "' or 1=1 # ";
       	$pwd = '1234';
        $sql = "select user_name,user_pwd from users where user_name=? and user_pwd=?";
        $stmt = $pdo -> prepare($sql);
    	$stmt->execute([$name,$pwd]);
        echo "<pre>";
        print_r($stmt);
    	$res = $stmt->fetchAll();
        print_r($res);
        
    ?>
    

    PDO预处理能防止sql注入的原因:

    1、先看预处理的语法

    #无序方式 命名占位符预处理
    $pdo->prepare('select user_name from users where user_name=:user_name');
    $pdo->execute([':user_name'=>'admin']);
     #有序方式 问号占位符预处理
    $pdo->prepare('select user_name from users where user_name=?');
    $pdo->execute(['admin']);
    
    • prepare 服务器发送一条sql给mysql服务器,mysql服务器会解析这条sql。

    • execute 服务器发送一条sql给mysql服务器,mysql服务器不会解析这条sql,只会把execute的参数当做纯参数赋值给语句一。哪怕参数中有sql命令也不会被执行,从而实现防治sql注入。

    实战:完善登录注册功能

    文件夹基本结构如下:

    common.php

    <?php  
    /**
     * 公共模型文件
     */
    
    // 连接数据库服务
    require "../../config/connect.php";
    
    function checkName($uname){
    	global $pdo;
    	// 默认数据库中用户名不存在同名
    	$isOccupied = false;
    	// 编写查询用户名SQL语句
    	$sql = "select user_name from users where user_name='{$uname}'";
    	// 返回 pdo Statement对象
    	$stmt =  $pdo->query($sql);
    	// 以关联数组方式返回结果集
    	$res = $stmt->fetchAll(PDO::FETCH_ASSOC);
    	// 如果不想每次获取时都设置返回方式,也可以直接给pdo对象设置返回类型
    	// $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
    	if($res){
    		$isOccupied = true;
    	}
    	return $isOccupied;
    }
    
    function insertData(Array $user){
    	global $pdo;
    	// 获取当前时间戳
    	$create_time = time();
    	// 将密码进行加密处理
    	$password = password_hash($user['pwd'],PASSWORD_BCRYPT);
    		// 准备插入的sql语句
    	$sql  = "insert into users (user_name,user_pwd,create_time,user_email) values ('{$user['userName']}','{$password}',{$create_time},'{$user['email']}')";
    	// 执行插入SQL语句
    	$count = $pdo->exec($sql);
    	return $count;
    }
    ?>
    

    regist_check.php

    <?php  
    // 导入公共函数库
    require "./common.php";
    // 接受用户登陆时提交的验证码
    session_start();
    // 接收PSOT传递过来的数据
    $user = $_POST;
    // 非表单提交访问页面给予提醒
    if(empty($user)) die('请勿非法访问!!!');
    // 判断请求的类型
    if(isset($_POST['type']) && $_POST['type']==1 ){
    	if(!empty($_POST["uname"])){
    		// 调用函数判断用户名是否被占用
    		$res = checkName($_POST["uname"]);
    		if($res){
    			echo json_encode(['status'=>0,'msg'=>'该用户名已被占用']);
    		}else{
    			echo json_encode(['status'=>1,'msg'=>'该用户名合法']);
    		}
    	}
    }else if(isset($_POST['type']) && $_POST['type']==2 ){
    	if(!empty($_POST["captcha"])){
    	    if(strtolower($_SESSION["captcha"]) === strtolower($_POST["captcha"])){
    	        echo json_encode(['status'=>1,'msg'=>'验证码正确']);
    	    }else{
    	        echo json_encode(['status'=>0,'msg'=>'验证码不正确']);
    	    }
    	}
    }else{
    	if(strlen($user['userName'])<4 || !preg_match("/^[A-Za-z]/i",$user['userName']) ){
    		echo json_encode(['status'=>0,'msg'=>'用户名长度需不小于四位且以字母开头']);
    	}else if(strcmp($user['pwd'],$user['cpwd'])!== 0){
    		echo json_encode(['status'=>0,'msg'=>'两次密码输入不一致']);
    	}else if(strcasecmp($_SESSION["captcha"],$user["captcha"])!== 0){
    		echo json_encode(['status'=>0,'msg'=>'验证码不正确']);
    	}else if(checkName($user['userName'])){
    		echo json_encode(['status'=>0,'msg'=>'请勿重复多次提交']);
    	}else{
    		// 调用添加数据函数 返回受影响行数
    		$count= insertData($user);
    		if($count):
    			echo json_encode(['status'=>1,'msg'=>'注册成功,请稍后……']);
    		else:
    			echo json_encode(['status'=>0,'msg'=>'注册失败~~~']);
    		endif;
    	}
    }
    
    
    ?>
    

    login_check.php

    <?php  
    // 连接数据库服务
    require "./../config/connect.php";
    // 接受用户登陆时提交的验证码
    session_start();
    if(empty($_POST)) die("请勿非法访问");
    $username = $_POST['userName'];
    $password = $_POST['pwd'];
    $captcha = $_POST['captcha'];
    // 预处理SQL模板
    $sql = "select user_name,user_pwd from users where user_name = ?";
    // prepare()方法-准备一条预处理语句 返回 pdo statement对象
    $stmt = $pdo->prepare($sql);
    // 绑定参数到指定的变量名
    $stmt->bindParam(1,$username,PDO::PARAM_STR);
    // 执行预处理SQL
    $stmt->execute();
    // 获取结果集
    $res = $stmt->fetch();
    // 判断查询出的数据条数
    if($stmt->rowCount()==0){
    	echo json_encode(['status'=>0,'msg'=>'该用户未注册……']); 
    }else if(!password_verify($password,$res['user_pwd'])){
    	echo json_encode(['status'=>0,'msg'=>'用户名或密码不正确']); 
    }else if(strcasecmp($_SESSION["captcha"],$captcha)!== 0){
    	echo json_encode(['status'=>0,'msg'=>'验证码错误……']); 
    }else{
    	echo json_encode(['status'=>1,'msg'=>'登录成功……']); 
    }
    ?>
    

    database.php

    <?php
    namespace pdo_edu;
    return [
        'type'=> $type ?? 'mysql',
        'host'=> $host ?? 'localhost',
        'dbname'=> $dbname ?? 'mydb',
        'username'=> $username ?? 'root',
        'password'=> $password ?? 'root',
        'charset'=> $charset ?? 'utf8mb4',
        'port'=> $port ?? '3306'
    ];
    
    
    

    connect.php

    <?php  
    namespace pdo_connect;
    // 数据库配置信息
    $config = require __DIR__."./database.php";
    extract($config);
    
    $dsn = sprintf("%s:host=%s;dbname=%s",$type,$host,$dbname);
    try{
    	// 可选,设置错误提示级别为WARNING
        $params = [\PDO::ATTR_ERRMODE=>\PDO::ERRMODE_WARNING];
    	$pdo = new \PDO($dsn,$username,$password,$params);
    }catch(Exception $e){
        die('数据库连接失败:'.$e -> getMessage());
    }
    ?>
    

    浏览效果:



    浏览链接:

    • 登录:http://www.zhsh520.com/admin/login/login.html

    • 注册:http://www.zhsh520.com/admin/regist/regist.html

    展开全文
  • 本文介绍了基于面向对象技术的组态软件实时数据库系统的设计思想,在面向对象思想指导下,针对实时数据库特点,提出一种利用设计模式缓存数据的方法,提高了访问效率;给出实时数据库和其他应用的接口实现方式和...
  • 1.面向对象程序设计的基本思想是什么 它的主要特点是什么 答案要点: 面向对象程序设计的基本思想是封装和可扩展性. 封装的特点面向对象程序设计就是把数据结构和数据结构上的操作算法封装在一个对象之中. 对象是...

    【数据库原理及应用】经典题库附答案(14章全)——第一章:数据库基础知识
    【数据库原理及应用】经典题库附答案(14章全)——第二章:关系数据库知识
    【数据库原理及应用】经典题库附答案(14章全)——第三章:结构化查询语言SQL
    【数据库原理及应用】经典题库附答案(14章全)——第四章:关系系统及其优化
    【数据库原理及应用】经典题库附答案(14章全)——第五章:关系数据理论
    【数据库原理及应用】经典题库附答案(14章全)——第六章:关系数据库设计过程
    【数据库原理及应用】经典题库附答案(14章全)——第七章:数据库恢复技术
    【数据库原理及应用】经典题库附答案(14章全)——第八章:数据库并发控制
    【数据库原理及应用】经典题库附答案(14章全)——第九章:数据库安全性
    【数据库原理及应用】经典题库附答案(14章全)——第十章:数据库完整性
    【数据库原理及应用】经典题库附答案(14章全)——第十二章:数据库技术新发展
    【数据库原理及应用】经典题库附答案(14章全)——第十三章:面向对象程数据库系统
    【数据库原理及应用】经典题库附答案(14章全)——第十四章:分布式数据库系统


    1.面向对象程序设计的基本思想是什么 它的主要特点是什么

    答案要点:
    面向对象程序设计的基本思想是封装和可扩展性.
    封装的特点:
    面向对象程序设计就是把数据结构和数据结构上的操作算法封装在一个对象之中.
    对象是以对象名封装的数据结构和可施加在这些数据上的私有操作.对象的数据结构描述了对象的状态,对象的操作是对象的行为.
    面向对象程序设计中,操作名列在封装对象的界面上,当其他对象要启动它的某个操作时,以操作名发一条消息,该对象接受消息,操作动作起来,完成对私有数据的加工.当一个面向对象的程序运行完毕时,各对象也就达到了各自的终态.输入,输出也由对象自己完成.
    这种全封装的计算实体给软件带来了模块性,安全性等显著优点.因为它基本没有数据耦合,对象间没有因操作而产生的边界效应,出了错可以很快找到原因,所以易于维护和修改.
    可扩展性的特点:
    面向对象程序设计的可扩展性体现在继承性和行为扩展两个方面.
    因为对象具有一种层次关系.每个对象可以有子对象.子对象可以继承父对象(及其祖先对象)的数据结构和操作,继承的部分就可以重用.
    另一方面子对象还可以增加新的数据结构和新的操作.新增加的部分就是子对象对父对象发展的部分.
    面向对象程序设计的行为扩展是指可以方便地增加程序代码来扩展对象的行为而不会影响该对象上的其他操作.

    2.定义并解释OO模型中以下核心概念: 对象与对象标识,封装,类,类层次.

    答案要点:
    1)对象与对象标识OID
    现实世界的任一实体被模型化为一个对象,每个对象有一个唯一的标识,称为对象标识.
    2)封装
    每一个对象是其状态与行为的封装,其中状态是该对象一系列属性值的集合,而行为是在对象状态上操作的集合,操作也称为方法.
    3)类
    共享同样属性和方法集的所有对象构成了一个对象类简称类,一个对象是某一类的一个实例.类的属性的定义域可以是任何类,即可以是基本类也可以是包含属性和方法的一般类,还也可是这个类自身.
    4)类层次
    在一个面向对象数据库模式中,可以定义一个类(如C1)的子类(如C2),类C1称为类C2的超类(或父类).子类(如C2)还可以再定义子类(如C3).这样,面向对象数据库模式的一组类形成一个有限的层次结构,称为类层次.

    3.OO模型中对象标识与关系模型中的"码"有什么区别

    答案要点:
    对象标识具有永久持久性.一个对象一经产生系统就给它赋于一个在全系统中唯一的对象标识符,直到它被删除.对象标识是由系统统一分配的,用户不能对对象标识符进行修改.对象标识是稳定的,独立于值的,它不会因为对象中某个值的修改而改变.
    关系模型中的"码"是值标识,不具有永久持久性,只具有程序内持久性.码是由用户建立的,用来区分关系的不同元组.

    4.什么是单继承 什么是多重继承 继承性有什么优点

    答案要点:
    若一个子类只能继承一个超类的特性(包括属性,方法和消息),这种继承称为单继承;若一个子类能继承多个超类的特性,这种继承称为多重继承.
    继承性优点:
    1)它是建模的有力工具,提供了对现实世界简明而精确的描述.
    2)它提供了信息重用机制.由于子类可以继承超类的特性,这就可以避免许多重复定义.

    5.什么是操作的重载 在OODB中为什么要滞后联编

    答案要点:
    在OO模型中对于同一个操作,可以按照类的不同,重新定义操作的实现,这称为操作的重载.这样,同一个操作名就与不同的实现方法,与不同的参数相联系.
    为了提供这个功能,OODBMS不能在编译时就把操作名联编到程序上,必须在运行时根据实际请求中的对象类型和操作来选择相应的程序,把操作名与它联编上(即把操作名转换成该程序的地址),这个推迟的转换称为滞后联编.

    6.什么是OODB模式演进 为什么面向对象数据库模式的修改要比关系模式的修改复杂得多

    答案要点:
    面向对象数据库模式是类的集合.模式为适应需求的变化会随着时间而变化,这称为模式演进.模式演进包括创建新的类,删除旧的类,修改类的属性和操作等.
    面向对象数据库模式的修改要比关系模式的修改复杂的原因是:
    1)模式改变频繁
    使用OODB系统的应用通常需要频繁地改变OODB数据库模式.例如OODB经常运用于工程设计环境中,设计环境特征之一就是不断变化.
    2)模式修改复杂
    OO模型具有很强的建模能力和丰富的语义,包括类本身的语义,类属性之间和类之间丰富的语义联系,这使得模式修改操作的类型复杂多样.
    3)OODB中模式演进往往是动态的,使得实现技术更加复杂.

    7.什么是对象-关系数据库 它的主要特点是什么 常用的实现方法有哪些

    答案要点:
    对象-关系数据库系统是将关系数据库系统与面向对象数据库系统两方面的特征相结合,不仅支持核心的面向对象数据模型,而且支持传统数据库系统所具有的特征.

    主要特点有:
    1)具有原来关系数据库的各种特点;
    2)扩充数据类型;
    3)支持复杂对象;
    4)支持继承的概念;
    5)提供通用的规则系统;

    实现对象-关系数据库系统的方法主要有以下五类.

    1)从头开发对象-关系DBMS.
    2)在现有的关系型DBMS基础上进行扩展.扩展方法有两种:
    a)对关系型DBMS核心进行扩充,逐渐增加对象特性.
    b)不修改现有的关系型DBMS核心,而是在现有关系型DBMS外面加一个包装层.
    3)将现有的关系型DBMS与其他厂商的对象-关系型DBMS连接在一起,使现有的关系型DBMS直接而迅速地具有了对象-关系特征.连接方法主要有两种:

    a)关系型DBMS使用网关技术与其他厂商的对象-关系型DBMS连接.
    b)将对象-关系型引擎与关系型存储管理器结合起来,即以关系型DBMS作为系统的最底层,对象-关系型系统作为上层.
    4)将现有的OO型DBMS与其他厂商的对象-关系型DBMS连接在一起,使现有的面向对象型DBMS直接而迅速地具有了对象-关系特征.
    5)扩充现有的面向对象的DBMS,使之成为对象-关系型DBMS.

    展开全文
  • 采用Window下面向对象的程序设计语言Visual Basic和面向对象数据库管理开发系统Access开发出具有Window风格的监测信息数据库管理系统。以五强溪水电站左岸船闸边坡为例,介绍系统的特点和程序的功能。
  • Python是完全面向对象的语言 Python拥有一个强大的标准库 Python社区提供了大量的第三方模块,使用方式与标准库类似。它们的功能覆盖科学计算、人工智能、机器学习、Web开发、数据库接口、图形系统多个领域 面向对...
  • 面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是...
  • 2.数据库特点:海量存储、查找速度快、并发性问题控制、安全性、数据完整性(保存在数据库中的数据是正确的、真是的) 3.数据库管理软件:SQL Server Management System 数据库软件:SWL Server以服务的方式...
  • 面向对象(Object Oriented ,OO)它是一种设计思想,现在这种思想已经不单应用在软件设计上,数据库设计、计算机辅助设计(CAD)、网络结构设计、人工智能算法设计等领域都开始应用这种思想。 针对面向对象思想应用的...
  • 面向对象

    2016-07-28 09:41:00
    1.什么是对象? 对象是一个整体(相当于是一个盒子,对外是封闭的),对外提供了一些操作。...(1)面向对象编程(OOP)的特点  抽象:抓住核心问题(比如,把一个人填写表单提交到数据库,有用户名,密码...
  • oracle 面向对象测试

    2012-01-12 11:06:56
    关系数据库在不断地发展时,许多数据库引入了面向对象的思想,这其中以Oracle为代表,Oracle9i就号称面向对象数据库。 自Oracle9i以来,Oracle就不再是单纯的关系数据库管理系统,它在关系数据库模型的基础上,添加...
  • Oracle面向对象编程OOP

    千次阅读 2014-01-04 16:57:03
    Oracle9i就号称面向对象数据库。Oracle的对象体系遵从面向对象思想的基本特征,许多概念同C++,JAVA中类似,具有继承,重载,多态等特征,但又有自己的特点。  下面详细介绍下Oracle面向对象编程。 1 面向对象类型...
  • 面向过程和面向对象

    2021-04-15 20:08:28
    面向过程 — 怎么做? 流水线思维方式:传送带 手机举例。 手机制作的过程大致为:电子元件 - cpu - 内存 - ...面向对象 — 谁来做? 上帝式思维方式:万物皆对象 电脑、鼠标、键盘、水杯都是一个对象,每个对象都有
  • 数据库系统发展的特点一、数据模型的发展1. 面向对象数据模型2. XML数据模型3. RDF数据模型二、数据库技术与相关技术相结合 一、数据模型的发展 关系模型的提出是数据库发展史上具有划时代意义的重大事件。 数据库...
  • 面向对象的Oracle

    2008-01-22 13:45:00
    关系数据库在不断地发展时,许多数据库引入了面向对象的思想,这其中以Oracle为代表,Oracle9i就号称面向对象数据库。 自Oracle9i以来,Oracle就不再是单纯的关系数据库管理系统,它在关系数据库模型的基础上,添加...
  • Oracle中的面向对象OOP

    2013-01-29 13:48:42
    关系数据库在不断地发展时,许多数据库引入了面向对象的思想,这其中以Oracle为代表,Oracle9i就号称面向对象数据库。 自Oracle9i以来,Oracle就不再是单纯的关系数据库管理系统,它在关系数据库模型的基础上,添加...
  • 在学习完mysql库来操作mysql的方式,这是一种面向过程的方式,但是,面向对象是大势所趋,mysqli扩展库也就有必须学习的必要了,mysqli作为一个类库,在我们使用的时候都是以面向对象的方式进行操作,所以,这种方案...
  • 面向基于对象关系型数据库而构建的并行空间数据库系统,提出了一种基于Hilbert空间填充曲线的适合于矢量空间数据的数据划分算法。在充分考虑空间信息的海量特征以及矢量数据存储记录的不定长等特点的前提下,该算法...
  • 这是一篇总结了Java面向对象编程的文档 该文章详细的讲解了OOP中的知识点, 将大量概念整理整合于此 例如: 2. 类的结构: i. 属性:特征或者特点 ii. 方法:功能或者行为 内容大致包含: 面向对象的三大特性 2 ...
  • 面向对象的技术是当前计算机界所关心的重点,,面向对象的概念和应用已经扩展到很宽的范围,如面向对象数据库系统、面向对象的系统分析与设计、CAD 技术、人工智能以及其他广泛的应用范围。 目录 什么是面向对象...
  • 面向对象魔术方法

    2019-08-25 10:10:14
    特点:必须是public,不能是static,必须是字符串。 __construct(): 构造方法 执行时机:在使用 new关键字使用类实例化一个对象时自动...功能作用:通常用于释放对象占用的第三方资源(如:数据库) __tostring()...
  • 数据库简介

    2020-12-08 21:19:13
    数据库能干什么 持久的存储数据,数据存储在磁盘的文件中 备份和恢复数据 快速的存储数据 权限控制 ...数据库总共分为三种,关系型数据库,非关系型数据库和面向对象数据库等 数据库的术语 ...
  • 在分析分布式数据库系统的构成和特点的基础上,提出面向对象空间数据的表达方法,讨论了面向对象分布式空间数据库的构成,提出实现分布式空间数据共享的方法,设计了基于Oraclespatial环境的分布式空间数据集成模式...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,147
精华内容 858
关键字:

面向对象数据库特点