因此,当涉及到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开始。那是什么?如何将参数绑定到它而不需要一个变量来锚定它呢?澄清这里:您从$stmt开始从mysqli_stmt_init开始,然后准备它,然后将参数绑定到它,然后执行它。这些变化是如何持续的?
第二个问题是,stmt_prepare到底是做什么的?我明白了,它为陈述做准备(理论上我知道,但实际上我不知道这意味着什么)。
在这两方面,我都看过定义和手册,绝对没有点击。对我来说,PHP.net是一堆杂乱无章的行话,到目前为止,我只是没有足够的知识去理解。
对不起,这里的每个人都很清楚这一点,但对我来说,这只是没有回家而已。无论如何,感谢您所能提供的任何帮助:)
发布于 2015-03-09 16:30:16
我试着一次回答一点:
我所理解的主要问题是从mysqli_stmt_init开始。那是什么?
从推销员那里:
mysqli_stmt_init -初始化语句并返回用于mysqli_stmt_prepare的对象
基本上,这只是个起点。在我看来,OOP方法更容易理解。试试看。
下一个问题:
如何将参数绑定到它而不需要一个变量来锚定它呢?
在准备语句时,将解析查询字符串(实际值的占位符),并查找和标识占位符。这些信息存储在一个对象中,该对象等待您使用正确的值执行查询。同时,该对象与数据库进行对话,并准备查询执行计划。
现在你准备了一份声明。在这一点上,准备好的声明基本上如下:
当您将参数绑定到该语句时,它将与第一个可用占位符配对。一旦绑定了每个占位符,就可以执行该语句。
现在会发生什么?执行不是简单的字符串替换,而是用值代替“问号”。语句对象告诉数据库“嘿,请使用我现在拥有的这些值,运行我们5秒前商定的计划好吗?”(这种微妙的差异就是为什么使用准备语句的sql注入基本上是不可能的)。
因此,简单地说:
mysqli_stmt_init是起点。mysqli_stmt_prepare(stmt, query)将在DB引擎中创建一个执行计划,并标识您请求的参数占位符。mysqli_stmt_bind_param(stmt, value_type, value)为第一个可用占位符分配一个值。mysqli_stmt_execute(stmt)将使DB执行上面确定的查询计划,并使用从绑定参数接收的值。https://stackoverflow.com/questions/28946671
复制相似问题