博客列表 >0424 php mysql 的预处理

0424 php mysql 的预处理

田亢的博客
田亢的博客原创
2018年04月26日 17:49:071041浏览

结果集中的记录指针与遍历操作


实例

<?php


require 'mysql_connect.php';

if ($res = mysqli_query($db, "select * from staff limit 5")) {
    while($row = mysqli_fetch_assoc($res)){
        print_r($row); echo '<br>';
    }

    echo '<hr>';
    //将结果集中的记录指针定位到0,即第1条记录
    mysqli_data_seek($res,0);
    print_r(mysqli_fetch_assoc($res));
    echo '<br>';
    //将结果集中的记录指针定位到2,即第3条记录
    mysqli_data_seek($res,2);
    print_r(mysqli_fetch_assoc($res));
    echo '<br>';
    //那么最后一条记录的指针是多少呢?对,行数-1
    mysqli_data_seek($res,mysqli_num_rows($res)-1);
    print_r(mysqli_fetch_assoc($res));
    echo '<br>';

    //知道规律了,下面我们用for循环来遍历这个这个结果集
    echo '<hr color="red">';
    for($i=0; $i<mysqli_num_rows($res); $i++) {
        mysqli_data_seek($res,$i);
        print_r(mysqli_fetch_assoc($res));
        echo '<br>';
    }

    //恭喜大家又学到了一种遍历结果集的方法
}

mysqli_close($db);

运行实例 »

点击 "运行实例" 按钮查看在线实例

预处理结果集操作

实例

//过程化风格
/*
 * SELECT 语句和其他的SQL查询命令不同,它需要处理查询结果。SQL语句的执行也需要使用
 * mysqli_stmt对象中的execute方法,但与mysqli对象中的query方法不同,execute方法的饭
 * 返回值并不是一个mysqli_result对象。mysqli_stmt对象提供了一种更为精巧的办法来处理
 * select语句查询结果:在使用execute方法执行SQL语句完成查询之后,使用mysqli_stmt对象
 * 中的bind_result方法,把查询结果的各个数据列绑定到一些PHP变量上;然后使用mysqli_stmt
 * 对象中的fetch方法把下一条结果记录读取到这些变量里。如果成功地读入下一条记录fetch方法
 * 返回true,否则返回false,或者已经读完所有的结果返回false
 *
 *
 * 默认情况下,select查询结果将留在MySQL服务器上,等待fetch方法把记录逐条取回到PHP程序中
 * ,赋给使用bind_result方法绑定的PHP变量上。如果需要对所有记录而不只是一小部分进行处理
 * ,可以调用mysqli_stmt对象中的store_result方法,把所有结果一次全部传回到PHP程序中
 * 这样做不仅更有效率,而且能减轻服务器的负担。store_result方法是可选的,除了读取数据
 * 不改变任何东西。
 */

<?php
//1.连接数据库
require 'mysql_connect.php';
//2.准备SQL语句
$sql = "SElECT name,salary FROM staff WHERE salary>? LIMIT 5;";
//3.创建stmt对象
$stmt = mysqli_stmt_init($db);
//4.检测SQL语句
if (mysqli_stmt_prepare($stmt, $sql)) {
    //5.参数绑定 该方法把预处理语句各有关参数绑定到一些PHP变量上,
    mysqli_stmt_bind_param($stmt, 'i',$salary); //i 表示int类型
    $salary = 3000;
    //6.执行查询 执行准备的预处理语句
    mysqli_stmt_execute($stmt);
    //7.获取结果集 从预处理语句中获取结果集
    mysqli_stmt_store_result($stmt);
    //8.将结果集中的列与变量进行绑定
    mysqli_stmt_bind_result($stmt,$name,$salary);
    //9.检测结果集是否为空
    if(mysqli_stmt_num_rows($stmt)>0){
        //10.遍历结果集 获取预处理语句结果的每条记录,并将相应的字段赋给绑定结果
        while (mysqli_stmt_fetch($stmt)) {
            echo "[{$name}] => {$salary}<br>";
        }
    } else {
        echo '没有符合条件的记录';
    }
} else {  //SQL语句错误
    exit(mysqli_stmt_errno($stmt).':'.mysqli_stmt_error($stmt));
}
//11.注销stmt对象
mysqli_stmt_close($stmt);
//12.关闭数据库连接
mysqli_close($db);

运行实例 »

