前面叁个学PHP之PDO预管理语句

前方的话

  本来要把预处理语句和前边的根基操作写成一篇的。可是,由于博客园的范围,恐怕是因为长度超越,保存时老是报错,于是再开一篇。另一方面,相较于前方的exec语句来讲,预管理语句特别常用

定义

  在改造网页时,很多PHP脚本经常都会进行除参数之外,其余一些一模二样的询问语句,针对这种重新实行多个查询,每一次迭代接纳分歧的参数情形,PDO提供了一种名称为预管理语句(prepared
statement)的体制。它能够将全方位SQL命令向数据库服务器发送三回,以往独有参数产生变化,数据库服务器只需对命令的协会做三次深入分析就够了,即编译贰次,能够频频实践。会在服务器上缓存查询的说话和实行进程,而只在服务器和客商端之间传输有变化的列值,以此来祛除那么些额外的支出。那不单大大裁减了索要传输的数据量,还提升了命令的拍卖效用。能够有效防御SQL注入,在推行单个查询时快于直接行使query的章程,速度快且安全,推荐应用

  PDO对预管理语句的支撑须求动用PDOStatement类对象,但此类的目的实际不是透过NEW关键字实例化出来的,而是经超过实际行PDO对象的prepare()方法,在数据库服务器中希图好三个预管理的SQL语句后一向回到的。借使由那件事施夷光行PDO对象的query()方法再次回到的PDOStatement类对象,只表示的是二个结果集对象。而一旦经超过实际行PDO对象中的prepare()方法爆发的PDOStatement类对象,则为三个询问对象,能定义和举办参数化的SQL命令

预备语句

  重复推行贰个SQL查询,通过每趟迭代利用不一致的参数,这种状态采取预管理语句运营效用最高。使用预管理语句,首先要求在数据库服务器中先计划好“三个SQL语句”,但并无需立即实行。PDO帮衬使用“占位符”语法,将变量绑定到这几个预管理的SQL语句中。别的,PDO差相当少为所帮助的保有数据库提供了指令占位符模拟,以至足感到生来就不帮助该概念的数据库模拟预管理语句和绑定参数。那是PHP向前迈进的主动一步,因为这么能够使开垦职员能够用PHP编写“集团级”的数据库应用程序,而不要专程关爱数据库平台的本领

  对于多少个预备好的SQL语句,假设在每便推行时都要改成一些列值,这种意况必需利用“占位符”而不是现实的列值,大概只要有亟待利用变量作为值的地方,就先使用占位符取代,筹算好三个不曾传值的SQL语句,在数据库服务器的缓存区等待管理,然后再去单独赋给占位符具体的值,再经过这些计划好的预管理语句实践。在PDO中有三种接纳占位符的语法:“命令参数”和“问号参数”,使用哪个种类语法看个人的喜好

  使用命名参数作为占位符的INSERT查询如下所示:

$dbh->prepare("INSERT INTO contactInto(name,address,phone)VALUES (:name,:address,:phone)");

  必要自定义二个字符串作为“命名参数”,每种命名参数要求冒号开头,参数的命名必须要有意义,最棒和相应的字段名称一致

  使用问号参数作为占位符的INSERT查询如下所示:

$dbh->prepare("INSERT INTO contactInfo(name,address,phone) VALUES ;

  问号参数一定要和字段的地方顺序对应,不管是应用哪种参数作为占位符构成的查询,或是语句中从未用到占位符,都亟待使用PDO对象中的prepare()方法,去盘算这么些就要用于迭代试行的询问,并赶回PDOStatement类对象

绑定参数

  当SQL语句通过PDO对象中的prepare()方法,在数据库服务器端希图好未来,要是选择了占位符,就须求在历次实践时替换输入的参数。能够通过PDOStatement对象中的bindParam()方法,把参数变量绑定到企图好的占位符上。方法bindParame()的原型如下所示:

bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )

  绑定四个PHP变量到用作预管理的SQL语句中的对应命名占位符或问号占位符。差异于
PDOStatement::bindValue(),此变量作为援引被绑定,并只在PDOStatement::execute()被调用的时候才取其值

  parameter表示参数标记符。对于利用命名占位符的预管理语句,应是附近:name情势的参数名。对于利用问号占位符的预管理语句,应是以1起先索引的参数地点

  variable表示绑定到 SQL 语句参数的 PHP 变量名

  data_type代表使用PDO::PARAM_*常量分明地钦赐参数的项目。要从二个存储进度中回到二个INOUT参数,须求为data_type参数使用按位或操作符去设置PDO::PARAM_INPUT_OUTPUT位,可感觉以下值

