所以当涉及到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初始化开始。它是什么?如何将参数绑定到它而不需要变量来锚定它?这里的说明:从mysqli_stmt_init的$stmt开始,然后准备它,然后将参数绑定到它,然后执行它。这些变化是怎么发生的?
第二个问题是,stmt_准备做什么我知道它准备好了陈述(理论上我知道,但实际上我完全不知道这意味着什么)。
在这两个方面我都看过定义和手册,绝对没有什么是点击。对我来说,PHP.net完全是一堆行话,到目前为止,我还没有足够的知识来理解它。
很抱歉,这里的每个人都很清楚,但对我来说,这只是没有达到目的。不管怎样,谢谢您的帮助:)
最佳答案
我会一次回答一个问题:
我要理解的主要问题是从mysqli stmt初始化开始。这是怎么一回事?
引用人:
mysqli_stmt_init-初始化语句并返回
与mysqli-stmt-prepare一起使用
基本上,这只是一个起点。在我看来,OOP方法更容易理解。试试看。
下一个问题:
如何将参数绑定到它而不需要变量来锚定它?
准备语句时,将分析querystring(带有实际值的占位符),并查找和标识占位符。
这些信息存储在一个对象中,该对象等待使用正确的值执行查询。同时,该对象与数据库进行对话,并准备查询执行计划。
现在你准备了一份声明。在这一点上,准备好的陈述基本上如下:
查询执行计划;
等待值实际执行查询的占位符列表。
当您将参数绑定到语句时,它将与第一个可用的占位符配对。一旦绑定了每个占位符,就可以执行该语句。
现在怎么办?执行并不仅仅是用值替换“问号”的字符串。statement对象告诉数据库“嘿,你能用我现在的这些值运行我们5秒前商定的计划吗?”(这一细微差别就是为什么用准备好的语句进行sql注入基本上是不可能的)。
所以,概括一下:mysqli_stmt_init
是起点。mysqli_stmt_prepare(stmt, query)
将在数据库引擎中创建一个执行计划,并标识您请求的参数占位符。mysqli_stmt_bind_param(stmt, value_type, value)
为第一个可用占位符指定一个值mysqli_stmt_execute(stmt)
将使数据库使用从绑定参数接收的值执行上面决定的查询计划。