Blogger Information
Blog 32
fans 0
comment 0
visits 19973
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
0424 php mysql 的预处理
田亢的博客
Original
1046 people have browsed it

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


实例

<?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);

运行实例 »

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





Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post