点击 "运行实例" 按钮查看在线实例


*预处理
1.预处理技术,可以将动态变量,从SQL语句中的分离出来,单独操作
2.解决了SQL注入的安全问题
3.预处理操作是通过一个叫预处理对象的工具来操作的: STMT
基本步骤:
1.创建stmt预处理对象
2.检测SQL语句
3.参数绑定

4.执行查询
5.注销stmt预处理对象
6.关闭数据库连接

//更新操作

实例

<?php

//1.连接数据库
require 'mysql_connect.php'
//更新
$sql = "UPDATE staff SET salary=? WHERE name= ?";
$salary = 8000;
$name = '小龙女';
$stmt = mysqli_stmt_init($db);
//检测预处理语句是够正确,成功返回true,错误返回false
if (mysqli_stmt_prepare($stmt,$sql)){
 mysqli_stmt_bind_param($stmt,"is",$salary,$name);
 //执行SQL语句
    if (mysqli_stmt_execute($stmt)){
  //判断是否执行成功,受影响的数量
        if (mysqli_stmt_affected_rows($stmt)>0){
            echo '成功的更新了'.mysqli_stmt_affected_rows($stmt).'条记录';
        }else{
            echo '没有新增任何数据';
        }
 }else{ //返回SQL执行阶段的错误
        exit(mysqli_stmt_errno($stmt).':'.mysqli_stmt_error($stmt));
    }
}else{
    exit(mysqli_stmt_errno($stmt).":".mysqli_stmt_error($stmt));
}
mysqli_stmt_close($stmt);
mysqli_close($db);

运行实例 »

点击 "运行实例" 按钮查看在线实例

//删除操作

实例

<?php

require 'mysql_connect.php';

$sql = "DELETE FROM staff WHERE staff_id=?";
$staff_id = 5;

$stmt = mysqli_stmt_init($db);
//检测预处理语句是够正确,成功返回true,错误返回false
if (mysqli_stmt_prepare($stmt,$sql)){
    mysqli_stmt_bind_param($stmt,"i",$staff_id);

    //执行SQL语句
    if (mysqli_stmt_execute($stmt)){
        //判断是否执行成功,受影响的数量
        if (mysqli_stmt_affected_rows($stmt)>0){
            echo '成功的更新了'.mysqli_stmt_affected_rows($stmt).'条记录';
        }else{
            echo '没有新增任何数据';
        }
    }else{ //返回SQL执行阶段的错误
        exit(mysqli_stmt_errno($stmt).':'.mysqli_stmt_error($stmt));
    }
}else{
    exit(mysqli_stmt_errno($stmt).":".mysqli_stmt_error($stmt));
}
mysqli_stmt_close($stmt);
mysqli_close($db);

运行实例 »

点击 "运行实例" 按钮查看在线实例

一次新增多条

实例

<?php
 
//1.连接数据库
require 'mysql_connect.php';

//2.准备SQL语句
$sql = "INSERT IGNORE staff SET name=?;";

//3.创建stmt对象
$stmt = mysqli_stmt_init($db);

//4.检测SQL语句
if (mysqli_stmt_prepare($stmt, $sql)) {

    /* 参数绑定 */
    mysqli_stmt_bind_param($stmt, "s", $name);
    $name = '武松';

    /* 执行SQL语句 */
    mysqli_stmt_execute($stmt);
    echo '<br>新增了'.mysqli_stmt_affected_rows($stmt).'条记录,主键是:'.mysqli_stmt_insert_id($stmt);

    //再次添加新数据,只需要给新变量并执行一下就可以了
    $name = '西门庆';

    /* 执行SQL语句 */
    mysqli_stmt_execute($stmt);
    echo '<br>新增了'.mysqli_stmt_affected_rows($stmt).'条记录,主键是:'.mysqli_stmt_insert_id($stmt);

    $name = '武大郎';

    /* 执行SQL语句 */
    mysqli_stmt_execute($stmt);
    echo '<br>新增了'.mysqli_stmt_affected_rows($stmt).'条记录,主键是:'.mysqli_stmt_insert_id($stmt);



} else {
    exit(mysqli_stmt_errno($stmt).':'.mysqli_stmt_error($stmt));
}
/* 注销stmt对象 */
mysqli_stmt_close($stmt);

/* 关闭数据库连接 */
mysqli_close($db);

运行实例 »

点击 "运行实例" 按钮查看在线实例





声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议