恶意点击,不得不防

2010-07-22

看过百度竞价排名广告欺诈这个报道应该都会了解到:恶意点击是非常真实的,你需要了解最新恶意点击的手段,以保护你的搜索营销预算。点击欺诈主要是通过根本没有转化意向的点击来消耗你的广告费用——这些点击仅仅是为了获取点击费。有些专家称所有的付费搜索点击中大约20%——60%都是欺诈的。
只要被点击了,就必须支付点击的广告费用,但是你并没有从这笔付费中有任何收获,除非搜索者向你购买了产品。因此,想要吸干你搜索营销预算的人会重复点击或发动身边的人来点击而不购买任何产品。

谁会费心这么做恶意点击呢?
竞争对手和唯利是图的商家、搜索引擎的联盟网站和竞价服务代理商为了获得更多的广告收入、对广告投放者有报复企图的团体或者个人都会这么干。你的竞争对手可能想要耗尽你的付费搜索预算,而同时他们的列表还能保留着(去挖掘你在丢失的顾客)。真正的问题来自于惟利是图的商家,使用不正当的做法为他们自己来吸掉你的资金。举个例了:你是做珠宝行业的,并且做了竞价,那么你的竞争对手可能每天发动身边的人或全体员工来点击你的广告,这样一年由于恶意点击而损失的广告费也是相当庞大的一笔费用。

怎么样才能够防止自己的广告费被吸掉呢?

一、限制区域推广,受行业和产品限制,很多地区的生意你是没法做到的,所以在一些没有生意来源的地区,就不要投放广告,因为跨区行业受到当地同行的恶意点击也是非常之多的!

二、平时在与人态度上,避免与人结怨,尤其是懂的网络竞价广告的人群,因为对方如果对你有敌意,对方最简单的方法就是用鼠标点击你关键词,这也是最简单最安全的报复手法。

三、在同行中树立一个好的形象,保持低调,处处谦让的形象!平时也不要恶意点击别人的广告,现在很多行业恶意点击比较疯狂,天天都有,每次点几十次。究其原因,每个行业开始都是从第一个恶意点击开始,恶意循环,越演越烈!

 四、在面对搜索广告推广的业务员、网络营销公司的业务员或者和网络推广相关的业务员,请不要把火气洒在在打给你电话的销售上,因为他们也是为了生计,为了完成任务!他们更懂得竞价点击付费。他们可能会把怨气挥发在鼠标上。弹指间鼠标轻滑,您的广告费呼呼流走…总之待人要谦和,客气。做人要低调!

五、在网站安装统计流量,这样如果存在恶意点击,可以发现恶意点击访客的IP,充分利用搜索引擎竞价系统本身提供的简单限制IP的功能来达到阻止对应IP的恶意点击现象!

六、安装第三方防恶意点击监控软件,防恶意最好的办法是从人性角度来防止。比方恶意点击是一个小偷,最好的办法是教育这个小偷不要偷或提醒不要来我家偷。拓宽卫士防恶意点击软件就像一道防盗门。当小偷进入门口首先会对其进行友善的提醒并警告,如果小偷还是目中无人,义无反顾,防恶意点击的系统将会主动的对其电脑实施不同程度的阻击,从而达到有效防止恶意点击的再次发生。

拓宽卫士作为一款技术领先的防恶意点击软件,采用电脑编号+IP识别,对局域网内的不同电脑攻击一样超强拦截.对恶意点击识别率超高,自动识别电脑,自动判断是否恶意点击,无需人工操作,超智能.当发现有恶意点击者时,拓宽卫士=将对网站恶意访客的不良点击广告行为采取主动拦截,可以有效阻击恶意点击广告造成广告资金的流失。

大多使用过拓宽卫士防恶意点击软件的广告都比较满意,每天可以查看有多少才是真正的客户,有多少恶意点击,还可以查看关键词点击频率,从而更好的优化关键词,用户不会因为广告费用提早用完而担心真正的商机被浪费,成交率普遍提高。

php+ajax购物车的基本原理--移出购物车

2010-04-18

上一篇文章,我简单介绍了php+ajax购物车的基本原理--加入购物车。而有时客户可能会临时把一些加入购物车的东西去掉,所以我们不得不加入一个移出购物车的功能。如下图:
remove_to_cart

