PHP网页编程之PHP5 OOP编程中的代办署理与异常定制
让好朋友来看看,嘿,看咱写的多棒,然后再在网上宣传一下。php5|编程 之前没学过PHP,比来恰好一个项目需求用到,我就决意一边学一边做PHP.1 在SQL语句中可经由过程添加限制前提:left(text,20)只取text文本的前20个字;
2 可以用limit fromRecord, RecordNum 来作为分页利用,好比limit 0,30暗示从第一个纪录入手下手遍历30个记载;
3 两个表的毗连可所以:table1 join table2 using x(x为两个表的公共字段),或是table1 join table2 on table1.x = table2.x
4 php获得querystring可以用$page = $_GET['page'];
或
$page = $_REQUEST['page'];
个中Request可获得post,get,QueryString等字符;
在这之前 我看到了一个较笨的举措:
parse_str($_SERVER['QUERY_STRING'],$output); // 先将查询字符串存到一个数组$output中
$page = $output['page']; //然后依据变量名索引
5 php中日期函数的对照实践上就是字符串的对照;
6 mysql中date类型的数据可所以:2000-02-03,2002.02.03,2002.2.3,02.02.03,02.2.3,就是说必需有月和日,并且必需以'-'或'.'分离隔来。
7 data()来获得工夫会有时区的成绩,我发明工夫都少了8个小时,是由于php.ini外面默许设置装备摆设是GTM美国时区;
处理举措:可以修正php.ini:
; Defines the default timezone used by the date functions
date.timezone = "Asia/Shanghai"
或在利用date()函数是加上date_Default_TimeZone_set("PRC");
8 一段工夫,调试时在body处老是说我短少")",费了半天是intval($_POST['consumeType'])的成绩,在数据库中该字段是varchar(50),在zengsong表中我没用intval函数,是由于它的ID就是1,2...整数跟char型的可以相互转换,但在别的两个表中是A5A,SP07-01之类的,但它怎样转换成int型了呢?
让咱们来看看intval函数的声明:
intval函数用来获得变量的整数值:int intval ( mixed var [, int base] )
经由过程利用特定的进制转换(默许是十进制),前往变量 var 的 integer 数值。
var 可所以任何标量类型。intval() 不克不及用于 array 或 object。
9 别的一个莫名的成绩,以用户名1上岸就能够,换个'bo'上岸,体系就在处失足:说我运转工夫毛病:短少")",nnd。反省了一下,本来是sql语句中的变量类型跟数据库中的纷歧致,
10 php中当从浮点数转换成整数时,数字将被取整(抛弃小数位)。
11 在mysql拔出语句中,假如是自增字段要用(NULL)来取代。
12 php的中文乱码???成绩处理:
在mysql_connect后到场mysql_query("set names 'gb2312'");
或全用utf8编码,就不必到场上述语句了。
还有函数iconv("GBK","UTF8","字符串");可完成各类字符编码的转换。
4、 利用承继抛出定制异常
在PHP中,你可以抛出任何对象作为一个异常;然而,起首该异常应当承继自PHP的内置异常类。经由过程创立你本人的定制异常,你可以纪录其它有关于该毛病的信息,例如在一个日记文件中创立一个进口,或做你喜好做的任何工作。你的定制异常将要做以下几件工作:
・ 纪录由查询发生的来自DB对象的毛病动静。
・ 给出查询毛病产生地点行代码的正确细节―经由过程反省挪用栈。
・ 显示毛病动静和查询文本―当被转换成一个字符串时。
为了失掉毛病信息和查询文本,需求对DBQuery对象作多处更改。
1. 一个新的protected属性―compiledQuery―需求被添加到类中。
2. compile()函数利用查询文本更新查询compiledQuery属性。
3. 应当到场一个检索编译的查询文本的函数。
4. 还应当到场一个函数―它失掉以后的与DBQuery对象相干联的DB对象。
列表4.抛出一个异常。
class DBQuery
{
/**
*在挪用compile()或execute()以后存储查询的编译版本
*
* @var string $compiledQuery
*/
protected $compiledQuery;
/**
* 前往编译的查询而不履行它。
* @参数:mixed $params,...查询参数
* @前往:字符串―编译的查询
*/
public function compile($params='')
{
if (! $this->stored_procedure) {
throw new Exception("存储进程没被初始化.");
}
/*取代参数*/
$params = func_get_args(); //失掉函数参数
$query = preg_replace("/(?compile_callback($params, 1, "2")', $this->query);
return ($this->compiledQuery = $this->add_strings($query)); //把字符串放回查询中
}
public function getDB()
{
return $this->db;
}
public function getCompiledQuery()
{
return $this->compiledQuery;
}
}
如今,你可以完成QueryException类。注重你是若何遍历挪用栈以在剧本中查找实践招致毛病的地位的。这正好合用于当抛出异常的DBQuery对象是一个承继自DBQuery对象的子类的情形。
列表5:QueryException类。
/**
*查询异常
*
*当试图履行一个查询时,假如一个毛病产生,将由{@link DBQuery}对象抛失足误
*/
class QueryException extends Exception
{
/**
* 查询文本
*
* @var字符串$QueryText;
*/
protected $QueryText;
/**
*来自数据库的毛病号/代码
*
* @var字符串$ErrorCode
*/
protected $ErrorNumber;
/**
*来自数据库的毛病动静
*
* @var字符串$ErrorMessage
*/
protected $ErrorMessage;
/**
*类机关器
*
* @参数:DBQuery $db,是抛出异常的查询对象
*/
public function __construct(DBQuery $query)
{
/*失掉挪用栈*/
$backtrace = $this->GetTrace();
/*把行和文件设置到毛病实践产生的地位*/
if (count($backtrace) > 0) {
$x = 1;
/*假如查询类被承继,那末咱们需求疏忽由子类所停止的挪用*/
while((! isset($backtrace[$x]['line'])) ||
(isset($backtrace[$x]['class']) && is_subclass_of($backtrace[$x]['class'], 'DBQuery')) ||
(strpos(strtolower(@$backtrace[$x]['function']), 'call_user_func')) !== false ) {
/*轮回履行,只需没有行号或挪用的函数是DBQuery类的一个子类*/
++$x;
/*假如咱们抵达栈底,那末咱们利用第一个挪用者*/
if (($x) >= count($backtrace)) {
$x = count($backtrace);
break;
}
}
/*假如下面的轮回最少履行一次,那末咱们可以把它减1以查找实践的引发毛病的代码行
*/
if ($x != 1) {
$x -= 1;
}
/*最初,咱们可以设置文件和行号,这应当可以反应出引发毛病的SQL语句*/
$this->line = $backtrace[$x]['line'];
$this->file = $backtrace[$x]['file'];
}
$this->QueryText = $query->getCompiledQuery();
$this->ErrorNumber = $query->getDB()->errno();
$this->ErrorMessage = $query->getDB()->error();
/*挪用超类的异常机关器*/
parent::__construct('Query Error', 0);
}
/**
*失掉查询文本
*
* @前往字符串查询文本
*/
public function GetQueryText()
{
return $this->QueryText;
}
/**
*失掉毛病号
*
* @前往字符串毛病号
*/
public function GetErrorNumber()
{
return $this->ErrorNumber;
}
/**
*失掉毛病动静
*
* @前往字符串毛病动静
*/
public function GetErrorMessage()
{
return $this->ErrorMessage;
}
/**
*当对象被转换为一个字符串时挪用。
* @前往字符串
*/
public function __toString()
{
$output = "Query Error in {$this->file} on line {$this->line}nn";
$output .= "Query: {$this->QueryText}n";
$output .= "Error: {$this->ErrorMessage} ({$this->ErrorNumber})nn";
return $output;
}
}
至此,在本节入手下手看到的代码可以任务了。
5、 结论
在本文中,你看到了代办署理是如何把与查询相接洽的DB接口映照到针对一个特定的查询了局上的操作。DBQuery对象表露不异的函数,例如fetch_assoc(),作为DB对象。但是,这些都是针对单个查询起感化。你还进修了若何利用定制异常来给出具体信息―一个毛病产生在什么时候何地,和它们如何更好地掌握毛病的处置
我的这套线路可能跟许多学习PHP的爱好者不谋而合,这也算是一个循序渐进的学习过程,不过新手不要看到上面的概括就以为学习蛮简单的,默默在此不得不对您稍微泼一下冷水,任何东西其实都不简单。 这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。 我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。 小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。 当然这种网站的会员费就几十块钱。 基础有没有对学习php没有太大区别,关键是兴趣。 如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域, 写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。 如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域, 首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。 基础有没有对学习php没有太大区别,关键是兴趣。 其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。 不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。 我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。 说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。 学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql 当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标, 你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。 学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
页:
[1]