作者归档:月夜

PDO(PHP Data Object)扩展学习(一)

1、PDO知识学习
(1)了解PDO及建立数据库连接
PDO(PHP Data Object)扩展是一个与数据库通讯交互的扩展,与以往使用的mysql或mysqli类似,旨在解决不同数据库的连接及处理一致性问题,奈何在这个追求个性的时代,各个数据库厂家之间的SQL脚本都有自家的个性,有所差异,目前PDO还未完全解决针对所有数据库交互的一致性。
PDO针对数据库提供了一组相对比较简洁的功能,用于查询及获取数据集。其使用相对也比较简单,首先是一如既往的要跟将要操作的数据库取得联系,然后完成各种操作,与数据库取得联系,一般要创建一个PDO对象,然后核对暗号(DNS),匹配后该PDO对象就打入敌人内部,从而开展各项活动,该向外传递情报就传递,该破坏敌人内部就破坏。以MySQL为例我们来一个示例。

$dbConn = new PDO('mysql:host = localhost; dbname=db', 'dbuser', 'dbpwd');

创建成功后再$dbConn中存储PDO对象,然后就可以该干啥干啥了。
(2)基础查询
先看看基础查询,基础查询主要使用PDO对象的query方法,该方法接受SQL查询语句,返回一个叫PDOStatement的对象,返回的对象的fetch方法或者fetchAll方法就可以获得数据集了,具体如下:

$dbConn = new PDO('mysql:host = localhost; dbname=db', 'dbuser', 'dbpwd');
$stmt = $dbConn->query('SELECT Field1,Field2 FROM table_name');
while($row = $stmt->fetch()) {
    echo $row['field1'] . ' ---' $row['field2'] . "\n";
}

(3)数据提取模式
PDOStatement对象的fetch方法与fetchAll方法可接受相应的参数,该参数用于指定数据提取模式,主要反映在结果数据集格式化的模式,共有四个常量,分别是:FETCH_ASSOC、FETCH_NUM、FETCH_BOTH、FETCH_CLASS,其中FETCH_BOTH为默认值。
FETCH_ASSOC:返回的结果集为数组,以查询字段名作为数组的键值,上面的基础查询中输出中的应用;
FETCH_NUM:返回的结果集为数组,以数字作为数组的键值;
FETCH_BOTH:返回的结果集为数组,包含上两者,既有以字段名作为数组的键值,又有以数字作为数组的键值;
FETCH_CLASS:返回的结果集为一个已经命名的类的对象,以查询列名设置到类对象的属性中;
(4)参数及预处理
PDO扩展还可以对查询脚本参数进行预处理操作,可以在SQL语句中针对查询条件设定参数,可以在执行过程中给参数设定具体的值,等于说将PDOStatement对象的Query分为两步来运行,先传入预处理SQL语句,然后再赋值执行。使用预处理的好处是编译一次,多次执行,能够提高效率,要快于query查询,另外可以有效的防止SQL注入。另外参数也可以用?来代替,需要顺序给参数赋值。预处理还中的参数可以绑定一个值,也可以绑定一个变量。

// 基本操作
$sql = "SELECT * FROM tablename WHERE field = :param";
$stmt = $dbConn->prepare($sql);
$stmt->execute(array("field" => value));
$result = $stmt->fetch();
// 用?代替参数
$sql = "SELECT * FROM tablename WHERE field1 = ? AND field2 = ?";
$stmt = $dbConn->prepare($sql);
$stmt->execute(array(value1,value2));
$result = $stmt->fetch();
// 绑定值、预处理中的变量
$sql = "SELECT * FROM tablename WHERE field1 = :field1 AND field2 = :field2;
$stmt = $dbConn->prepare($sql);
$stmt->bindValue(':field1', value1);
$stmt->bindValue(':field2', value2);
$stmt->execute();
$result = $stmt->fetch();
// 可改变某一参数绑定的值,继续执行
$stmt->bindValue(':field2', value3);
$stmt->execute();
$result2 = $stmt->fetch();
// 还可以给参数绑定变量
$stmt->bindParam(':field2',$value4);
$value4 = value;
$stmt->execute();
$result3 = $stmt->fetch();