加入购物车就是为商品创建一个$_SESSION变量,那移出购物车就是销毁这个变量。
我们会新建一个文件remove_to_cart.php----ajax请求的页面,用来把商品移出购物车。
首先我们对check_out.php用来显示购物车商品信息的代码增加一个移除的按钮。另外给在显示总金额那里增加一个id="totalamount"的标记,因为移出购物车,总金额会发生变化。更改后的代码如下:(只在表格那里修改就行了。)

<table>
<tr><td>商品</td><td>大小</td><td>数量</td><td>价格</td><td>操作</td></tr>
<?php foreach($products as $product){ ?>
<tr>
<td><?php echo $product['name'];?></td>
<td><?php echo $product['size'];?></td>
<td><?php echo $product['num'];?></td>
<td><?php echo $product['num']*$product['price'];?></td>
<td><input type="button" value="移除" onclick="remove_to_cart(this,'<?php echo $product[$key];?>')"</td>
</tr>
<?php } ?>
<tr><td colspan="5">总金额为:<span id="totalamount"><?php echo $_SESSION['totalamount'];?></span></td></tr>
</table>
<!---上面的代码增加了一个移除的按钮,点击就会触发remove_to_cart()函数,有两个参数,第一个this表示是按钮本身,方便把商品信息去掉,见下面分析,第二个参数key,是商品的标识符,方便销毁$_SESSION[$key]这个变量。-->
 
<!--我们先分析一下js代码remove_to_car()函数应该怎么写。第一个肯定是把参数key传递给remove_to_cart.php页面。第二个就是把移出购物车的商品信息从页面中去掉。第三个就是更改页面的总金额。-->
<script type="text/javascript">
function remove_to_cart(myInput,key){
createXMLHttpRequest(); //创建一个XMLHttpReques对象。最终会把所有的js代码放在同一个文件,所以就不必重复写createXMLHttpRequest()这个函数了。
var postStr="key="+key;
xmlHttp.open("post", "remove_to_cart.php");  //设置请求的页面,这里为remove_to_cart.php;
xmlHttp.setRequestHeader("cache-control","no-cache"); 
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
xmlHttp.send(postStr);
xmlHttp.onreadystatechange=function(){
if(xmlHttp.readyState==4 & xmlHttp.status==200){
//myINput表示按钮本身,它的父元素是td,td的父元素是tr,我们把tr设为隐藏,也就删除了商品信息了。
myInput.parentNode.parentNode.style.display="none";
//下面这句更改移除后商品的总金额,xmlHttp.responseText为返回的总金额。
document.getElementById("totalamount").innerHTML=xmlHttp.responseText;
}else  alert("移除失败");
}
}
</script>
<!--上面的js代码把参数key作为参数以poss方式传递给remove_to_cart.php,请求成功后删除该商品信息并更改商品总金额。-->

下面我们看一下remove_to_cart.php代码是怎么写的。

<?php
session_start();
ob_start();
if($_POST['key']){
$key=$_POST['key'];
//第一步先更改商品总金额。
$num=$_SESSION[$key]['num'];
$price=$_SESSION[$key]['price'];
//之前我们已经把总金额保存在$_SESSION['totalamount']里了,所以这里只需减去移除商品的金额就可以了。
$_SESSION['totalamount']-=$num*$price;
//第二步销毁该商品的变量。
unset($_SESSION[$key]);
echo $_SESSION['totalamount']; //返回更改后的总金额。
}
?>

ok,搞定了,如有任何问题,欢迎留言指出。

php+ajax购物车的基本原理--加入购物车

2010-04-17

最近在帮一个同学做一个小型的网店系统,所以简单分享一下自己是如何运用这个php购物车的基本原理。

简单来说,php购物车的基本原理就是用$_SESSION来临时保存客户的订单信息。一个$_SESSION变量保存一件商品的信息,所以要求每件商品都有一个惟一的标识符。
首先我们假设有以下两件商品:
cvgirl
我们新建三个文件:productlist.php------商品展示
check_out.php------结账页面,并显示购物车的商品信息。
add_to_cart.php-----ajax请求的页面,用来把商品信息加入购物车。
编码统一为utf-8,如出现乱码,请看一下php乱码问题的解决方案
首先看一下productlist.php的页面代码:

