I';我正在使用PHP5.6.25并尝试过滤输入,但它只在mysqli中输入一次数据

I';我正在使用PHP5.6.25并尝试过滤输入,但它只在mysqli中输入一次数据,php,mysqli,Php,Mysqli,我尝试了几种过滤方法,当我这样做时,我只能在表中插入一次,id设置为自动递增。 这就是变量的定义方式 <form action = "php/createaccount.php" method = "post"> First Name <br /> <input type ="text" placeholder="First name" name = "fname"><br /> Last Name <br /> <input t

我尝试了几种过滤方法,当我这样做时,我只能在表中插入一次,id设置为自动递增。 这就是变量的定义方式

<form action = "php/createaccount.php" method = "post">
First Name <br /> <input type ="text" placeholder="First name" name = "fname"><br />
Last Name <br /> <input type ="text" placeholder="Last name" name = "lname"><br />
User Name <br /> <input type ="text" placeholder="Username" name = "uname"><br />
Password <br /> <input type ="text" placeholder="Password" name = "pword"><br />
School Name <br /> <input type ="text" placeholder="School name" name = "sname"><br />
Email <br /> <input type ="text" placeholder="Email" name = "email"> <br /> 
<input type = "submit" value = "Create Account">
</form>

名字

姓氏

用户名

密码

学校名称

电子邮件

这是createaccount.php页面

<?php
error_reporting (-1); ini_set ("display_errors", "On");
$con = mysqli_connect("localhost" , "root" , "" , "epicreads");
//check connection
if (mysqli_connect_errno()) {
   echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$sql = $con->prepare("INSERT INTO users (fname, lname, email, uname, sname)
VALUES
(?, ?, ?, ?, ?)");
$sql->bind_param('sssss', $fname, $lname, $email, $uname, $sname);
$sql->execute();

//Password and password security
//Set the cost
$cost = 10;

// Create a random salt
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');

// Hash the password with the salt
$hash = crypt($pword, $salt);

//Post into table
$pword = "INERT INTO users (pword)
values
('$_POST[pword]')";

//Echo
die('Error: ' . mysqli_error($con));

echo "1 record added";

mysqli_close($con);
?>
您这里有一个输入错误:

//Post into table
$pword = "INERT INTO users (pword)
values
('$_POST[pword]')";
您想用S插入

此外:

您正在散列SQL语句,而不是变量

根据评论中的建议,您应该使用
password\u hash
,似乎您有一个
cost
数组值,这是password\u hash的典型值,因此您可能从使用它的地方复制/粘贴它,返回并阅读其余语法

不建议使用自己的盐

你的问题在这里:

报告错误时,表示列“fname”不能为空

是因为您试图输入一个空行;上面的密码SQL正在向MySQL中插入密码值,但您可能希望
更新现有行,而不是
插入一个只有密码的新行

因此,您应该做的是研究
password\u hash
,将密码表列的长度编辑为至少72个字符,然后在将其余数据插入表的同时插入密码

如果需要编辑已经存在的行,则应使用MySQL函数

你也有你的

//Echo  
die('Error: ' . mysqli_error($con));
将在每次运行脚本时运行,无论是否存在错误或是否拾取了错误。这不是检测面向对象的MySQL错误的方法。有关如何在PHP中检测MySQL错误的详细信息,请参阅

对于变量的来源也没有指导?我假设在他们到达SQL插入之前,您已经在与then合作,但是考虑到您正在研究输入过滤,我看不到任何关于您的问题代码的输入过滤的证据。我希望您没有使用全局变量,通常在提交表单后,可以通过
$\u POST['name']
超级全局变量访问为变量发布的变量



永远不要存储纯文本密码!请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用
密码\u hash()
。在散列之前,请确保对它们进行了清理或使用了任何其他清理机制。这样做会更改密码,并导致不必要的额外编码。如果您只能在db中插入一次,则某些操作失败;检查错误。顺便说一句,你从哪里提取这些变量/post数组?我不清楚问题出在哪里。您声称可以成功地插入数据库一次,我只看到执行了一条
insert
语句。那么什么不起作用了?@JayBlanchard没有看到变量定义,你怎么能断定OP没有使用哈希呢?我尝试了上面提供的代码,它没有报告错误,也没有输入到表中。还感谢您提供的有用链接使用MySQL错误日志的链接来跟踪错误发生的位置@达米亚诺基夫
//Echo  
die('Error: ' . mysqli_error($con));
<?php
error_reporting (-1);
ini_set ("display_errors", "On");
$con = mysqli_connect("localhost" , "root" , "" , "epicreads");
//check connection
if (mysqli_connect_errno()) {
   echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

/***
New password construct:
//Password and password security
//Set the cost    
***/
$option['cost'] = 10;
$password = password_hash($_POST['pword'], PASSWORD_BCRYPT, $option);


$sql = $con->prepare("INSERT INTO users (fname, lname, email, uname, sname, pword)
VALUES (?, ?, ?, ?, ?,?)");
$sql->bind_param('ssssss', $fname, $lname, $email, $uname, $sname,$password);
$check = $sql->execute();

// execute() can fail for various reasons. 
// And may it be as stupid as someone tripping over the network cable
// 2006 "server gone away" is always an option
if ( $check === false ) {
    //much better than a die statement: 
    error_log('execute() failed: ' . htmlspecialchars($sql->error));
}
else {
    echo "1 record added";
}

$sql->close();