(6)数据库操作中的常用操作
(A)获取新插入数据的ID
执行后调用PDO对象的lastInsertId()方法可获得新插入数据的ID。

$sql = "INSERT INTO tablename(field1,field2,field3) VALUES(:field,:field2,:field3)";
$stmt = $dbConn->prepare($sql);
$stmt->execute(array(
        ':field1' => value1,
        ':field2' => value2,
        ':field3' => value3)
);
echo "New insert id : " . $dbConn->lastInsertId();  

(B)获取操作影响的行数
执行后调用PDOStatement对象的rowCount方法获得操作影响到行数,参考数据删除操作影响的行数。
(C)数据删除

$sql = "DELETE FROM tablename WHERE field = :field";
$stmt = $dbConn->prepare($sql);
$stmt->execute(array(":field" => value));
echo $stmt->rowCount() . ' rows deleted';

(7)异常处理
连接数据库失败会抛出PDOException异常,预处理失败会返回false或抛出PDOException,可使用getMessage方法获得抛出异常的原因,执行成功返回true,失败返回false,如果执行失败,可使用PDOStatement对象的errorInfo方法获得错误产生的原因。提取数据错误返回false,同样可以使用errorInfo方法获得错误的信息,需要注意的是提取数据会返回空数组或者其他 依据数据提取模式结果,这是没有错误状态的。

        try {
              $dbConn = new PDO("...");
        } catch (PDOException $e) {
              echo "Could not connect to database";
              exit;        
        }
        $sql = "...";
        try {
              $stmt = $dbConn->prepare($sql);
              if($stmt) {
                   if($stmt->execute(...)) {
                       $result = $stmt->fetch();
                   } else {
                       $error = $stmt->errorInfo();
                       ...
                   }
              }
        } catch(PDOException $e) {
            echo $e->getMessage();
        }

(8)PDO的事务处理
PDO对于事物处理的前提是数据库要支持事务处理,对于MySQL来讲表类型为Inno的支持事务,对于一组SQL语句需要进行事务处理,在任何SQL语句运行前调用PDO对象的beginTransaction方法启动事务,所有SQL语句运行成功后,调用PDO对象的commit方法,在运行中改组SQL语句有一个没运行成功,调用PDO对象的rollback方法回滚。

–未完待续 —

共享网-基于物品共享的尝试

一直以来都想以一款面向大众或者面向中小企业的用户产品切入互联网领域,多年来一直从事相对传统的企业信息化方面的工作,虽比较热爱互联网但一直未有缘切入,中间短暂的试水终由于其他原因而搁浅,终其原因还是不果断,在面临选择的时候往往不够坚决,或者说在适应的舒适区中没有很大的决心跳出来从新开始。目前所在的公司还没有具体的方向,所以得以有机会做一些互联网方面的尝试,恰巧主管研发的同学提出一个想法:『基于LBS的个人闲置物品的有偿共享』,于是放手让他们去做,经过了短暂的近一个月的原型调研,最终中止了这个尝试的项目,从中获得了一些在我看来的反馈与收获,在此总结一下。

项目最终的产出: 共享网
项目想法假设:
1、每个家庭都有不太常用的工具类或者服务类的物品,可以有偿共享出来给就近的人使用(例如电钻类工具,文件打印类,儿童玩具类)
2、讨论的一些补充
(1)由共享出发,进而相互结识,形成以社区为圈子的邻里关系
(2)由邻里圈子尝试线下的一些活动,由线上走向线下
(3)是否能将街边的商铺纳入其中
(4)走社区居委会及物业渠道,将他们提供的信息服务纳入其中,并反向推广
……..

当然讨论的时候都很长远,但开始做的时候就基于一条『是否有共享的愿望』,在数据层面就是是否能产生共享的数据,在运营方面就是如何促成人们共享。简短的尝试以后,反馈结果不理想又没有其他太好的转变方式,于是目前只能让这个项目搁置起来。

