mysqli_stmt::bind_param(): 类型定义字符串中的元素数量与绑定变量数量不匹配警告

mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables warning

我的 SQL 注入预防代码无效。谁能帮我?

我收到此警告: 警告:mysqli_stmt::bind_param():类型定义字符串中的元素数量与绑定变量的数量不匹配。

谢谢。

$mysqli = new mysqli('localhost', 'root', '', 'Muproj');    
$query="INSERT INTO tblmember VALUES (':id', ':uname' , ':passwrd' , ':name' , ':surname' ,':0' )";
$stmt = $mysqli->prepare($query);
$stmt->bind_param(':id', $newid);
$stmt->bind_param(':uname', $C_uname);
$stmt->bind_param(':passwrd', $C_passwrd);
$stmt->bind_param(':name', $C_name);
$stmt->bind_param( ':surname', $C_surname);
$stmt->bind_param(':0', '0');
$stmt->execute();
$result=mysql_query($stmt);

您似乎将 PDO 语法与 MySQLi 语法混合在一起。

请继续阅读 http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

我自己使用 PDO 不多,但我确实使用 MySQLi,所以你作为 :something 的引用是 PDO 声明,但你使用的 SQL 函数是 MySQL我。

使用 MySQLi bind_param 函数,您需要将所有数据添加到类似数组的行中(它实际上可能是一个数组),但在类型声明之前,如在 String,integer,Ddouble 和 B高球。

我已将您的代码重写为 MySQLi 形式:

$mysqli = new mysqli('localhost', 'root', '', 'Muproj');    
$query="INSERT INTO tblmember VALUES (?, ? , ? , ? , ? ,? )";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("issssi", $newid, $C_uname, $C_passwrd, $C_name, $C_surname, $zero)
$stmt->execute();
//$result=mysqli_query($stmt);

您需要认真研究 MySQLi 和 PDO 之间的方法、格式和功能差异。还要注意将所有 MySQL 维护为 MySQLi ,例如,您的 $result 正在使用已弃用的 MySQL 查询语句。

PS:为了清楚和向前兼容,我还建议您在 SQL 中的 INSERT 声明如下:

 INSERT INTO table_name (column_names1, column_name2, column_names3, ...) VALUES (?,?,?, ...)

因此您和 SQL 可以清楚地看到哪些值被插入到哪些列中。