PDO:PARAM_BOOL:表示boolean数据类型PDO:PARAM_NULL:表示NULL数据类型PDO:PARAM_INT:表示INT数据类型PDO:PARAM_STR:表示字符串数据类型PDO:PARAM_LOB:表示大对象数据类型

  length代表数据类型的长短。为标记参数是一个积累进程的OUT参数,必需明确地设置此尺寸

  使用bindParam()方法分别绑定上相应的参数。查询中央银行使名字参数的绑定如下所示

$query = "INSERT INTO contactInfo (name,address,phone) VALUES (:name,:address,:phone)";$stmt = $dbh->prepare($query);$stmt->bindParam(":name",$name);$stmt->bindParam(":address",$address);$stmt->bindParam(":phone",$phone);$name = '爱新觉罗';$address = '东城';$phone = '88888';

  查询中使用问号?参数的绑定如下所示

$query = "INSERT INTO contactInfo (name,address,phone) VALUES ";$stmt = $dbh->prepare($query);$stmt->bindParam("1",$name);$stmt->bindParam("2",$address);$stmt->bindParam("3",$phone);$name = '司马';$address = '西城';$phone = '666';

试行查询

  当盘算好查询并绑定了对应的参数后,就能够通过调用PDOStatement类对象中的execute()方法,每每实行在数据库缓存区计划好的语句了。在上边包车型大巴言传身教中,向前边提供的contactInfo表中,使用预处理方式一连实行同叁个INSERT语句,通过改换差异的参数增加两条记下