<!-- 这里我为了简化,只把商品的基本信息列出来。-->
<form>
<table>
<!-- key字段为商品的惟一标识符,值必须确保是惟一的。
    把key、shoename、shoeprice字段设为隐藏,一个是为了方便获取信息,另一个是为了界面比较好看。 
 -->
<input type="hidden" name="key" value="shoe1">
<input type="hidden" name="shoename" value="经典红色低帮">
<input type="hidden" name="shoeprice" value="200">
<tr><td>经典红色低帮</td></tr>
<tr><td><select name="shoesize"><option value="35">35<option value="36">36</option></td></tr>
<tr><td><input type="text" name="shoenum" value="1"></td></tr>
<tr><td>200</td></tr>
<tr><td><input type="button" value="加入购物车" onclick="add_to_cart(this.form);">
</table>
</form>
<!-- ok,上面的代码列出了商品1的基本信息,点击加入购物车就会触发add_to_cart()函数,我们看一下js代码是怎么写的。-->
<script type="text/javascript">
//用过ajax的都知道下面这个函数是创建XMLHttpReques对象的通用函数,这里就不讲解了。
function createXMLHttpRequest(){
if(window.ActiveXObject)
xmlHttp=new ActiveXObject("Microsoft.XMLHttp");
else if(window.XMLHttpRequest)
xmlHttp=new XMLHttpRequest();
 }
//参数myform,每一件商品给它分配一个form表单,这样就很容易获取每件商品的信息了。
function add_to_cart(myform){
createXMLHttpRequest(); //创建一个XMLHttpReques对象。
var key=myform.key;
var shoename=myform.shoename;
var shoesize=myform.shoesize;
var shoenum=myform.shoenum;
var shoeprice=myform.price;
//用来传递的参数,我这里选择的是用post方式传送。
var postStr="key="+key+"&name="+shoename+"&size="+shoesize+"&num="+shoenum+"&price="+shoeprice;
xmlHttp.open("post", "add_to_cart.php");  //设置请求的页面,这里为add_to_cart.php;
xmlHttp.setRequestHeader("cache-control","no-cache"); 
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
xmlHttp.send(postStr);
xmlHttp.onreadystatechange=function(){
if(xmlHttp.readyState==4 & xmlHttp.status==200){
alert(xmlHttp.responseText);
}else  alert("添加失败");
}
}
</script>
<!--以上的js代码获取了商品的基本信息,并把它作为参数以post的方式传递给add_to_cart.php。-->

下面我们看一下add_to_cart.php页面的代码。

<?php
session_start();
ob_start();//是为了防止出现Cannot modify header information之类的问题,可看一下http://www.googlephp.cn/archives/21这篇文章。
if($_POST['key']){
$key=$_POST['key'];
$name=$_POST['name'];
$size=$_POST['size'];
$num=$_POST['num'];
$price=$_POST['price'];
//我们把每一件商品信息都保存在$_SESSION['key']数组里。
//下面是一个逻辑判断,如果该商品是第一次加入购物车,就新创建一个$_SESSION['key']数组,否则数量就累加。
if(!isset($_SESSION[$key])){    //不存在$_SESSION[$key]这个变量,表示是第一次加入购物车。
$_SESSION[$key]['name']=$name;
$_SESSION[$key]['size']=$size;
$_SESSION[$key]['num']=$num;
$_SESSION[$key]['price']=$price;
} else{
$_SESSION[$key]['num']+=$num;
} 
echo "加入购物车成功";  //作为返回信息。
}
//以上的php代码程序显示了如何保存每一件加入购物车的基本信息。
?>

最后我们看一下check_out.php页面的代码。