从邀约试用的各行业朋友反馈来看,不具备这类假设的需求,更多的是压根没有什么要共享的需求,也没有这方面的不方便或者麻烦。这就是很快结束的最直接的收获。但从目前团队的工作来看还有其他方面的收获:

(1)打造互联网项目产品,团队的工作方式与传统信息管理类系统是截然不同的,团队在进行这方面的工作时需要在思想上有所转变,互联网项目产品最大的特色之一就是时刻保持即时响应性,相比信息管理类系统的发布周期来讲要大大缩短,这个观念一定要转变,如果要做互联网项目这应该是目前团队最需要改变的地方。
(2)功能可以逐步添加,但引导及如何让用户简洁明了的上手并具有一定的趣味性或者能够切实的解决用户所面临的麻烦应该先行。可以从解决单一麻烦开始,但如果要解决的单一麻烦丝毫不能引起用户的兴趣,这就不叫麻烦,也就没有要解决的必要了。
(3)不要教用户怎么用,要观察用户会如何用,邀约的试用者分为几类,主要都是各自的朋友,有的告诉的比较清楚,我一般邀请的朋友就简单的给他们一个网址,让他们看看,然后说说意见,压根就不提具有的功能。
(4)注意细节,细节可以是多方面的,比如整体的色调是否统一,文字标识是否统一,各项标注是否匹配当前的展现,获取用户反馈的渠道等等。
(5)运营及推广方面目前人手不足,在互联网项目中,这部分人员具有很重要的使命。
(6)一个优秀的产品经理也是目前很欠缺的。

这样的尝试毕竟不会有很多次,在非常有限的资源下能够做这样的尝试是幸运的,但是从反馈的需求及目前的资源来看,这是一件我们目前干不了的事情。

———————这是分割线———————–

目前供职的公司含有”物联网”,虽说比较厌烦基于这类概念的鼓吹,但责任所在,需要努力为之找到一条道路,虽目前不甚理想,但仍在努力中。以下是这些时间公司的工作安排,目前还是0。

基于Zigbee的自组网环境数据监测终端及网关   — 还未有产出,板卡已出
引入万能手机遥控器  — 不被市场接受,不成功
引入手机投影仪 — 产品不稳定,目前还未开始市场尝试
努力寻找带来现金流的项目(信息化方向)

 

php html解析器Simple HTML Dom

最近在每天工作之余抽取一点小时间做一个小的web应用,中间需要一些原始数据的抓取,用于测试,在网上找到了PHP Simple HTML Dom,是一个简单的HTML DOM解析器,支持PHP5+以上版本,支持无效的HTML,提供了比较简单的方法来处理HTML元素。是一个开源项目。

在使用中基本能够满足目前的需要,相对对于HTML的处理还是比较方便的,就是效率跟占用内存貌似不太理想,可能是对其使用上不是很对路。总来的来说,用这个东西入门还是比较快速的。

1. 开始使用

首先下载解压缩,然后将simple_html_dom.php文件包含进要编写的脚本文件中,加载要处理的html,支持三种模式的html加载,分别是『从url中加载,从字符串中加载,从文件中加载』。

Hello World!');
//从文件中加载
$html = file_get_html('example.htm');

从字符串加载网上文件需要先从网络下下载,使用cURL比较好一些,需要在php配置文件中打开php扩展php_curl。

$url = 'http://www.example.com';
$ci = curl_init();
curl_setopt($ci,CURLOPT_URL,$url);
curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ci);

2. 查找html元素

使用find函数查找,返回包含对象的数组,常见的查找如下。

//查找超链接元素
$alink = $html->find('a');
//查找第n个连接元素
$alink = $html->find('a',5);
//查找id为main的div
$mainDiv = $html->find('div[id=main]');
//查找所有定义了id的div
$idDiv = $html->find('div[id]');
//查找所有定义了id的元素
$idAll = $html->find('[id]');
//查找样式类为info的元素
$classInfo = $html->find('.info');
//支持嵌套子元素查找
$ret = $html->find('ul li');
//查找多个html元素
$ret = $html->find('a,img,p');
//....

