mysqli_stmt_bind_param(): Number of variables doesn't match number of parameters in prepare......

问题:语句中变量的数量与准备语句中的参数的数量不匹配

Warning: mysqli_stmt_bind_param(): Number of variables doesn’t match number of parameters in prepared statement in

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, bool given in

在这里插入图片描述

源码

$sql="select user_name,user_pwd from users where user_name=? and user_pwd=? and is_del=0";
//SQL 语句中可以包含一个或者多个问号(?) 表示语句的参数。
$stmt = mysqli_prepare($conn, $sql);
// mysqli::prepare -- mysqli_prepare — 准备执行一个 SQL 语句
mysqli_stmt_bind_param($stmt, "s", $userName);
mysqli_stmt_execute($stmt);

解析

mysqli_stmt::bind_param – mysqli_stmt_bind_param — Binds variables to a prepared statement as parameters
——将变量绑定到准备好的语句作为参数

在sql语句中出现了两个?即表示准备执行SQL语句中有两个需要绑定变量的参数
所以在接下来的mysqli_stmt_bind_param语句中需要绑定两个参数到已经准备好的sql语句中
而在所示的源码中只绑定了一个变量,所以会出现如题目给出的“语句中变量的数量与准备语句中的参数的数量不匹配”错误类型。

纠正

一个不太好的纠正
因为sql语句的意思是在user的数据库中寻找用户名匹配的选项。而不是用户名和密码一同匹配的选项。

$sql="select user_name,user_pwd from users where user_name=? and user_pwd=? and is_del=0";
// mysqli::prepare -- mysqli_prepare — 准备执行一个 SQL 语句
//SQL 语句中可以包含一个或者多个问号(?) 表示语句的参数。
$stmt = mysqli_prepare($conn, $sql);
//tip:之前sql语句中包含两个问号
mysqli_stmt_bind_param($stmt, "ss", $userName, $userPwd);
mysqli_stmt_execute($stmt);

纠正

$sql="select user_name,user_pwd from users where user_name=? and is_del=0";
// mysqli::prepare -- mysqli_prepare — 准备执行一个 SQL 语句
//SQL 语句中可以包含一个或者多个问号(?) 表示语句的参数。
$stmt = mysqli_prepare($conn, $sql);
//tip:之前sql语句中包含两个问号
mysqli_stmt_bind_param($stmt, "s", $userName);
mysqli_stmt_execute($stmt);

思考

使用stmt方法的好处【预编译语句(Prepared Statements)】

预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止sql注入

SQL注入_百度百科:
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。[1] 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页