<?php
session_start();
ob_start();
$_SESSION['totalamount']=0; //用来保存商品的总金额。
/*如何循环输出购物车的商品信息,第一个我想到是循环输出$_SESSION数组,但是print_r($_SESSION);会发现一个问题:$_SESSION数组不仅保存着商品信息,还保存着其它乱七八糟的信息,那样的话我们就需要对这个数组进行过滤,把商品信息提取出来。于是我想到可不可以用商品的标识符key来作判断呢,如果还有某个字符串就是我们需要的商品信息,上面我们商品1的key为shoe1,于是我们可以帮其它商品的key取值为shoe2,shoe3,shoe4....,这样我们的key都包含了"shoe"这个字符串。看下面代码是怎么过滤$_SESSION的。
*/
$products=array(); // 用来保存$_SESSION过滤后的商品信息。
foreach($_SESSION as $key=>$value){
if(strstr($key,"shoe")){     //包含"shoe字符串的才是我们真正需要的商品信息。"
$products[$key]['name']=$value['name'];
$products[$key]['size']=$value['size'];
$products[$key]['num']=$value['num'];
$products[$key]['price']=$value['price'];
$_SESSION['totalamount']+=$value['num']*$value['price'];
}
}
//接下来我们就循环输出购物车每个商品的信息。
?>
<table>
<tr><td>商品</td><td>大小</td><td>数量</td><td>价格</td></tr>
<?php foreach($products as $product){ ?>
<tr>
<td><?php echo $product['name'];?></td>
<td><?php echo $product['size'];?></td>
<td><?php echo $product['num'];?></td>
<td><?php echo $product['num']*$product['price'];?></td>
</tr>
<?php } ?>
<tr><td colspan="4">总金额为:<?php echo $_SESSION['totalamount'];?></td></tr>
</table>

ok,php购物车的简单基本原理就是这样了,最后我没有加入付账的链接了,假如需要提交给支付宝接口,只需在支付宝接口代码那里循环输出$_SESSION(过滤后的商品信息)就可以了。以上代码纯手工输入,未经测试,如有问题,欢迎指出。

php安装程序的基本原理

2010-03-05

当我们写了一个网站程序想分享给别人一起使用时,通常我们都会把数据库表的结构、表的初始化数据导出来,以方便他人导入数据库。但为何我们不写个安装程序,只要填写了主机,连接数据库的用户名跟密码、要创建的数据库名,程序就会帮我们创建数据库、表、初始化表的数据。所以写安装程序主要出于两个目的:第一个是方便自己移植自己的网站,第二个就是方便别人使用你的程序。下面就简单介绍一下php安装程序的基本原理。

简单步骤如下:
1、写一个form表单供用户填写主机名$host,连接数据库的用户名$user跟密码$password,要创建的数据库名$dbname。
2、将获得表单的数据写入一个配置文件config.php,以方便其它文件来调用数据库的信息。
3、调用配置文件include_once("config.php"),写程序进行数据库的连接,创建数据库、创建表、初始化表的数据。

ok,首先开始第一步

<form action="install.php" method="post">
填写主机:<input type="text" name="host">本地主机为localhost<br />
连接数据库的用户名:<input type="text" name="user"><br />
连接数据库的密码:<input type="text" name="password"><br />
要创建的数据库名:<input type="text" name="dbname"><br />
<input type="submit" name="install" value="安装">
</form>

2、将获得表单的数据写入一个配置文件config.php,以方便其它文件来调用数据库的信息。

<?php
header("Content-type:text/html;charset=gb2312") //看你用的是什么编码,要保持一致。
$files="config.php"; //要写入的配置文件。
if(!is_writable($files)){    //判断是否有可写的权限,linux操作系统要注意这一点,windows不必注意。
    echo "<font color=red>文件不可写</font>";
      exit();
}
if($_POST['install']){  //获取用户提交的数据。
$host=$_POST['host'];
$user=$_POST['user'];
$password=$_POST['password'];
$dbname=$_POST['dbname'];
 
$config="<?php ";        //$config的内容就是要写入配置文件的内容。
$config.="\n";            //   \n是用来换行的。
$config.="\$host='".$host."';";
$config.="\n";  
$config.="\$user='".$user."';";
$config.="\n";  
$config.="\$password='".$password."';";
$config.="\n";  
$config.="\$dbname='".$dbname."';";
$config.="\n";  
$config.="?>";
 
$file = fopen($files, "w");   //以写入的方式打开config.php这个文件。
fwrite($file,$config);  //将配置信息写入config.php文件。
fclose($file);
}
?>

3、调用配置文件include_once("config.php"),写程序进行数据库的连接,创建数据库、创建表、初始化表的数据。