3. 其他

可以使用内置的函数来进行元素的定位,返回父元素parent,返回子元素数组children,返回第一个子元素first_child,返回最后一个子元素last_child,返回前一个相邻元素prev_sibling,返回后一个相邻元素next_sibling等。

提供简单的正则表达式来过滤属性选择器,类似于[attribute]的格式。

每个对象都有4个基本属性:
tag — 返回html标签名
innertext — 返回innerHTML
outertext — 返回outerHTML
plaintext — 返回HTML标签中的文本

返回元素属性值

//返回$alink的href值
$link = $alink->href;

通过设置元素的属性值可以对元素进行添加、修改、删除操作。

//删除url连接
$alink->href = null;
//元素的修改
$ret->outertext = '
';
$ret->outertext = '';
$ret->outertext = $ret->outertext . '
other
';
$ret->outertext = '
Welcome
' . $ret->outertext;

-EOF-

php文件操作基础

在有些场合中需要以文件的形式来对内容进行存储,通常这时候需要对文件进行一系列的操作,PHP中对于文件的操作跟其他计算机程序设计语言对文件的操作类似,对于文件的操作主要包括三个部分,以及围绕这三部分提供的辅助性函数来完成文件操作的工作。

(1)文件的创建与打开;
(2)文件的操作;
(3)文件的关闭;

在PHP中,通过一系列的函数来完成文件的操作,常用的函数及其简要说明罗列如下:

//文件打开,完成文件打开(在文件不存在时可创建文件),依赖于文件中模式的不同而具有不同的操作
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
//$filename 打开或者要创建文件的路径及文件名,为了便于移植,使用反斜杠/为佳
//$mode 是文件打开的模式,有很多模式,比较常用的r,w,a,同样为了便于移植,建议mode中增加b(二进制)
//通常读文件为 rb ,写文件为 ab,分别表示以二进制读文件及以二进制向文件追加内容
//在文件打开操作过程中出现错误请首先检查文件所在的路径的权限设置

//文件操作函数

//写操作相关函数
//把$string的内容写到文件指针$handle
int fwrite ( resource $handle , string $string [, int $length ] )  
//函数是fwrite的别名函数
fputs() 

//也能完成写操作,不同的是集成了fopen(),fwrite(),fclose(),使用该函数不用再打开关闭文件
int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) 

//读操作相关函数
//逐行读取
string fgets ( resource $handle [, int $length ] ) 
//逐行读,能够过滤标记
string fgetss ( resource $handle [, int $length [, string $allowable_tags ]] ) 
//逐行读,能够根据定界符输出到数组
array fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = ',' [, string $enclosure = '"' [, string $escape = '\\' ]]]] )
//一次性读取一个文件并将文件内容发送到标准输出,包含了文件打开与文件关闭操作
int readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] )
//先要打开文件,然后将文件指针所指向的文件内容发送到标准输出
int fpassthru ( resource $handle )
//把结果发送到一个数组中
array file ( string $filename [, int $flags = 0 [, resource $context ]] )
//一次读取一个字符
string fgetc ( resource $handle )
//读取任意长度字节的内容
string fread ( resource $handle , int $length )

//文件关闭
bool fclose ( resource $handle )

//文件操作中常用的函数
//检查文件或目录是否存在
bool file_exists ( string $filename )
//获取文件大小,返回文件大小的字节数
int filesize ( string $filename )
//删除文件
bool unlink ( string $filename [, resource $context ] )
//复位文件指针位置
bool rewind ( resource $handle )
//在文件指针中定位
int fseek ( resource $handle , int $offset [, int $whence = SEEK_SET ] )

函数的具体详细的说明在php.net上可以查到,下面练习一下文件的操作,练习名称为『简易日记』,需求如下:

(1)每日记录的内容以年-月-日.txt保存在数据目录下;
(2)首页写日记,并显示以往的记录;
(3)显示单页记录内容;

