$conn = mysql_connect('localhost','root','');//链接服务器(非永久性)
if(!$conn){
echo '<hr/>';
die('error:'.mysql_error());
}else{
echo '<hr/>';
echo '链接服务器:'.$conn;
}
$db = mysql_select_db('test',$conn);//选择数据库
if(!$db){
echo '<hr/>';
die('error:'.mysql_error());
}else{
echo '<hr/>';
echo '链接数据库:'.$db;
}
/*
mysql_query() 仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE。
对于其它类型的 SQL 语句,mysql_query() 在执行成功时返回 TRUE,出错时返回 FALSE。
非 FALSE 的返回值意味着查询是合法的并能够被服务器执行。这并不说明任何有关影响到的或返回的行数。很有可能一条查询执行成功了但并未影响到或并未返回任何行。
*/
$sql="SELECT * FROM user";
$result = mysql_query($sql,$conn);//执行一条MySQL查询,该函数自动对记录集进行读取和缓存。如需运行非缓存查询,请使用 mysql_unbuffered_query()。
echo '<hr/>';
echo '查询结果集:'.$result;//返回资源标识符
//echo '<hr/>';
//print_r(mysql_fetch_array($result,MYSQL_ASSOC));//函数从结果集中取得一行作为关联数组
//echo '<hr/>';
//print_r(mysql_fetch_array($result,MYSQL_NUM));//函数从结果集中取得一行作为数字数组
//echo '<hr/>';
//print_r(mysql_fetch_array($result));//函数从结果集中取得一行作为关联数组与数字数组,mysql_fetch_row() 函数从结果集中取得一行作为数字数组
/*
mysql_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有
返回根据从结果集取得的行生成的数组,如果没有更多行则返回 false。
*/
echo '<hr/>';
echo '<table border="1" cellspacing="0" cellpadding="5">';
while($row = mysql_fetch_array($result)){
echo "<tr>";
echo "<td>" . $row['FirstName'] . "</td>";
echo "<td>" . $row['LastName'] . "</td>";
echo "<td>" . $row['Age'] . "</td>";
echo "<td>" . $row['Hometown'] . "</td>";
echo "<td>" . $row['Job'] . "</td>";
echo "</tr>";
}
echo '</table>';
echo '<hr/>';
echo '关闭非持久的 MySQL 连接:'.mysql_close();
$name = array('fruits' => array('orange', 'banana', 'apple'),
'veggie' => array('carrot', 'collard','pea'));;
echo '<hr/>';
print_r($name['fruits'][1]);
echo '<hr/>';
echo count($name);//计算数组中的单元数目或对象中的属性个数
echo '<hr/>';
/*
符号“->”表示:调用类的函数和成员变量
*/
class className{
function funName(){
echo "dggdgdgd";
}
}
$classOne = new className();
$classOne->funName();
echo '<hr/>';
$i=0;
do{
$i++;
echo "The number is " . $i . "<br />";
}
while ($i<5);
介绍
最新项目——会员收费,目的是要以更好的展现形式表现给用户,以及添加了新功能(会员机制)。
索引
流程图
1> 展示界面
2> 获取折扣价格
接口说明
http请求脚本(curl或socket)
测试数据
流程图
其中里面的demo:是通过url进行展现,里面的mst是参数,通过不同的参数进行展现。如:http://www.demo.com/?mst=1表示参数为1的demo样式。
展示界面(4种情况)
获取折扣价格
接口说明
1、开通高级会员
psid=2
pstype=101
2、开通会员
psid=1
pstype=101
3、[会员/高级会员]价格信息
wiki地址:http://wiki.1verge.net/projects:premium:v2:product_rules_api#根据会员等级id获取等级信息
4、[是否是会员]
wiki地址:http://wiki.1verge.net/projects:premium:v2:verify_center_api#获取当前会员等级
5、[折扣信息]
wiki地址:http://wiki.1verge.net/projects:premium:v2:operation_api#根据用户id_服务id_服务类型_服务周期数_获得当前用户可以享受的折扣策略
6、可包月节目+有权观看+高级会员则显示“您是高级会员,可免费观看此节目”
7、仅包月节目+有权观看+高级会员提示“续费”
8、除6以外+有权观看则显示“截止日期”
可以在Premium.class.php中list_shows_by_pkgid函数下面继续封装调用函数
http请求脚本(curl或socket)
<?php
function httpRequest($url, $hostName, array $params){
$postParams = array();
foreach ($params as $key=>$val) {
$post_params[] = $key.'='.rawurlencode($val);
}
$postString = implode('&', $post_params);
$result = '';
if (function_exists('curl_init')) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host: ' . $hostName));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postString);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'DEMO.COM PREMIUM PHP5 Client ver: ' . phpversion());
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
$result = curl_exec($ch);
curl_close($ch);
} else {
$context = array('http' => array('method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded' . "\r\n".
'Host: '.$hostName . "\r\n".
'User-Agent: TEST.COM BC Test PHP5 Client ver: ' . phpversion() . "\r\n".
'Content-length: ' . strlen($postString),
'content' => $postString));
$contextId = stream_context_create($context);
$handle = fopen($url, 'r', false, $contextId);
if ($handle) {
while (!feof($handle)) $result .= fgets($sock, 4096);
fclose($handle);
}
}
return $result;
}
测试数据
1、点播信息节目ID:1e390718b72311df97c0.html
2、vip用户ID:123350942
3、普通用户ID:106738702
有权观看的节目ID:cbfb035e962411de83b1.html
要点:
1. 适配器模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。
2. 适配器模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
实现:
类的适配器模式结构图(继承)
对象的适配器模式结构图(组合)
(对象适配器的代码实现)
Target:定义Client使用的与特定领域相关的接口
public interface Target { void request();}
Adaptee:现在需要适配的已经存在的接口
public class Adaptee{ public void specificRequest(){}}
Adapter:对Adaptee 的接口与Target接口进行适配
public class Adapter implements Target{ public Adapter(Adaptee adaptee) { super(); this.adaptee = adaptee; } public void request() { adaptee.specificRequest(); } private Adaptee adaptee;}
适用性:
1. 系统需要使用现有的类,而此类的接口不符合系统的需要。
2. 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3. (对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
效果及优缺点:
对于类适配器:
1. 用一个具体的Adapter类对Adaptee和Taget进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。
2. 使得Adapter可以override(重定义) Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
对于对象适配器:
1. 允许一个Adapter与多个Adaptee,即Adaptee本身以及它的所有子类(如果有子类的话)同时工作。Adapter也可以一次给所有的Adaptee添加功能。
2. 使得override(重定义)Adaptee的行为比较困难。如果一定要override Adaptee的方法,就只好先做一个Adaptee的子类以override Adaptee的方法,然后再把这个子类当作真正的Adaptee源进行适配。