php - 准备和装订

标签 php mysql mysqli

所以当涉及到 PHP 和 SQL 时,我是一个相对的(完全的)新手(可怕的词)。我担心我已经陷入了一个更深层次的场景。我正在努力了解绑定(bind)/准备好的语句。

这是我的代码:

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 开始的。它是什么?参数如何绑定(bind)到它而不需要变量来锚定它?在此澄清:您从 mysqli_stmt_init 开始使用 $stmt,然​​后准备它,然后将参数绑定(bind)到它,然后执行它。所有这些变化如何坚持下去?

第二个问题是,stmt_prepare 到底做了什么?我知道它准备了声明(理论上我知道,但实际上我对这意味着什么一无所知)。

在这两个方面,我都查看了定义和手册,但绝对没有任何点击。 PHP.net 对我来说是一团乱七八糟的行话,到目前为止,我还没有足够的知识来理解。

很抱歉,这里的每个人都清楚这一点,但对我来说,它只是没有击中要害。无论如何,感谢您提供的任何帮助:)

最佳答案

我将尝试一次回答一个问题:

The main problem I'm having understanding this starts with mysqli_stmt_init. What is it?

来自裁判员:

mysqli_stmt_init — Initializes a statement and returns an object for use with mysqli_stmt_prepare

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

下一个问题:

How are parameters bound to it without the need for a variable to anchor it down?

当您准备一条语句时,会解析查询字符串(带有实际值的占位符),并发现和识别占位符。 这些信息存储在一个对象中,该对象等待您使用正确的值来执行查询。同时,该对象与数据库对话并准备您的查询执行计划。

现在您已经准备好了声明。此时准备好的语句基本上如下:

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

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

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

所以,回顾一下:

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

关于php - 准备和装订,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28946671/

相关文章:

php - 连接数据库时防止SQL注入(inject)

php - 遍历多行 mysqli 的列值

php - 如何在 SabreDAV PHP 服务器中为 CalDAV 实现自定义 ACL

php - 静态成员不能用作 PHP5 中的默认函数参数?

php - 网站的搜索引擎

mysql - 在mysql中使用union删除?

php - 显示来自 mysql codeigniter 的图像

php - Magento:为下的每个订单自动创建 CSV 文件

php - INSERT 查询产生 "Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given"

php - 不能在写上下文中使用函数返回值?