• mysqli实现增删改查(转)


    1.面向对象
    在面向对象的方式中,mysqli被封装成一个类,它的构造方法如下:
    __construct ([ string $host [, string $username [, string $passwd [, string $dbname [, int $port [, string $socket ]]]]]] )
    在上述语法中涉及到的参数说明如下。
    l         host:连接的服务器地址。
    l         username:连接数据库的用户名,默认值是服务器进程所有者的用户名。
    l         passwd:连接数据库的密码,默认值为空。
    l         dbname:连接的数据库名称。
    l         port:TCP端口号。
    l         socket:UNIX域socket。
     

    要建立与MySQL的连接可以通过其构造方法实例化mysqli类,例如下面的代码:

    <?php  
        $db_host = "localhost";                                       //连接的服务器地址  
        $db_user = "root";                                            //连接数据库的用户名  
        $db_psw  = "root";                                            //连接数据库的密码  
        $db_name = "ikeepstudying";                                   //连接的数据库名称  
      
        // 创建连接  
        $conn    = new mysqli($db_host,$db_user,$db_psw,$db_name);  
      
        // 检测连接  
        if ($conn->connect_error) {  
            die("连接失败: " . $conn->connect_error);  
            // 或者使用  
            // die('Error : ('. $conn->connect_errno .') '. $conn->connect_error);  
        }  
        echo "连接成功";  
    ?>  

    mysqli还提供了一个连接MySQL的成员方法connect()。当实例化构造方法为空的mysqli类时,用mysqli对象调用connect()方法同样可连接MySQL,例如,下面的代码:

     
    <?php  
        $db_host = "localhost";                                 //连接的服务器地址  
        $db_user = "root";                                      //连接数据库的用户名  
        $db_psw  = "root";                                      //连接数据库的密码  
        $db_name = "ikeepstudying";                             //连接的数据库名称  
        $conn    = new mysqli();  
        $conn->connect($db_host,$db_user,$db_psw,$db_name);  
          
        // 检测连接  
        if ($conn->connect_error) {  
            die("连接失败: " . $conn->connect_error);  
            // 或者使用  
            // die('Error : ('. $conn->connect_errno .') '. $conn->connect_error);  
        }  
        echo "连接成功";  
    ?>  

    关闭与MySQL服务器的连接通过mysqli对象调用close()方法即可,例如:

     
    $conn->close();  
    2.面向过程
    在面向过程的方式中,mysqli扩展提供了函数mysqli_connect()与MySQL建立连接,该函数的语法格式如下:
    mysqli_connect ([ string $host [, string $username [, string $passwd [, string $dbname [, int $port [, string $socket ]]]]]] )

    mysqli_connect()函数的用法与mysql扩展中的mysql_connect()函数用法十分相似,下面是mysqli_connect()函数的用法示例:

     
    <?php  
        $servername = "localhost";  
        $username   = "username";  
        $password   = "password";  
        $database   = "ikeepstudying";  
      
        // 创建连接  
        $conn = mysqli_connect($servername, $username, $password, $database);  
      
        // 检测连接  
        if (!$conn) {  
            die("Connection failed: " . mysqli_connect_error());  
        }  
        echo "连接成功";  
    ?>  

    关闭与MySQL服务器的连接使用mysqli_close()函数,例如:

    mysqli_close(); 

    2. PHP MySQL 插入数据

    在创建完数据库和表后,我们可以向表中添加数据。

    以下为一些语法规则:

    • PHP 中 SQL 查询语句必须使用引号
    • 在 SQL 查询语句中的字符串值必须加引号
    • 数值的值不需要引号
    • NULL 值不需要引号

    INSERT INTO 语句通常用于向 MySQL 表添加新的记录:

    INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)  

    以下实例向 "MyGuests" 表添加了新的记录:

     
    1.面向对象
    <?php  
    $servername = "localhost";  
    $username = "username";  
    $password = "password";  
    $dbname = "ikeepstudying";  
      
    // 创建连接  
    $conn = new mysqli($servername, $username, $password, $dbname);  
    // 检测连接  
    if ($conn->connect_error) {  
        die("连接失败: " . $conn->connect_error);  
    }  
      
    $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')";  
      
    if ($conn->query($sql) === TRUE) {  
        echo "新记录插入成功";  
    } else {  
        echo "Error: " . $sql . "<br>" . $conn->error;  
    }  
      
    $conn->close();  
    ?>  

    插入多条记录:

    <?php  
    $servername = "localhost";  
    $username = "username";  
    $password = "password";  
    $dbname = "ikeepstudying";  
      
    // 创建链接  
    $conn = new mysqli($servername, $username, $password, $dbname);  
    // 检查链接  
    if ($conn->connect_error) {  
        die("连接失败: " . $conn->connect_error);  
    }  
      
    $sql = "INSERT INTO MyGuests (firstname, lastname, email)  
    VALUES ('John', 'Doe', 'john@example.com');";  
    $sql .= "INSERT INTO MyGuests (firstname, lastname, email)  
    VALUES ('Mary', 'Moe', 'mary@example.com');";  
    $sql .= "INSERT INTO MyGuests (firstname, lastname, email)  
    VALUES ('Julie', 'Dooley', 'julie@example.com')";  
      
    if ($conn->multi_query($sql) === TRUE) {  
        echo "新记录插入成功";  
    } else {  
        echo "Error: " . $sql . "<br>" . $conn->error;  
    }  
      
    $conn->close();  
    ?>  
    请注意,每个SQL语句必须用分号隔开。

    2.面向过程

     

     
    <?php  
    $servername = "localhost";  
    $username = "username";  
    $password = "password";  
    $dbname = "ikeepstudying";  
      
    // 创建连接  
    $conn = mysqli_connect($servername, $username, $password, $dbname);  
    // 检测连接  
    if (!$conn) {  
        die("Connection failed: " . mysqli_connect_error());  
    }  
      
    $sql = "INSERT INTO MyGuests (firstname, lastname, email)  
    VALUES ('John', 'Doe', 'john@example.com')";  
      
    if (mysqli_query($conn, $sql)) {  
        echo "新记录插入成功";  
    } else {  
        echo "Error: " . $sql . "<br>" . mysqli_error($conn);  
    }  
      
    mysqli_close($conn);  
    ?>  

    插入多条记录:

    <?php  
    $servername = "localhost";  
    $username = "username";  
    $password = "password";  
    $dbname = "ikeepstudying";  
      
    // 创建链接  
    $conn = mysqli_connect($servername, $username, $password, $dbname);  
    // 检查链接  
    if (!$conn) {  
        die("连接失败: " . mysqli_connect_error());  
    }  
      
    $sql = "INSERT INTO MyGuests (firstname, lastname, email)  
    VALUES ('John', 'Doe', 'john@example.com');";  
    $sql .= "INSERT INTO MyGuests (firstname, lastname, email)  
    VALUES ('Mary', 'Moe', 'mary@example.com');";  
    $sql .= "INSERT INTO MyGuests (firstname, lastname, email)  
    VALUES ('Julie', 'Dooley', 'julie@example.com')";  
      
    if (mysqli_multi_query($conn, $sql)) {  
        echo "新记录插入成功";  
    } else {  
        echo "Error: " . $sql . "<br>" . mysqli_error($conn);  
    }  
      
    mysqli_close($conn);  
    ?>  

    php5和新增了获取最新插入值的ID的函数:mysqli_insert_id($conn),和之前的mysql_insert_id()类似。

    都是用在insert语句之后获取最新的自动id号,要注意的是mysqli_insert_id(),括号里面的一定要是数据库连接而不是执行结果$result。

    程序实例:

     
    $conn   = new mysqli("127.0.0.1","root","","ikeepstudying") or die("数据库连接超时!");  
    $sql    = "insert into my_table (name,url) values('ikeepstudying','http://justcode.ikeepstudying.com')";  
    $result = $conn->query($sql) or die("失败");  
      
    echo mysqli_insert_id($conn); //输出刚刚插入数据的ID,注意:括号里面的要是$conn而不是$result  

    3. PHP MySQL 预处理语句

     

    预处理语句对于防止 MySQL 注入是非常有用的。使用预准备语句可提高重复使用语句的性能,在PHP中,使用prepare()方法来进行预准备语句查询,使用execute()方法来执行预准备语句。PHP有两种预准备语句:一种是绑定结果,另一种是绑定参数


     

    预处理语句, 绑定参数及绑定结果

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

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

    1. 预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如:
      1. INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)  
       
    2. 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。
    3. 执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。

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

    • 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。
    • 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。
    • 预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。

     

    MySQLi 预处理语句及绑定参数

    所谓绑定参数就是把PHP脚本中的自定义变量绑定到SQL语句中的参数(参数使用 “?”代替)上,绑定参数使用bind_param()方法,该方法的语法格式如下:
    bool bind_param ( string $types , mixed &$var1 [, mixed &$... ] )

    以下实例在 MySQLi 中使用了预处理语句,并绑定了相应的参数:

    <?php  
    $servername = "localhost";  
    $username = "username";  
    $password = "password";  
    $dbname = "ikeepstudying";  
      
    // 创建连接  
    $conn = new mysqli($servername, $username, $password, $dbname);  
      
    // 检测连接  
    if ($conn->connect_error) {  
        die("连接失败: " . $conn->connect_error);  
    }  
      
    // 预处理及绑定  
    $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)");  
    $stmt->bind_param("sss", $firstname, $lastname, $email);  
      
    // 设置参数并执行  
    $firstname = "John";  
    $lastname = "Doe";  
    $email = "john@example.com";  
    $stmt->execute();  
      
    $firstname = "Mary";  
    $lastname = "Moe";  
    $email = "mary@example.com";  
    $stmt->execute();  
      
    $firstname = "Julie";  
    $lastname = "Dooley";  
    $email = "julie@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 字符告诉数据库该参数为字符串。

    types:绑定的变量的数据类型,它接受的字符种类包括4个,如表所示。
    字符种类
    代表的数据类型
    i
    integer
    d
    double
    s
    string
    b
    blob
    参数types接受的字符的种类和绑定的变量需要一一对应。

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

    注意: 如果你想插入其他数据(用户输入),对数据的验证是非常重要的。

     

    MySQLi 预处理语句及绑定结果

    所谓绑定结果就是把PHP脚本中的自定义变量绑定到结果集中的相应字段上,这些变量就代表着所查询的记录,绑定结果的示例代码如下:

     
    <?php  
        $mysqli = new mysqli("localhost","root","root","ikeepstudying");     //实例化mysqli  
        $query  = "select * from MyGuests";  
        $result = $mysqli->prepare($query);                                  //进行预准备语句查询  
        $result->execute();                                                  //执行预准备语句  
        $result->bind_result($id,$firstname,$lastname,$email);                        //绑定结果  
        while ($result->fetch()) {  
            echo $id;  
            echo $firstname;  
            echo $lastname;  
            echo $email;  
        }  
        $result->close();                                                     //关闭预准备语句  
    ?>  

    在绑定结果的时候,脚本中的变量要与结果集中的字段一一对应,绑定完以后,通过fetch()方法将绑定在结果集中的变量一一取出来,最后将预准备语句和数据库连接分别关闭。

     

    MySQLi 同时绑定参数和绑定结果

    在一个脚本中还可以同时绑定参数和绑定结果,示例代码如下:

     
    <?php  
        $conn   = new mysqli("localhost","root","root","ikeepstudying");     //实例化mysqli  
        $query  = "select * from MyGuests where id < ?";  
        $result = $conn->prepare($query);  
        $result->bind_param("i",$id);                                    //绑定参数  
        $id=4;  
        $result->execute();  
        $result->bind_result($id,$number,$name,$age);                   //绑定结果  
        while ($result->fetch()) {  
            echo $id;  
            echo $firstname;  
            echo $lastname;  
            echo $email;  
        }  
      
        $result->close();  
        $conn->close();  
    ?>  

    4. PHP MySQL 读取数据, 删除及更新

    SELECT 语句用于从数据表中读取数据:

    1
    SELECT column_name(s) FROM table_name
    在mysqli中,执行查询使用query()方法,该方法的语法格式如下:
    mixed query ( string $query [, int $resultmode ] )
    在上述语法中涉及到的参数说明如下。
    l         query:向服务器发送的SQL语句。
    l         resultmode:该参数接受两个值,一个是MYSQLI_STORE_RESULT,表示结果作为缓冲集合返回;另一个是MYSQLI_USE_RESULT,表示结果作为非缓冲集合返回。
     
    下面是使用query()方法执行查询的例子:
     

    1.面向对象

    <?php  
        $mysqli = new mysqli("localhost","root","root","ikeepstudying");     //实例化mysqli  
        $query  = "select * from MyGuests";  
        $result = $mysqli->query($query);  
        if ($result) {  
            if($result->num_rows>0){                                               //判断结果集中行的数目是否大于0  
                while($row = $result->fetch_array() ){                        //循环输出结果集中的记录  
                    echo ($row[0])."<br>";  
                    echo ($row[1])."<br>";  
                    echo ($row[2])."<br>";  
                    echo ($row[3])."<br>";  
                    echo "<hr>";  
                }  
            }  
        }else {  
            echo "查询失败";  
        }  
        $result->free();  
        $mysqli->close();  
    ?>  
     在上面代码中,num_rows为结果集的一个属性,返回结果集中行的数目。方法fetch_array()将结果集中的记录放入一个数组中并将其返回。最后使用free()方法将结果集中的内存释放,使用close()方法将数据库连接关闭。
     

     对于删除记录(delete)、保存记录(insert)和修改记录(update)的操作,也是使用query()方法来执行的,下面是删除记录的例子:

  • 相关阅读:
    [J2ME Q&A]MMAPI的Cannot parse this type of AMR异常之讨论
    FM91.5的EasyMorning节目爱听吗?
    [EntLibFAQ]“不允许所请求的注册表访问权”的解释[0508Update]
    亮出你的组合竞争力的王牌
    隔离,隔离,再隔离!
    zuma三阶段论和技术道路[一]
    分享下我们部门内部知识点培训教程[SIP/J2ME/Setup/LoadRunner/Domino][0706Up]
    [Remoting FAQ]Loading a Remoting Host On IIS得到BadImageFormatException
    通过讲课来建立自己的知识系统
    j2medev“用户界面和多媒体”版面问题整理[0407更新]
  • 原文地址:https://www.cnblogs.com/lxlin/p/6270763.html
Copyright © 2020-2023  润新知