日记填写界面:

diary

具体代码如下

首页(index.php)



  
    
    简易日记--php文件操作练习
    
  
  
    

我的日记本

写日记

日记主题

日记内容


日记列表


$value" . " | "; } ?>

保存处理页(diaryprocessed.php)

当前不能处理您提交的日志,请稍后再试!

"; echo "返回"; } fwrite($fp,$output); flock($fp,LOCK_UN); fclose($fp); echo '日记提交成功!'; echo "返回";

查看内容页(viewdiary.php)




  
    
    简易日记
    
  
  
    写日记
    

所有源文件下载:diary

-EOF-

《精益创业》读后总结笔录

从4月21日读完《四步创业法》后紧接着就开始阅读《精益创业》这本书,差不多近2个月的时间,这阅读的效率着实让人蛋疼,不管怎么说好在也是断断续续的于今日读完了。保持持续的阅读是一件值得肯定的事情,首先鼓励一下自己。

这是一本关于新创企业成长思维的书,主要在丰田精益生产基础上建立的关于新创公司如何能够尽可能的获得成功,为此提供了一系列的方法与思维。书中的内容围绕着新创企业及其相关活动场景,但里面讲述的方法同样也适用于日常多种事情的处理。

『新创企业』的定义有两部分组成:一部分是由人组成的机构,另一部分是在极端不确定的情况下,开发的新产品或新服务。

新创企业的奋斗过程我们可以称之为创业,创业始于一些愿景,因为任何事情都是极端不确定的,所以我们的愿景或者说是idea都是『未经证实的假设』,大部分情况下这些愿景都是我们一厢情愿的假设,围绕着愿景做周密详尽的计划按部就班进行会导致直到最后阶段才能获得反馈,要么一步登天,要么直接就下地狱。

尽早的验证这些未经证实的假设,使其变成『经证实的认知』,则大大降低风险,越早找到客户,越早知道客户认为什么东西是有价值的对于创业过程越有利。

通过『开发-测量-认知』的迭代反馈循环可以快速获取反馈,每一次迭代反馈循环过程都是从未经证实的假设到经证实的认知,根据经证实的认知进行调整或者进行转型,这个迭代反馈循环需要快速完成,这就是精益创业的核心。

未经证实的假设包括价值假设和增长假设,迭代反馈循环起始不需要大而全,只要开发能够体现创新点和核心价值的最小化可行产品即可,目的是验证假设是对的。如果核心假设不对,可尽早调整或者转型,如果反馈良好,就可以继续在此基础上进行进一步的迭代。

以小批量可行化产品快速迭代前进能够最大的节省资源,避免浪费,而且能够以最小的成本来修正错误。

快速迭代的反馈循环中,要建立真实有效的测量,也就是创新核算,需要一系列指标数据来测量,这些测量的指标要能反映产品特性的变化与业务增速之间的因果关系,搜集基础运营数据,确定核算基线,核算不能核算累计的总数增长,而是要核算增速,比较好的方式是核算同周期内的指标是否是符合上升的预期。

每一次迭代反馈循环结束获取经证实的认知后,有两个选择,继续坚持改进或者转型。

——————书中其他摘录———————

转型列表

(0)放大转型
(1)缩小转型
(2)客户细分市场转型
(3)客户需求转型
(4)平台转型
(5)商业架构转型
(6)价值获取转型
(7)增长引擎转型
(8)渠道转型
(9)技术转型

增长来自何方?

(0)口碑相传
(1)产品使用带来的衍生效应
(2)有资金来源的广告
(3)重复购买或使用

增长引擎

(0)黏着式增长引擎
(1)病毒式增长引擎
(2)付费式增长引擎

书中经典语录:

成功地执行一项无意义的计划是导致失败的致命原因
如果企业费尽心思开发出来的产品没人想要,那么是否按时、按预算完成计划就无关紧要了
没什么比高效地做一件根本不该做的事更加徒劳的了
我们未来的繁荣取决于我们集体想象力的质量