<?php
include_once("config.php");   //导入配置信息.
if(!$conn=@mysql_connect($host,$user,$password)){
       echo "连接数据库失败!请返回上一页检查连接参数 <a href='javascript:history.go(-1)'><font color=#ff0000>返回修改</font></a>";
       exit();
}else{
  mysql_query("set names gb2312");  //设置数据库的编码,注意要与前面一致。
   if(!mysql_select_db($dbname,$conn)){   //如果数据库不存在,我们就进行创建。
         $dbsql="CREATE DATABASE `$dbname`";
         if(!mysql_query($dbsql)){
           echo "创建数据库失败,请确认是否有足够的权限!<a href='javascript:history.go(-1)'><font color=#ff0000>返回修改</font></a>";
           exit();
          }
   }
//下面根据你实际的表的结构跟初始化表的数据来写,这些sql语句,我们在导出时可以找到。
   //新建一个表test1
   $sql_query[] = "CREATE TABLE `test1` (   
                 `id` int(4) NOT NULL auto_increment,
                 `name` varchar(20) character set gb2312 NOT NULL,
                 `major` varchar(40) character set gb2312 NOT NULL,
                  PRIMARY KEY  (`id`)
                  ) ENGINE=InnoDB  DEFAULT CHARSET=gb2312 AUTO_INCREMENT=1;";
    //新建一个表test2
    $sql_query[] = "CREATE TABLE `test2` (   
                 `id` int(4) NOT NULL auto_increment,
                 `name` varchar(20) character set gb2312 NOT NULL,
                 `major` varchar(40) character set gb2312 NOT NULL,
                  PRIMARY KEY  (`id`)
                  ) ENGINE=InnoDB  DEFAULT CHARSET=gb2312 AUTO_INCREMENT=1;";
     //为test1表默认初始化一些数据。
     $sql_query[]="INSERT INTO `test1` (`name`, `major`) VALUES('张三','电子商务')";
     foreach($sql_query as $sql){
            if(!mysql_query($sql)){      //依次执行以上的sql语句,就是创建表和初始化数据。
            echo "创建表失败或者初始化数据失败";
                exit();
           }
     }
     mysql_close();
     echo "安装成功";//可以做一个跳转到首页。
     exit();
}
?>

有人或许为问,直接把表单提交的数据来进行安装不就可以了,为什么还要写入配置信息文件呢,这个是因为为了方便其它要使用到数据库的文件来连接数据库。嗯,到这里,这个安装程序的原理就差不多了,自己可以去完善一下,写一个更好的安装程序来,有什么问题欢迎留言指出。

完整的程序如下:写进同一个文件install.php。运行install.php就可以进行安装了。
install.php

php乱码问题的解决方案

2010-03-04

php乱码问题一直是困扰初学者的一个很大问题。这里我分享一下我的解决方案,至少对我来说,用了这种方法之后就没出现过乱码问题了。

首先我们要搞清楚如下几个编码的概念:
①文件编码:每新建一个文件都会有对应的一个编码,把文件另存为就可以查看它的编码类型了。
wjbm

②页面编码,也就是浏览器以什么编码来显示你的网页,打开这个网页,鼠标右击就可以查看它的编码类型了。

③数据库编码。这里不是指建数据库时设置的编码,而是说指你的程序要连接数据库时,设置你读取数据的编码,通常这样设置mysql_query("set names GBK")或者mysql_query("set names gb2312")或者mysql_query("set names utf8")注意是utf8不是utf-8。

我们搞清了以上几个概念就好办了,使编码统一就可以解决乱码的问题了。
①在没有连接数据库的情况下,使页面编码跟文件编码统一就可以防止出现乱码了。上面说了,文件编码可以另存为查看,那页面编码怎么设置呢?如果用php语句就是在最前面加上header("Content-type=text/html;charset=文件编码");注意使用header()函数前不能有任何HTML输出。如果用HTML语法呢就是在<head></head>标记间加上<meta http-equiv="Content-Type" Content="text/html;charset=文件编码" />。
小提示:文件编码为GBK,ANSI,gb2312,页面编码都可以设置为gb2312即header("Content-type=text/html;charset=gb2312");
文件编码为utf-8时,页面编码就设置为utf-8,不过要注意utf-8的两种模式,这里有解决方案:http://www.googlephp.cn/archives/21

②在有连接数据库的情况下,使三者的编码统一就可以了。
文件编码跟页面编码是GBK,ANSI,gb2312情况下,在连接数据库后加上mysql_query("set names gb2312")或者mysql_query("set names GBK");
文件编码跟页面编码是utf-8时,在连接数据库后加上mysql_query("set names utf8"),注意后面那个utf8是没有“-”的。

有任何问题欢迎留言指出。