我的防止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);
答案 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可以清楚地看到哪些值插入到哪些列中。