• 2017.8.15


    一、PHP JSON

    环境配置

    在 php5.2.0 及以上版本已经内置 JSON 扩展。


    JSON 函数

    函数描述
    json_encode 对变量进行 JSON 编码
    json_decode 对 JSON 格式的字符串进行解码转换为 PHP 变量
    json_last_error 返回最后发生的错误

    1、json_encode

    PHP json_encode() 用于对变量进行 JSON 编码,该函数如果执行成功返回 JSON 数据,否则返回 FALSE

    语法

    string json_encode ( $value [, $options = 0 ] )

    参数

    • value: 要编码的值。该函数只对 UTF-8 编码的数据有效。
    • options:由以下常量组成的二进制掩码:JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK,JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT

    实例

    以下实例演示了如何将 PHP 数组转换为 JSON 格式数据:

    <?php
       $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
       echo json_encode($arr);
    ?>

    以上代码执行结果为:

    {"a":1,"b":2,"c":3,"d":4,"e":5}

    以下实例演示了如何将 PHP 对象转换为 JSON 格式数据:

    <?php
       class Emp {
           public $name = "";
           public $hobbies  = "";
           public $birthdate = "";
       }
       $e = new Emp();
       $e->name = "sachin";
       $e->hobbies  = "sports";
       $e->birthdate = date('m/d/Y h:i:s a', "8/5/1974 12:20:03 p");
       $e->birthdate = date('m/d/Y h:i:s a', strtotime("8/5/1974 12:20:03"));
    
       echo json_encode($e);
    ?>

    以上代码执行结果为:

    {"name":"sachin","hobbies":"sports","birthdate":"08/05/1974 12:20:03 pm"}

    2、json_decode

    PHP json_decode() 函数用于对 JSON 格式的字符串进行解码,并转换为 PHP 变量。

    语法

    mixed json_decode ($json [,$assoc = false [, $depth = 512 [, $options = 0 ]]])

    参数

    • json_string: 待解码的 JSON 字符串,必须是 UTF-8 编码数据

    • assoc: 当该参数为 TRUE 时,将返回数组FALSE 时返回对象。默认为FALSE

    • depth: 整数类型的参数,它指定递归深度

    • options: 二进制掩码,目前只支持 JSON_BIGINT_AS_STRING 。

    实例

    以下实例演示了如何解码 JSON 数据:

    <?php
       $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
    
       var_dump(json_decode($json));
       var_dump(json_decode($json, true));
    ?>

    以上代码执行结果为:

    object(stdClass)#1 (5) {
        ["a"] => int(1)
        ["b"] => int(2)
        ["c"] => int(3)
        ["d"] => int(4)
        ["e"] => int(5)
    }
    
    array(5) {
        ["a"] => int(1)
        ["b"] => int(2)
        ["c"] => int(3)
        ["d"] => int(4)
        ["e"] => int(5)
    }

    二、PHP MySQL 预处理语句


    预处理语句对于防止 MySQL 注入是非常有用的。


    2.1、预处理语句及绑定参数

    预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。

    预处理语句的工作原理如下:

    1. 预处理创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如:

      INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
    2. 数据库解析,编译对SQL语句模板执行查询优化,并存储结果不输出

    3. 执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。

    相比于直接执行SQL语句,预处理语句有两个主要优点:

    • 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。

    • 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。

    • 预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。


    2.2、MySQLi 预处理语句

    实例 (MySQLi 使用预处理语句)

    <?php
    $servername = "localhost";
    $username = "username";
    $password = "password";
    $dbname = "myDB";
     
    //1、 创建连接
    $conn = new mysqli($servername, $username, $password, $dbname); 
    // 检测连接
    if ($conn->connect_error) {
        die("连接失败: " . $conn->connect_error);
    }
     
    //2、 预处理及绑定
    $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
    $stmt->bind_param("sss", $firstname, $lastname, $email);
     
    //3、 设置参数并执行
    $firstname = "John";
    $lastname = "Doe";
    $email = "john@example.com";
    execute函数是用于执行已经预处理过的语句,只是返回执行结果成功或失败。也就是说execute需要配合prepare函数使用,
    这个的确是麻烦了一点,每次都要先prepare,然后才能exec。
    $stmt->execute();//插入第一条数据

    $firstname = "Mary";
    $lastname = "Moe";
    $email = "mary@example.com";
    $stmt->execute(); //插入第二条数据
    echo "新记录插入成功"; $stmt->close(); $conn->close();//关闭数据库连接 ?>

    解析以下实例的每行代码:

    "INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"

    在 SQL 语句中,我们使用了问号 (?),在此我们可以将问号替换为整型,字符串,双精度浮点型和布尔值

    接下来,让我们来看下 bind_param() 函数

    $stmt->bind_param("sss", $firstname, $lastname, $email);

    该函数绑定了 SQL 的参数,且告诉数据库参数的值。 "sss" 参数列其余参数的数据类型。s 字符告诉数据库该参数为字符串。

    参数有以下四种类型:

    • i - integer(整型)
    • d - double(双精度浮点型)
    • s - string(字符串)
    • b - BLOB(binary large object:二进制大对象)

    每个参数都需要指定类型,即参数个数和前面的类型个数必须一致

    通过告诉数据库参数的数据类型,可以降低 SQL 注入的风险

     

  • 相关阅读:
    Docker(四):Docker基本网络配置
    Docker(三):Docker仓库配置
    Docker(二):Docker镜像使用
    OpenStack运维(四):OpenStack备份恢复
    OpenStack运维(三):OpenStack存储节点和配置管理
    OpenStack运维(二):OpenStack计算节点的故障和维护
    Eclipse Pydev添加MySQLdb模块,Windows下安装MySQL-python
    动态规划部分心得体会
    死亡骑士买道具
    动态规划部分知识点总结
  • 原文地址:https://www.cnblogs.com/yang01/p/7360434.html
Copyright © 2020-2023  润新知