pdo
<?php /* PDO::ERRMODE_SILENT 默认模式,静默模式 PDO::ERRMODE_WARNING 警告模式 PDO::ERRMODE_EXCEPTION 异常模式 */ /* beginTransaction() 启动一个事务 commit() 提交一个事务 rollBack()回滚一个事务 inTransaction() 查看是否在事务内 */ //事务处理 try{ header('Content-Type:text/html; charset=utf-8'); //网页utf8 $pdo = new PDO ('mysql:host=localhost;dbname=test', 'test', '123456'); //连接数据库 $pdo->query("set names utf8"); //数据库utf8 //错误处理模式 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //关闭自动提交 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0); //开启事务 $pdo->beginTransaction(); $sql1 = "UPDATE userAccount SET money = money - 2000 WHERE username = 'boss'"; $sql2 = "UPDATE userAccount SET money = money + 2000 WHERE username = 'worker'"; $res1 = $pdo->exec($sql1); if($res1 == 0){ throw new PDOException('boss转账失败'); } $res2 = $pdo->exec($sql2); if($res2 == 0){ throw new PDOException('worker接受失败'); } //提交 $pdo->commit(); }catch(PDOException $e){ //回滚 $pdo->rollBack(); echo $e->getMessage(); } ?>
<?php $dbms='mysql'; //数据库类型 $host='localhost'; //数据库主机名 $dbName='imooc_o2o'; //使用的数据库 $user='root'; //数据库连接用户名 $pass=''; //对应的密码 $dsn="$dbms:host=$host;dbname=$dbName"; try { //第四各参数可省略 这里是长连接+错误模式为不现实错误 1为抛出警告 2为抛出异常 //PDO::ATTR_ERRMODE=>0 也可以写作PDO::ATTR_ERRMODE=>PDO::ERRMODE_SIENT //也可以单独设置: ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true,PDO::ATTR_ERRMODE=>2)); //初始化一个PDO对象 echo "连接成功<br/>"; } catch (PDOException $e) { die ("Error!: " . $e->getMessage() . "<br/>"); } try{ $sql='SELECT * from o2o_user WHERE id<11'; $res=$pdo->query($sql); /* foreach ($res as $key => $row) { print_r($row); //你可以用 echo($GLOBAL); 来看到这些值 //打印出来后数据就从内存中释放出来啦所以下面在用fetchAll的话数组是空的 } */ //我们可以改变默认的数据提取模式 设置之后默认的PDO::FETCH_BOTH变成PDO::FETCH_ASSOC啦 $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $data=$res->fetchAll();//返回二维数组 $time=time(); $sql="update o2o_user SET mobile='15632613871',update_time={$time} WHERE id=11"; $res=$pdo->exec($sql);//成功返回行数 //事物 //使用事务之前,要先关闭自动提交。不关闭的话,出现异常的时候没法回滚。 //据手册描述,ATTR_AUTOCOMMIT属性只在mysql,OCI(oracle),firebird三种数据库中可用 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);//关闭事物自动提交功能 不加这个也一样可以回滚!不明白? $pdo->beginTransaction();//开启事务 $stmt=$pdo->prepare("update money SET money=money-? WHERE id=?"); /*-------------------------?第一种绑定方式--------------------------------------------- $data1=[1000,1]; $res1=$stmt->execute($data1);//成功返回行数 -------------------------------------------------------------------------------------*/ /*-------------------------?第二种绑定方式--------------------------------------------- $stmt->bindvalue(1,1000);//这里的1代表第一个? $stmt->bindvalue(2,1);////这里的2代表第二个? $res1=$stmt->execute(); -------------------------------------------------------------------------------------*/ /*---------------------------?第三种绑定方式-----------------------------------------*/ $num=1000;//由于是bindParam绑定参数的形式所以这个变量在哪申明都行就是不能在execute以下 $id=1; $stmt->bindParam(1,$num,PDO::PARAM_INT); $stmt->bindParam(2,$id,PDO::PARAM_INT); $res1=$stmt->execute(); $stmt=$pdo->prepare("update money SET money=money+:num WHERE id=:id"); /*---------------------------:第一种绑定方式------------------------------------------- $data2=['num'=>1000,'id'=>2];//与?不同的是这里必须是关联数组 $res2=$stmt->execute($data2);//成功返回行数 -------------------------------------------------------------------------------------*/ /*---------------------------:第二种绑定方式------------------------------------------- $stmt->bindvalue(':num',1000);//这里不再是代表第几个参数的索引而是预处理的值代替 $stmt->bindvalue(':id',2); $res2=$stmt->execute(); -------------------------------------------------------------------------------------*/ /*---------------------------:第三种绑定方式-----------------------------------------*/ $num = 1000; $id = 2; $stmt->bindParam(':num', $num,PDO::PARAM_INT); $stmt->bindParam(':id', $id,PDO::PARAM_INT); $res2=$stmt->execute();//成功返回行数 /*-----------------------------------------------------------------------------------*/ if ($res1>0 && $res2>0) { echo $res1.$res2; }elseif($res1==0){ throw new PDOException("转账失败"); }elseif($res2==0){ throw new PDOException("转账失败"); }else{ throw new PDOException("未知错误"); } $pdo->commit(); $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1); $pdo = null; }catch(PDOException $e){ $pdo->rollBack(); die ("Error!: " . $e->getMessage() . "<br/>"); } /* PDO::beginTransaction — 启动一个事务 PDO::commit — 提交一个事务 PDO::rollBack — 回滚一个事务 PDO::inTransaction — 检查是否在一个事务内 PDO::errorCode — 获取错误码 PDO::errorInfo — 返回数组形式的错误信息 PDO::exec — 增删改的执行方法,并返回受影响的行数 PDO::query — 查询语句的执行方法 返回PDOstatement对象 PDO::lastInsertId — 返回最后插入行的ID或序列值 PDO::prepare — 预处理sql语句 返回PDOstatement对象 PDO::quote — 返回添加引号后的字符串—将sql手动转义. PDO::getAttribute — 取回一个数据库连接的属性 PDO::setAttribute — 设置数据库连接的属性 PDO::getAvailableDrivers — 返回一个可用驱动的数组 PDO::__construct — 创建一个表示数据库连接的 PDO 实例 PDOstatement的方法:注意只有query和prepare才能用下面的方法: execute() 执行一条预处理语句 bindparam(标志符,变量,类型常量) 绑定一个参数到变量名 bindvalue(参数标志符,变量,类型常量) 把一个值绑定到参数 fetch(类型常量) 以类型常量指定的格式返回一条记录 fetchAll(类型常量) 以类型常量指定的格式返回所有记录 fetchColumn(index) 返回指定索引的单独一列 rowCount() 获取查询数据总条数 bindColumn(列名/号,变量,类型常量) 绑定一个列(字段)到一个php变量 columnCount() 返回结果集中的列数 debugDumpParams() 打印一条sql预处理语句 columnCount() 返回结果集中的列数 debugDumpParams() 返回错误代码 errorCode() 返回数组形式的错误信息 errorInfo() 返回一个语句属性 getAttribute(属性) 返回一个语句属性 setAttribute(属性,属性值) 设置一个属性值 fetchObject(返回对象的类名,传递构造函数的数组) 从结果集中返回一行数据帮作为对象返回 closeCursor() 关闭游标使语句能被再次执行 getColumnMeta(index) 返回结果中指定一行的元数据 nextRowset() 再一个多行集语句句柄中推进到下一个行集 setFetchMode()为语句设置默认的获取方式 PDOException 属性 errorinfo 异常信息 message 用户自定义异常代码 code 发生异常的代码行号 方法 getMessage() 返回异常信息 getPrevious() 返回异常链中的前一个异常 getCode() 返回异常代码号 getFile() 返回反生异常的文件 getLine() 返回发生异常的行号 getTrace() 获取异常追踪信息 getTraceString() 以格式化成字符串的getTrace()信息 静态 __toString() 可输出的字符串 __clone() */ /* 预定义常量 PDO::PARAM_BOOL (integer) 表示布尔数据类型。 PDO::PARAM_NULL (integer) 表示 SQL 中的 NULL 数据类型。 PDO::PARAM_INT (integer) 表示 SQL 中的整型。 PDO::PARAM_STR (integer) 表示 SQL 中的 CHAR、VARCHAR 或其他字符串类型。 PDO::PARAM_LOB (integer) 表示 SQL 中大对象数据类型。 PDO::PARAM_STMT (integer) 表示一个记录集类型。当前尚未被任何驱动支持。 PDO::PARAM_INPUT_OUTPUT (integer) 指定参数为一个存储过程的 INOUT 参数。必须用一个明确的 PDO::PARAM_* 数据类型跟此值进行按位或。 PDO::FETCH_LAZY (integer) 指定获取方式,将结果集中的每一行作为一个对象返回,此对象的变量名对应着列名。PDO::FETCH_LAZY 创建用来访问的对象变量名。在 PDOStatement::fetchAll() 中无效。 PDO::FETCH_ASSOC (integer) 指定获取方式,将对应结果集中的每一行作为一个由列名索引的数组返回。如果结果集中包含多个名称相同的列,则PDO::FETCH_ASSOC每个列名只返回一个值。 PDO::FETCH_NAMED (integer) 指定获取方式,将对应结果集中的每一行作为一个由列名索引的数组返回。如果结果集中包含多个名称相同的列,则PDO::FETCH_ASSOC每个列名 返回一个包含值的数组。 PDO::FETCH_NUM (integer) 指定获取方式,将对应结果集中的每一行作为一个由列号索引的数组返回,从第 0 列开始。 PDO::FETCH_BOTH (integer) 指定获取方式,将对应结果集中的每一行作为一个由列号和列名索引的数组返回,从第 0 列开始。 PDO::FETCH_OBJ (integer) 指定获取方式,将结果集中的每一行作为一个属性名对应列名的对象返回。 PDO::FETCH_BOUND (integer) 指定获取方式,返回 TRUE 且将结果集中的列值分配给通过 PDOStatement::bindParam() 或 PDOStatement::bindColumn() 方法绑定的 PHP 变量。 PDO::FETCH_COLUMN (integer) 指定获取方式,从结果集中的下一行返回所需要的那一列。 PDO::FETCH_CLASS (integer) 指定获取方式,返回一个所请求类的新实例,映射列到类中对应的属性名。 注意: 如果所请求的类中不存在该属性,则调用 __set() 魔术方法 PDO::FETCH_INTO (integer) 指定获取方式,更新一个请求类的现有实例,映射列到类中对应的属性名。 PDO::FETCH_FUNC (integer) 允许在运行中完全用自定义的方式处理数据。(仅在 PDOStatement::fetchAll() 中有效)。 PDO::FETCH_GROUP (integer) 根据值分组返回。通常和 PDO::FETCH_COLUMN 或 PDO::FETCH_KEY_PAIR 一起使用。 PDO::FETCH_UNIQUE (integer) 只取唯一值。 PDO::FETCH_KEY_PAIR (integer) 获取一个有两列的结果集到一个数组,其中第一列为键名,第二列为值。自 PHP 5.2.3 起可用。 PDO::FETCH_CLASSTYPE (integer) 根据第一列的值确定类名。 PDO::FETCH_SERIALIZE (integer) 类似 PDO::FETCH_INTO ,但是以一个序列化的字符串表示对象。自 PHP 5.1.0 起可用。从 PHP 5.3.0 开始,如果设置此标志,则类的构造函数从不会被调用。 PDO::FETCH_PROPS_LATE (integer) 设置属性前调用构造函数。自 PHP 5.2.0 起可用。 PDO::ATTR_AUTOCOMMIT (integer) 如果此值为 FALSE ,PDO 将试图禁用自动提交以便数据库连接开始一个事务。 PDO::ATTR_PREFETCH (integer) 设置预取大小来为你的应用平衡速度和内存使用。并非所有的数据库/驱动组合都支持设置预取大小。较大的预取大小导致性能提高的同时也会占用更多的内存。 PDO::ATTR_TIMEOUT (integer) 设置连接数据库的超时秒数。 PDO::ATTR_ERRMODE (integer) 关于此属性的更多信息请参见 错误及错误处理 部分。 PDO::ATTR_SERVER_VERSION (integer) 此为只读属性;返回 PDO 所连接的数据库服务的版本信息。 PDO::ATTR_CLIENT_VERSION (integer) 此为只读属性;返回 PDO 驱动所用客户端库的版本信息。 PDO::ATTR_SERVER_INFO (integer) 此为只读属性。返回一些关于 PDO 所连接的数据库服务的元信息。 PDO::ATTR_CONNECTION_STATUS (integer) PDO::ATTR_CASE (integer) 用类似 PDO::CASE_* 的常量强制列名为指定的大小写。 PDO::ATTR_CURSOR_NAME (integer) 获取或设置使用游标的名称。当使用可滚动游标和定位更新时候非常有用。 PDO::ATTR_CURSOR (integer) 选择游标类型。 PDO 当前支持 PDO::CURSOR_FWDONLY 和 PDO::CURSOR_SCROLL。一般为 PDO::CURSOR_FWDONLY,除非确实需要一个可滚动游标。 PDO::ATTR_DRIVER_NAME (string) 返回驱动名称。 使用 PDO::ATTR_DRIVER_NAME 的例子: <?php if (->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') { echo "Running on mysql; doing something mysql specific here\n"; } ?> PDO::ATTR_ORACLE_NULLS (integer) 在获取数据时将空字符串转换成 SQL 中的 NULL 。 PDO::ATTR_PERSISTENT (integer) 请求一个持久连接,而非创建一个新连接。关于此属性的更多信息请参见 连接与连接管理 。 PDO::ATTR_STATEMENT_CLASS (integer) PDO::ATTR_FETCH_CATALOG_NAMES (integer) 将包含的目录名添加到结果集中的每个列名前面。目录名和列名由一个小数点分开(.)。此属性在驱动层面支持,所以有些驱动可能不支持此属性。 PDO::ATTR_FETCH_TABLE_NAMES (integer) 将包含的表名添加到结果集中的每个列名前面。表名和列名由一个小数点分开(.)。此属性在驱动层面支持,所以有些驱动可能不支持此属性。 PDO::ATTR_STRINGIFY_FETCHES (integer) PDO::ATTR_MAX_COLUMN_LEN (integer) PDO::ATTR_DEFAULT_FETCH_MODE (integer) 设置默认的提取模式 自 PHP 5.2.0 起可用。 PDO::ATTR_EMULATE_PREPARES (integer) 自 PHP 5.1.3 起可用。 PDO::ERRMODE_SILENT (integer) 0如果发生错误,则不显示错误或异常。希望开发人员显式地检查错误。此为默认模式。 PDO::ERRMODE_WARNING (integer) 1如果发生错误,则显示一个 PHP E_WARNING 消息。 PDO::ERRMODE_EXCEPTION (integer) 2如果发生错误,则抛出一个 PDOException 异常。 PDO::CASE_NATURAL (integer) 保留数据库驱动返回的列名。 PDO::CASE_LOWER (integer) 强制列名小写。 PDO::CASE_UPPER (integer) 强制列名大写。 PDO::NULL_NATURAL (integer) PDO::NULL_EMPTY_STRING (integer) PDO::NULL_TO_STRING (integer) PDO::FETCH_ORI_NEXT (integer) 在结果集中获取下一行。仅对可滚动游标有效。 PDO::FETCH_ORI_PRIOR (integer) 在结果集中获取上一行。仅对可滚动游标有效。 PDO::FETCH_ORI_FIRST (integer) 在结果集中获取第一行。仅对可滚动游标有效。 PDO::FETCH_ORI_LAST (integer) 在结果集中获取最后一行。仅对可滚动游标有效。 PDO::FETCH_ORI_ABS (integer) 根据行号从结果集中获取需要的行。仅对可滚动游标有效。 PDO::FETCH_ORI_REL (integer) 根据当前游标位置的相对位置从结果集中获取需要的行。仅对可滚动游标有效。 PDO::CURSOR_FWDONLY (integer) 创建一个只进游标的 PDOStatement 对象。此为默认的游标选项,因为此游标最快且是 PHP 中最常用的数据访问模式。 PDO::CURSOR_SCROLL (integer) 创建一个可滚动游标的 PDOStatement 对象。通过 PDO::FETCH_ORI_* 常量来控制结果集中获取的行。 PDO::ERR_NONE (string) 对应 SQLSTATE '00000',表示 SQL 语句没有错误或警告地成功发出。当用 PDO::errorCode() 或 PDOStatement::errorCode() 来确定是否有错误发生时,此常量非常方便。在检查上述方法返回的错误状态代码时,会经常用到。 PDO::PARAM_EVT_ALLOC (integer) 分配事件 PDO::PARAM_EVT_FREE (integer) 解除分配事件 PDO::PARAM_EVT_EXEC_PRE (integer) 执行一条预处理语句之前触发事件。 PDO::PARAM_EVT_EXEC_POST (integer) 执行一条预处理语句之后触发事件。 PDO::PARAM_EVT_FETCH_PRE (integer) 从一个结果集中取出一条结果之前触发事件。 PDO::PARAM_EVT_FETCH_POST (integer) 从一个结果集中取出一条结果之后触发事件。 PDO::PARAM_EVT_NORMALIZE (integer) 在绑定参数注册允许驱动程序正常化变量名时触 */