<?phptry {    //创建对象    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "***");}catch(PDOException $e) {    echo "数据库连接失败:".$e->getMessage();    exit;}$query = "INSERT INTO contactInfo (name,address,phone) VALUES ";$stmt = $dbh->prepare($query);$stmt->bindParam("1",$name);$stmt->bindParam("2",$address);$stmt->bindParam("3",$phone);$name = '司马';$address = '西城';$phone = '666';$stmt->execute();$name = '曹操';$address = '平谷';$phone = '1';$stmt->execute();?>

图片 1

<?phptry {    //创建对象    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "***");}catch(PDOException $e) {    echo "数据库连接失败:".$e->getMessage();    exit;}$query = "INSERT INTO contactInfo (name,address,phone) VALUES (:name,:address,:phone)";$stmt = $dbh->prepare($query);$stmt->bindParam(":name",$name);$stmt->bindParam(":address",$address);$stmt->bindParam(":phone",$phone);$name = '爱新觉罗';$address = '东城';$phone = '88888';$stmt->execute();?>

图片 2

  假诺只是要传送输入参数,而且有好些个这么的参数要传递,那么通过在execute()方法中提供三个可选参数,该参数是由谋算查询中的命名参数占位符组成的数组,那是第三种为预管理查询在执行中替换输入参数的措施。此语法能够活动对bindParam()的调用

<?phptry {    //创建对象    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "***");}catch(PDOException $e) {    echo "数据库连接失败:".$e->getMessage();    exit;}$query = "INSERT INTO contactInfo (name,address,phone) VALUES ";$stmt = $dbh->prepare($query);$stmt->execute(array("张飞",'延庆','3'));$query = "INSERT INTO contactInfo (name,address,phone) VALUES (:name,:address,:phone)";$stmt = $dbh->prepare($query);$stmt->execute(array(":name"=>"关羽",":address"=>"密云",":phone"=>"2"));?>

图片 3

  假如实践的是INSERT语句,並且数据表有活动增加的ID字段,能够选用PDO对象中的lastInsertId()方法获得最终插入数据表中的笔录ID。如若急需查阅别的DML语句是还是不是执行成功,能够透过PDOStatement类对象中的rowCount()方法赢得影响记录的行数

<?phptry {    //创建对象    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "***");}catch(PDOException $e) {    echo "数据库连接失败:".$e->getMessage();    exit;}$query = "INSERT INTO contactInfo (name,address,phone) VALUES ";$stmt = $dbh->prepare($query);$stmt->execute(array("孙权",'通州','123456'));echo $dbh->lastInsertId();$query = "UPDATE contactInfo SET name=? WHERE uid=?";$stmt = $dbh->prepare($query);$stmt->execute(array("天使","6"));echo $stmt->rowCount();//1$query = "DELETE FROM contactInfo  WHERE name= ?";$stmt = $dbh->prepare($query);$stmt->execute(["孙权"]);echo $stmt->rowCount();//11?>

图片 4

获取数据

  PDO的数额获得格局与别的数据库增加都分外左近,只要成功实践SELECT查询,都会有结果集对象生成。不管是采纳PDO对象中的query()方法,依然选取prepare()和execute()等方式结合的预管理语句,实施SELECT查询都会猎取平等的结果集对象PDOStatement,都亟需经过PDOStatement类对象中的方法将数据遍历出来

fetch()

  PDOStatement类中的fetch()方法可以将结果聚集当前行的记录以某种情势赶回,并将结果集指针移到下一行,当到达结果集末尾时重返FALSE,该措施的原型如下:

mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )

  第三个参数fetch_style,用于调控下一行怎么着回到给调用者。此值必得是
PDO::FETCH_* 多元常量中的三个,缺省为 PDO::ATT奇骏_DEFAULT_FETCH_MODE
的值(默认为 PDO::FETCH_BOTH)

PDO::FETCH_ASSOC:返回一个索引为结果集列名的数组PDO::FETCH_BOTH:返回一个索引为结果集列名和以0开始的列号的数组PDO::FETCH_BOUND:返回 TRUE ,并分配结果集中的列值给 PDOStatement::bindColumn() 方法绑定的 PHP 变量。PDO::FETCH_CLASS:返回一个请求类的新实例,映射结果集中的列名到类中对应的属性名。如果 fetch_style 包含 PDO::FETCH_CLASSTYPE(例如:PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE),则类名由第一列的值决定PDO::FETCH_INTO:更新一个被请求类已存在的实例,映射结果集中的列到类中命名的属性PDO::FETCH_LAZY:结合使用PDO::FETCH_BOTH和PDO::FETCH_OBJ,创建供用来访问的对象变量名PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组PDO::FETCH_OBJ:返回一个属性名对应结果集列名的匿名对象

  第三个参数cursor_orientation代表对此一个PDOStatement对象表示的可滚动游标,该值决定了哪一行将被重临给调用者。此值必需是
PDO::FETCH_ORI_* 多元常量中的三个,默以为PDO::FETCH_ORI_NEXT。要想让 PDOStatement 对象使用可滚动游标,必需在用
PDO::prepare() 预管理SQL语句时,设置 PDO::ATT景逸SUV_CURSOR 属性为
PDO::CURSOR_SCROLL

  第2个参数offset表示对于三个cursor_orientation参数设置为PDO::FETCH_ORI_ABS的PDOStatement对象表示的可滚动游标,此值钦点结果聚焦想要获取行的相对行号

  对于八个 cursor_orientation 参数设置为 PDO::FETCH_ORI_REL
的PDOStatement 对象表示的可滚动游标,此值钦命想要获取行相对于调用
PDOStatement::fetch() 前游标的地点

<?phptry {    //创建对象    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "***");}catch(PDOException $e) {    echo "数据库连接失败:".$e->getMessage();    exit;}$query = "SELECT uid,name,address,phone,email FROM contactInfo";$stmt = $dbh->prepare($query);$stmt->execute();//Array ( [uid] => 1 [0] => 1 [name] => 张三 [1] => 张三 [address] => 朝阳 [2] => 朝阳 [phone] => 123 [3] => 123 [email] => zs@aaa.com [4] => zs@aaa.com ) print_r($stmt->fetch;echo "<br>";//Array ( [uid] => 2 [0] => 2 [name] => 李四 [1] => 李四 [address] => 朝阳 [2] => 朝阳 [phone] => 123456789 [3] => 123456789 [email] => ls@aaa.com [4] => ls@aaa.com ) print_r($stmt->fetch;echo "<br>";?>

<?phptry {    //创建对象    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "***");}catch(PDOException $e) {    echo "数据库连接失败:".$e->getMessage();    exit;}$query = "SELECT uid,name,address,phone,email FROM contactInfo";$stmt = $dbh->prepare($query);$stmt->execute();/*Array ( [0] => 1 [1] => 张三 [2] => 朝阳 [3] => 123 [4] => zs@aaa.com ) Array ( [0] => 2 [1] => 李四 [2] => 朝阳 [3] => 123456789 [4] => ls@aaa.com ) Array ( [0] => 3 [1] => 王五 [2] => 海淀 [3] => 15011113456 [4] => ww@aaa.com ) Array ( [0] => 4 [1] => 赵四 [2] => 海淀 [3] => 123456789 [4] => zx@aaa.com ) Array ( [0] => 5 [1] => 诸葛 [2] => [3] => 120120120 [4] => zg@aaa.com ) Array ( [0] => 6 [1] => 天使 [2] => [3] => 222 [4] => zg2@aaa.com ) Array ( [0] => 7 [1] => 司马 [2] => 西城 [3] => 666 [4] => ) Array ( [0] => 8 [1] => 曹操 [2] => 平谷 [3] => 1 [4] => ) Array ( [0] => 9 [1] => 爱新觉罗 [2] => 东城 [3] => 88888 [4] => ) Array ( [0] => 10 [1] => 张飞 [2] => 延庆 [3] => 3 [4] => ) Array ( [0] => 11 [1] => 关羽 [2] => 密云 [3] => 2 [4] => )  */while($row = $stmt->fetch(PDO::FETCH_NUM)){    print_r($row);    echo "<br>";    }?>

  下边以表格的样式出口结果集

<?phptry {    //创建对象    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "***");}catch(PDOException $e) {    echo "数据库连接失败:".$e->getMessage();    exit;}$query = "SELECT uid,name,address,phone,email FROM contactInfo";$stmt = $dbh->prepare($query);$stmt->execute();echo '<table border="1" >';echo "<th>编号</th>";echo "<th>姓名</th>";echo "<th>地址</th>";echo "<th>电话</th>";echo "<th>邮箱</th>";while(list($uid, $name, $address, $phone, $email) = $stmt -> fetch(PDO::FETCH_NUM)) {    echo '<tr>';    echo '<td>'.$uid.'</td>';    echo '<td>'.$name.'</td>';    echo '<td>'.$address.'</td>';    echo '<td>'.$phone.'</td>';    echo '<td>'.$email.'</td>';    echo '</tr>';}echo '</table>';?>

图片 5

fetchAll()

  fetchAll()方法与上贰个主意fetch()类似,不过该方法只要求调用贰回就足以获取结果集中的装有行,并赋给重临的二维数组。该格局的原型如下:

fetchAll([int fetch_style [,int column_index]])

  第多少个参数fetch_style是可挑选,以何种情势引用所收获的列决议于该参数。暗中认可值为PDO::FETCH_BOTH,全数可用的值能够参见在fetch()方法中介绍的率先个参数的列表,还足以钦点PDO::FETCH_COLUMN值,从结果集中再次来到三个分包单列的全数值

  第一个参数column_index是可选择,必要提供叁个整数索引,当在fetchAll()方法的首先个参数中钦点PDO::FETCH_COLUMN值时,从结果集中重临经过该参数提供的目录所内定列的全部值

/*Array ( [0] => Array ( [uid] => 1 [0] => 1 [name] => 张三 [1] => 张三 [address] => 朝阳 [2] => 朝阳 [phone] => 123 [3] => 123 [email] => zs@aaa.com [4] => zs@aaa.com ) [1] => Array ( [uid] => 2 [0] => 2 [name] => 李四 [1] => 李四 [address] => 朝阳 [2] => 朝阳 [phone] => 123456789 [3] => 123456789 [email] => ls@aaa.com [4] => ls@aaa.com ) [2] => Array ( [uid] => 3 [0] => 3 [name] => 王五 [1] => 王五 [address] => 海淀 [2] => 海淀 [phone] => 15011113456 [3] => 15011113456 [email] => ww@aaa.com [4] => ww@aaa.com ) [3] => Array ( [uid] => 4 [0] => 4 [name] => 赵四 [1] => 赵四 [address] => 海淀 [2] => 海淀 [phone] => 123456789 [3] => 123456789 [email] => zx@aaa.com [4] => zx@aaa.com ) [4] => Array ( [uid] => 5 [0] => 5 [name] => 诸葛 [1] => 诸葛 [address] => [2] => [phone] => 120120120 [3] => 120120120 [email] => zg@aaa.com [4] => zg@aaa.com ) [5] => Array ( [uid] => 6 [0] => 6 [name] => 天使 [1] => 天使 [address] => [2] => [phone] => 222 [3] => 222 [email] => zg2@aaa.com [4] => zg2@aaa.com ) [6] => Array ( [uid] => 7 [0] => 7 [name] => 司马 [1] => 司马 [address] => 西城 [2] => 西城 [phone] => 666 [3] => 666 [email] => [4] => ) [7] => Array ( [uid] => 8 [0] => 8 [name] => 曹操 [1] => 曹操 [address] => 平谷 [2] => 平谷 [phone] => 1 [3] => 1 [email] => [4] => ) [8] => Array ( [uid] => 9 [0] => 9 [name] => 爱新觉罗 [1] => 爱新觉罗 [address] => 东城 [2] => 东城 [phone] => 88888 [3] => 88888 [email] => [4] => ) [9] => Array ( [uid] => 10 [0] => 10 [name] => 张飞 [1] => 张飞 [address] => 延庆 [2] => 延庆 [phone] => 3 [3] => 3 [email] => [4] => ) [10] => Array ( [uid] => 11 [0] => 11 [name] => 关羽 [1] => 关羽 [address] => 密云 [2] => 密云 [phone] => 2 [3] => 2 [email] => [4] => ) ) */print_r($stmt->fetchAll;

  上边以表格的花样出口结果集

<?phptry {    //创建对象    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "***");}catch(PDOException $e) {    echo "数据库连接失败:".$e->getMessage();    exit;}$query = "SELECT uid,name,address,phone,email FROM contactInfo";$stmt = $dbh->prepare($query);$stmt->execute();echo '<table border="1" >';echo "<th>编号</th>";echo "<th>姓名</th>";echo "<th>地址</th>";echo "<th>电话</th>";echo "<th>邮箱</th>";$allRows = $stmt->fetchAll(PDO::FETCH_ASSOC);foreach($allRows as $row){    echo '<tr>';    echo '<td>'.$row['uid'].'</td>';    echo '<td>'.$row['name'].'</td>';    echo '<td>'.$row['address'].'</td>';    echo '<td>'.$row['phone'].'</td>';    echo '<td>'.$row['email'].'</td>';    echo '</tr>';}echo '</table>';?>

图片 6

  上边采取fetchAll()方法输出全数的姓名数组

$query = "SELECT uid,name,address,phone,email FROM contactInfo";$stmt = $dbh->prepare($query);$stmt->execute();$row=$stmt->fetchAll(PDO::FETCH_COLUMN,1);echo '所有联系人的姓名:';//所有联系人的姓名:Array ( [0] => 张三 [1] => 李四 [2] => 王五 [3] => 赵四 [4] => 诸葛 [5] => 天使 [6] => 司马 [7] => 曹操 [8] => 爱新觉罗 [9] => 张飞 [10] => 关羽 )print_r($row);

setFetchMode()

  PDOStatement对象中的fetch()和fetchAll()八个方法,获取结果数据的援用格局暗许是同样的,既按列名索引又按列在行中的数值偏移索引的值数组,因为它们的默许格局都被安装为PDO::FETCH_BOTH值,假设布置选用任何方式来改换那个默许设置,能够在fetch()或fetchAll()方法中提供应和须求要的格局参数。但借使每每运用那三个章程,在每一遍调用时都亟待设置新的形式来更换暗中认可的情势。那时就可以运用PDOStatement类对象中的setFetchMode()方法,在本子页面包车型地铁最上端设置二遍格局,未来全部fetch()和fetchAll()方法的调用都将扭转对应征引的结果集,收缩了数10次在调用fetch()方法时的参数录入

$query = "SELECT uid,name,address,phone,email FROM contactInfo";$stmt = $dbh->prepare($query);$stmt->execute();$stmt->setFetchMode(PDO::FETCH_ASSOC);echo '<table border="1" >';echo "<th>编号</th>";echo "<th>姓名</th>";echo "<th>地址</th>";echo "<th>电话</th>";echo "<th>邮箱</th>";$allRows = $stmt->fetchAll();foreach($allRows as $row){    echo '<tr>';    echo '<td>'.$row['uid'].'</td>';    echo '<td>'.$row['name'].'</td>';    echo '<td>'.$row['address'].'</td>';    echo '<td>'.$row['phone'].'</td>';    echo '<td>'.$row['email'].'</td>';    echo '</tr>';}echo '</table>';

bindColumn()

  使用该方式能够将贰个列和八个点名的变量名绑定,那样在每一遍使用fetch()方法获得各行记录时,会自动将相应的列值赋给该变量,但不可能不是在fetch()方法的率先个参数设置为PDO::FETCH_BOTH值时。bindColumn()方法的原型如下所示:

bindColumn(mixed column,mixed $param[,int type]);//设置绑定列值到变量上

  第二个参数column为必选项,能够运用整数的列偏移地点索引,或是列的称谓字符串。第一个参数param也是必选项,需求传递三个引用,所以必得提供叁个一点青睐的变量名。第多个参数type是可挑选,通过安装变量的档案的次序来界定变量值,该参数帮衬的值和介绍bindParam()方法时提供的千篇一律

<?phptry {    //创建对象    $dbh = new PDO("mysql:host=localhost;dbname=testdb", "root", "***");}catch(PDOException $e) {    echo "数据库连接失败:".$e->getMessage();    exit;}$query = "SELECT * FROM contactInfo";$stmt = $dbh->prepare($query);$stmt->execute();$stmt->bindColumn(1,$uid);$stmt->bindColumn(2,$name);$stmt->bindColumn(3,$departmentID);$stmt->bindColumn('address',$address);$stmt->bindColumn('phone',$phone);$stmt->bindColumn(6,$email);$stmt->setFetchMode(PDO::FETCH_ASSOC);echo '<table border="1" >';echo "<th>编号</th>";echo "<th>姓名</th>";echo "<th>部门</th>";echo "<th>地址</th>";echo "<th>电话</th>";echo "<th>邮箱</th>";while($stmt->fetch{    echo '<tr>';    echo '<td>'.$uid.'</td>';    echo '<td>'.$name.'</td>';    echo '<td>'.$departmentID.'</td>';    echo '<td>'.$address.'</td>';    echo '<td>'.$phone.'</td>';    echo '<td>'.$email.'</td>';    echo '</tr>';}echo '</table>';?>

  除了能够由此地点二种格局获得数据表中记录消息外,还是能使用PDOStatement类对象的columnCount()方法获得数据表中字段的数目,况兼能够透过PDOStatement类对象的getColumnMeta()方法赢得具体列的性质音讯

PDOStatement::getColumnMeta

  PDOStatement::getColumnMeta —
重返结果聚焦一列的元数据。参数column表示结果集中以0初步索引的列

array PDOStatement::getColumnMeta ( int $column )

$query = "SELECT * FROM contactInfo";$stmt = $dbh->prepare($query);$stmt->execute();echo $stmt->columnCount();//6/*array   'native_type' => string 'INT24'   'pdo_type' => int 2  'flags' =>     array       0 => string 'not_null'       1 => string 'primary_key' (length=11)  'table' => string 'contactInfo' (length=11)  'name' => string 'uid'   'len' => int 8  'precision' => int 0 */var_dump($stmt->getColumnMeta;

大数据对象

  在开展项目开销时,不常会需求在数据库中在积累“大型”数据。大型对象足以是文本数据,也得以是二进制的图片、电影等。PDO允许在bindParam()或bindColumn()调用中经过接纳PDO::PARAM_LOB类型代码来选取大型数据类型。PDO::PARAM_LOB告诉PDO将数据映射为流,所以能够采纳PHP中的文件管理函数来决定如此的数量

  下边将上传的图像插入到四个数据库

    $stmt =$dbh->prepare("insert into images(mimetype, data) values");    $stmt->bindParam(1, $_FILES['pic']['type']);    $fp = fopen($_FILES['pic']['tmp_name'], "rb");    //直接使用文件资源就可以入库,而不用读出文件,再插入    $stmt->bindparam(2, $fp, PDO::PARAM_LOB);    $stmt->execute();    fclose($fp);

  上面从数据库中读出一幅图像

    $stmt = $dbh->prepare("select mimetype, data from images where id=?");    $stmt -> execute(array(1));    list($mimetype, $data) = $stmt->fetch(PDO::FETCH_NUM);    header("Content-Type: {$mimetype}");    echo $data;

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图