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

时间:2015-03-29 12:50:30

标签: php sql sql-injection

我的防止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);

1 个答案:

答案 0 :(得分:3)

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

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

我自己并没有使用PDO,但我确实使用MySQLi,所以你的:something引用是PDO声明,但你使用的SQL函数是MySQLi。

使用MySQLi bind_param函数,您需要将所有数据添加到类似数组的行中(它实际上可能是一个数组),但在类型声明之前,如 S tring, i nteger, D ouble和 B lob。

我已经用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可以清楚地看到哪些值插入到哪些列中。