因此,当谈到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对我来说是一个完整的术语,截至目前,我还没有理解这些知识。
对不起,这对每个人来说都必须如此清楚,但对我而言,它只是没有打到家。无论如何,感谢您提供的任何帮助:)
答案 0 :(得分:3)
我会尝试一次回答一点:
来自refman的我理解的主要问题始于mysqli_stmt_init。它是什么?
:
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)
将使数据库执行上面确定的查询计划,并使用从绑定参数接收的值。