hi
昨天又213了,虽然有室友3点多才睡觉的客观影响,但是昨晚不想学东西是本质原因。今天搞起。打算3、4天之内,学完PDO和AJAX这两个,还望大家没事儿来骂骂我,免的我又偷懒。
1、PDO
二、PDO对象的使用(二)
2.2 错误信息
errorCode()——错误号;
errorInfo()——错误信息;
举个栗子
/*
* PDO错误信息
*/
$pdo=new PDO('mysql:host=localhost;dbname=imooc','root','');
$pdo->exec('use imooc_pdo');
$resultd=$pdo->exec('delete from user where id=13');
var_dump($resultd);
$insert='insert user(username,password,email) values("Knga","'.md5('king').'","shit@shit.com")';
$result1=$pdo->exec($insert);
var_dump($result1);
if ($result1==false) {
echo "出错了";
echo $pdo->errorCode();
print_r($pdo->errorInfo());
}
看一下错误信息
Array ( [0] => 23000 [1] => 1062 [2] => Duplicata du champ 'Knga' pour la clef 'username' )
0为错误类型,1062是代码,2是错误信息;(这里是由于username设置为了unique键,但是id号是还在增长的其实)。
2.3 query()实现查询
执行一条语句,返回一个PDOstatement对象。
--举个栗子
/*
* PDOquery
*/
$pdo=new PDO('mysql:host=localhost;dbname=imooc','root','');
$pdo->exec('use imooc_pdo');
$insert='select * from user';
$result1=$pdo->query($insert);
var_dump($result1); //查看statement对象
foreach ($result1 as $row){ //查看输出结果(根据返回情况)
print_r($row);
}
if ($result1==false) {
echo "出错了";
echo $pdo->errorCode();
print_r($pdo->errorInfo());
}
如果sql语句有问题的话,statement对象是false,然后后面的输出也是错误信息;
如果sql语句正确,但查询的内容是不存在的,那么statement对象没问题,然后输出为空。
当然这样会好看一些:
foreach ($result1 as $row){ //查看输出结果(根据返回情况)
// print_r($row);echo "
";
echo '编号:'.$row['id'];echo "
";
echo '用户名:'.$row['username'];echo "
";
echo '密码:'.$row['password'];echo "
";
echo '邮箱:'.$row['email'];echo "
";
echo "
当然,query执行增删改都是没问题的。
2.4 prepare()和execute()方法实现查询
推荐使用的查询方法,可以实现条件查询。
prepare()——准备要执行的SQL语句,返回PDOstatement对象;
execute()——执行一条预处理语句,返回true或false;
所以上面是一对。
--举个例子
/*
* PDOprepare&execute方法
*/
$pdo=new PDO('mysql:host=localhost;dbname=imooc','root','');
$pdo->exec('use imooc_pdo');
$insert='select * from user where username="king"';
$result=$pdo->prepare($insert);
var_dump($result);
$result1=$result->execute();//执行是对预处理语句
var_dump($result1);
print_r($result->fetchAll());//对statement对象才能有结果输出
if ($result1==false) {
echo "出错了";
echo $pdo->errorCode();
print_r($pdo->errorInfo());
}
这里要小心预处理这种特殊情况,分清楚对象到底是谁就好办了。
--选取输出形式
要关联数组输出或者全部或者索引数组,有参数和方法两种不同的方法。
header('content-type:text/html;charset=utf-8');
try{
$pdo=new PDO('mysql:host=localhost;dbname=imooc','root','root');
$sql='select * from user';
$stmt=$pdo->prepare($sql);
$res=$stmt->execute();
// if($res){
// while($row=$stmt->fetch(PDO::FETCH_ASSOC)){//仅需要关联数组输出
// print_r($row);
// echo '
一般的我们都是想要索引数组的。
2.5 设置数据库连接属性
setAttribute()——设置数据库连接属性;
getAttribute()——得到数据库连接属性;
--举个例子
$pdo=new PDO('mysql:host=localhost;dbname=imooc','root','');
echo "自动提交".$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);echo "
然后试着得到一大波属性信息:
$attrArr=array(
'AUTOCOMMIT','ERRMODE','CASE','PERSISTENT','SERVER_INFO','SERVER_VERSION'
);
foreach ($attrArr as $attr){
echo "PDO::ATTR_$attr: ";
echo $pdo->getAttribute(constant("PDO::ATTR_$attr"))."
";
}
有些是没有的,会有错误信息,没什么关系。
三、PDOstatement对象的使用
3.1 quote()方法防止SQL注入
--SQL注入
首先举个例子说明这个简单的SQL注入(其实我也不是很懂——百度一下http://baike.baidu.com/link?url=jiMtgmTeePlWAqdAntWbk-wB8XKP8xS3ZOViJE9IVSToLP_iT2anuUaPdMEM0b-VDknjolQ8BdxN8ycNLohup_)
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
所以也就是要有表单,然后需要跟数据库进行查询数据等等,然后通过恶意的运用规则上的漏洞,得到大量的,而不是页面所希望的数据。栗子如下:
例子为登录的情况——登录需要有用户名密码等,需要与数据库中的信息进行比对;
首先是登录页面