sql注入和如何防止

在这里和大家说一个技术  

pdo技术  PDO就是PHP data Object 提供了PHP操作多种数据库的统一的接口 

和MySQL的不同就是 pdo可以操作多种数据库  MySQL就能操作一个

 PDO是PHP5新加入的一个重大功能,我们的数据库服务器为MySQL,所有的程序代码的数据库操作全是一mysql()或者mysqli()函数来操作,当我们的数据库 需要更换时比如换成,SQL、SERVER、PostgreSQL、MS 等,我们不可能去修改所有的程序代码!所以就要用到PDO,PDO很好的帮我们解决了这个问题,使用PDO操作非常方便,只需要修改数据源格式,和加载相应的驱动文件到PHP.ini即可;

特点

           1)编码的一致性
            2)灵活性
            3)面向对象特性
            4)高性能

用法

修改

打开PHP配置文件php.ini,找到php_pdo_mysql.dll这行去掉前面你的分号

  打开PHP配置文件php.ini,找到extension_dir,这个就是我们扩展存在的目录,首先去掉前面的分号,然后修改扩展目录,我的扩展目录是在"E:/Web/php/ext",就改成extension_dir="E:/Web/php/ext"。

然后重启apache

//使用方法
连接数据库、数据库的用户名、数据库的密码
                                语法:$dsn =“数据库类型:dbname=数据库名;host=数据库的域名”;
                                          $user = "数据库的用户名";
                                          $password = "数据库的密码";
                                例:$dsn = "mysql:dbname=test;host=127.0.0.1";
                                       $user = "root";
                                        $password="123456";
                         (2)声明对象
                                    $object = new PDO($dsn,$user,$password);
//添加代码


<?php  
header('content-type:text/html;charset=utf8');  
//连接数据库  
$dsn="mysql:dbname=test;host=127.0.0.1";  
//数据库的用户名  
$user="root";  
//数据库的密码  
$password="123456";  
//生成PDO对象  
$object = new PDO($dsn,$user,$password);  
//执行添加  
$sql="insert into student(`name`,`sex`,`sex`) values('zhangsan','男','18')";  
if($object->exec($sql)){  
    echo '添加成功';  
}  

//查询

<?php  
header('content-type:text/html;charset=utf8');  
//连接数据库  
$dsn="mysql:dbname=test;host=127.0.0.1";  
//数据库的用户名  
$user="root";  
//数据库的密码  
$password="123456";  
//生成PDO对象  
$object = new PDO($dsn,$user,$password);  
  
$sql="select * from student";  
$result = $object->query($sql);  
while($arr=$result->fetch()){  
    print_r($arr);  
}  

//另一种查询

$data=$result->fetchAll();  
print_r($student_info);  

这是pdo的使用  但是这样写我们的安全很差

因为我么只要知道其中一个用户名 我们使用 用户名 ‘OR’1‘=’1 这样的格式就可以把用户名的密码给破解出来 

但是我们是可以预防的  我们有一个预处理方式



PDO预处理 
PDOStatement类:准备语句,处理结果集
    也就是预处理,安全,高效,推荐使用


    两种占位符号:?参数         索引数组,按索引顺序使用
                 名子参数      关联数组,按名称使用,和顺序无关,以冒号开头,自己定义


    $stmt=$pdo->prepare($sql);     $sql可是是任意sql语句,这与mysqli不同


两种点位符号


<?php
  try{
    $pdo=new PDO("mysql:host=localhost;dbname=mysqldb","root","snail");
  }catch(PDOException $e){
    echo $e->getMessage();
  }


  //准备一条语句,并放到服务器端,而且编译
  $stmt=$pdo->prepare("insert into shop(name,price)values(?,?)");
//  $stmt=$pdo->prepare("insert into shop(name,price)values(:na,:pr)");


  //绑定参数(变量和参数绑定)
  $stmt->bindparam(1,$name);
  $stmt->bindparam(2,$price);


//  $stmt->bindparam(":na",$name);
//  $stmt->bindparam(":pr",$price);


  $name="liwu11";
  $price=234.4311;


  if($stmt->execute()){
    echo "执行成功";
    echo "最后插入的ID:".$pdo->lastInsertId();
  }else{
    echo "执行失败";
  }
?>


<?php
//以数组方式向服务器传值 


 try{
    $pdo=new PDO("mysql:host=localhost;dbname=mysqldb","root","snail");
  }catch(PDOException $e){
    echo $e->getMessage();
  }


  $stmt=$pdo->prepare("select * from shop where id >:id");


  $stmt->execute(array(':id'=>130));


  $row=$stmt->fetch();
  print_r($row);
  echo '<br>';
?>


<?php


//用fetch(),fetchAll()来获取查询结果
  try{
    $pdo=new PDO("mysql:host=localhost;dbname=mysqldb","root","snail");
  }catch(PDOException $e){
    echo $e->getMessage();
  }


  $stmt=$pdo->prepare("select * from shop where id >:id");


  $stmt->execute(array(':id'=>130));


/*  单条获取fetch()
  $stmt->setFetchMode(PDO::FETCH_ASSOC);  //设置获取模式
  while($row=$stmt->fetch()){
    print_r($row);
    echo '<br>';
  }
*/


  //多条获取fetchAll()
//  $stmt->setFetchMode(PDO::FETCH_ASSOC);
  $data=$stmt->fetchAll(PDO::FETCH_ASSOC);  //也可以用上句进行设置
  echo '<pre>';
  print_r($data);
  echo '</pre>';
?>


<?php
//以表格输出查询结果 


try{
    $pdo=new PDO("mysql:host=localhost;dbname=mysqldb","root","snail");
  }catch(PDOException $e){
    echo $e->getMessage();
  }


  $stmt=$pdo->prepare("select id,name,price from shop where id >:id");


  $stmt->execute(array(':id'=>130));


  $stmt->bindColumn(id,$id);
  $stmt->bindColumn(name,$name);
  $stmt->bindColumn(price,$price);


  echo '<table border=1 align="center" width=800px>';
  echo '<tr>';
  for($i=0;$i<$stmt->columncount();$i++){
    $field=$stmt->getColumnMeta($i);
    echo '<th>'.$field["name"].'</th>';
  }
  echo "</tr>";




  while($stmt->fetch()){
    echo '<tr>';
    echo '<td>'.$id.'</td>';
    echo '<td>'.$name.'</td>';
    echo '<td>'.$price.'</td>';
    echo '</tr>';
  }


  echo '</table>';


  echo "行:".$stmt->rowcount()."<br>";
  echo "列:".$stmt->columncount()."<br>";


?>

用这种方式就很安全

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值