准备&捆绑

时间:2015-03-09 16:11:36

标签: php mysql mysqli

因此,当谈到PHP和SQL时,我是一个相对(完整)的新手(可怕的词)。我担心自己陷入了深陷的境地。我试图了解约束/准备好的陈述。

这是我的代码:

require('connect.inc.php')

if (isset($_GET['first_name']) && !empty($_GET['first_name'])) {
    $first_name = trim($_GET['first_name']);
    $query = "SELECT first_name, second_name FROM join_names WHERE first_name=?";

    $stmt = mysqli_stmt_init($db);

    if($query_prepared = mysqli_stmt_prepare($stmt, $query)){
        mysqli_stmt_bind_param($stmt, 's', $first_name);

        mysqli_stmt_execute($stmt);

        mysqli_stmt_bind_result($stmt, $fn, $sn);
        mysqli_stmt_fetch($stmt);
        echo $fn.' '.$sn;
    }
}

现在代码有效了。它显示在$ _GET中输入的值的名字和第二个名称。我很少知道如何或为什么,但我认为我已经缩小了范围。

我理解的主要问题始于mysqli_stmt_init。它是什么?参数如何绑定到它而不需要变量来锚定它?澄清一下:你从mysqli_stmt_init的$ stmt开始,然后你准备它,然后你绑定参数,然后执行它。所有这些变化如何发挥作用?

第二个问题是,stmt_prepare究竟做了什么?我知道它准备了声明(理论上我知道,但实际上我不知道这意味着什么)。

在这两个方面,我查看了定义和手册,绝对没有点击。 PHP.net对我来说是一个完整的术语,截至目前,我还没有理解这些知识。

对不起,这对每个人来说都必须如此清楚,但对我而言,它只是没有打到家。无论如何,感谢您提供的任何帮助:)

1 个答案:

答案 0 :(得分:3)

我会尝试一次回答一点:

  

我理解的主要问题始于mysqli_stmt_init。它是什么?

来自refman的

  

mysqli_stmt_init - 初始化一个语句并返回一个对象   与mysqli_stmt_prepare一起使用

基本上,这只是一个起点。在我看来,OOP方法更容易理解。试一试。

下一个问题:

  

参数如何绑定到它而不需要变量来锚定它?

准备语句时,将解析查询字符串(包含实际值的占位符),并发现并标识占位符。 这些信息存储在一个对象中,该对象等待您使用正确的值来执行查询。与此同时,该对象与数据库进行通信并准备您的查询执行计划。

现在你准备了一份声明。此时准备好的声明基本上如下:

  • 查询执行计划;
  • 等待您的值实际执行查询的占位符列表。

将参数绑定到语句时,它将与第一个可用的占位符配对。一旦绑定了每个占位符,就可以执行该语句。

现在发生了什么?执行不仅仅是字符串替换,而是用值代替“问号”。语句对象告诉数据库“嘿,请你运行我们5秒前同意的计划,使用我现在拥有的这些值?” (这个微妙的区别是为什么sql注入准备语句基本上是不可能的。)

所以,回顾一下:

  • mysqli_stmt_init是起点。
  • mysqli_stmt_prepare(stmt, query)将在数据库引擎中创建一个执行计划,并标识您请求的参数占位符。
  • mysqli_stmt_bind_param(stmt, value_type, value)为第一个可用占位符
  • 分配一个值
  • mysqli_stmt_execute(stmt)将使数据库执行上面确定的查询计划,并使用从绑定参数接收的值。