Php 准备及;结合

Php 准备及;结合,php,mysql,mysqli,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

所以,当谈到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;
    }
}
现在代码工作了。它显示在$\u GET中输入的值的第一个名称和第二个名称。我不知道怎么做或为什么,但我想我已经缩小了范围

我理解这一点的主要问题始于mysqli_stmt_init。这是怎么一回事?参数如何绑定到它而不需要变量来固定它?这里的说明:从mysqli_stmt_init中的$stmt开始,然后准备它,然后将参数绑定到它,然后执行它。所有这些变化是如何持续的

第二个问题是,stmt\U准备做什么?我知道它准备了陈述(理论上我知道,但实际上我不知道这意味着什么)

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


我很抱歉,这里的每个人都很清楚这一点,但对我来说,这并没有达到目的。无论如何,感谢您提供的任何帮助:)

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

我理解这一点的主要问题始于mysqli_stmt_init。这是什么

参考人:

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

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

下一个问题:

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

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

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

  • 查询执行计划
  • 等待值实际执行查询的占位符列表
将参数绑定到语句时,它将与第一个可用占位符配对。一旦绑定了每个占位符,就可以执行该语句

现在发生了什么?执行不是简单地用值代替“问号”的字符串替换。statement对象告诉数据库“嘿,你能用我现在拥有的这些值运行我们5秒钟前商定的计划吗?”(这一细微的差别就是为什么用prepared语句进行sql注入基本上是不可能的)

因此,总结一下:

  • mysqli\u stmt\u init
    是起点
  • mysqli\u stmt\u prepare(stmt,query)
    将在数据库引擎中创建一个执行计划,并标识您请求的参数占位符
  • mysqli\u stmt\u bind\u参数(stmt,value\u type,value)
    为第一个可用占位符分配一个值
  • mysqli\u stmt\u execute(stmt)
    将使用从绑定参数接收的值,使数据库执行上面决定的查询计划

请看:远高于我目前的理解水平,但非常感谢。我会把你说的话重读一遍,看看结果如何。我还看到OO方法可能更简单,但我一直在自学,并从程序开始。在开始OO之前,我的目标是尝试性地掌握程序,否则我只会进一步混淆自己。我明白你的观点@RussellKitchen,但不要过多地推迟OOP。这是做事情的现代方式(大多数时候)谢谢:)。我开始意识到,所有的指南和教程似乎都在使用它。