Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP更新数据库时遇到问题_Php_Mysql - Fatal编程技术网

PHP更新数据库时遇到问题

PHP更新数据库时遇到问题,php,mysql,Php,Mysql,我已通过使用连接到数据库 function db_connect() { $result = new mysqli('localhost','root', '******', 'DB'); if (!$result) { throw new Exception('Could not connect to database server'); } else { return $result; } } 但当我去注册一个新客户时,我会得到“无法注册到DB”

我已通过使用连接到数据库

function db_connect() {
   $result = new mysqli('localhost','root', '******', 'DB');
   if (!$result) {
     throw new Exception('Could not connect to database server');
   } else {
     return $result;
   }
}
但当我去注册一个新客户时,我会得到“无法注册到DB”,而这段代码是

$result = mysqli_query($conn, "insert into user values('".$username."', sha1('".$password."'), '".$email."')");
  if (!$result) {
    throw new Exception('Could not register to DB.');
  }
我的数据库中有一个用户表。表
user
中的值为:

username varchar(100),
email varchar(150),
passwd varchar(17)

如果已正确连接,则查询密码时会出现语法错误。这是您当前的代码:

$result = mysqli_query($conn, "insert into user values('".$username."', sha1('".$password."'), '".$email."')");
如果您坚持让自己面对潜在的SQL注入攻击,您会将连接更改为如下:

$result = mysqli_query($conn, "insert into user values('".$username."','". sha1($password)."', '".$email."')");
这将允许PHP的
sha1()
函数正确执行。如果您希望使用MySQL的内置
sha1()
函数,那么这里的连接将不会像我所做的那样使用


如前所述,请学习以下语句:。即使是这样也不安全


此外,您可能需要考虑使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用

密码\u hash()
。在散列之前,请确保您在它们上安装或使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。

如果您已正确连接密码,则查询中会出现语法错误。这是您当前的代码:

$result = mysqli_query($conn, "insert into user values('".$username."', sha1('".$password."'), '".$email."')");
如果您坚持让自己面对潜在的SQL注入攻击,您会将连接更改为如下:

$result = mysqli_query($conn, "insert into user values('".$username."','". sha1($password)."', '".$email."')");
这将允许PHP的
sha1()
函数正确执行。如果您希望使用MySQL的内置
sha1()
函数,那么这里的连接将不会像我所做的那样使用


如前所述,请学习以下语句:。即使是这样也不安全


此外,您可能需要考虑使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用

密码\u hash()
。在散列之前,请确保您在它们上安装或使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。

如果INSERT语句没有列,则列的顺序将与表架构匹配

基于此,让我们重新检查您的代码片段:

$result = mysqli_query($conn, "insert into user values('".$username."', sha1('".$password."'), '".$email."')");
if (!$result) {
    throw new Exception('Could not register to DB.');
}
根据这一点,你要插入一个用户名,然后是密码,然后是电子邮件。但是,表模式首先定义用户名,然后是电子邮件,然后是密码

基于此,让我们使用下面的代码片段。请注意,这利用了预先准备好的语句,可以防止SQL注入攻击

$query = "INSERT INTO user (username, passwd, email) VALUES (?,?,?)";

if ($stmt = mysqli_prepare($conn, $query)) {

    /* bind parameters for markers */
    mysqli_stmt_bind_param($stmt, "sss", $username, sha1($password), $email);

    /* execute query */
    mysqli_stmt_execute($stmt);

    /* close statement */
    mysqli_stmt_close($stmt);
}
还有一个问题:数据库中的密码字段太短(17个字符)。SHA-128散列密码正好是40个字符,要使用password_*方法,至少需要60个字符。我建议只需将密码字段设置为255个字符


请记住使用密码*系列函数。当INSERT语句没有列时,不需要用SHA1散列密码。

,而是希望列的顺序与表架构匹配

基于此,让我们重新检查您的代码片段:

$result = mysqli_query($conn, "insert into user values('".$username."', sha1('".$password."'), '".$email."')");
if (!$result) {
    throw new Exception('Could not register to DB.');
}
根据这一点,你要插入一个用户名,然后是密码,然后是电子邮件。但是,表模式首先定义用户名,然后是电子邮件,然后是密码

基于此,让我们使用下面的代码片段。请注意,这利用了预先准备好的语句,可以防止SQL注入攻击

$query = "INSERT INTO user (username, passwd, email) VALUES (?,?,?)";

if ($stmt = mysqli_prepare($conn, $query)) {

    /* bind parameters for markers */
    mysqli_stmt_bind_param($stmt, "sss", $username, sha1($password), $email);

    /* execute query */
    mysqli_stmt_execute($stmt);

    /* close statement */
    mysqli_stmt_close($stmt);
}
还有一个问题:数据库中的密码字段太短(17个字符)。SHA-128散列密码正好是40个字符,要使用password_*方法,至少需要60个字符。我建议只需将密码字段设置为255个字符


请记住使用密码*系列函数。不要用SHA1散列密码。

这一行肯定是你的问题之一

$result = mysqli_query($conn, 
           "insert into user values('".$username."', sha1('".$password."'), '".$email."')");
换成

$result = mysqli_query($conn, 
          "insert into user values('$username', '$email',  '" . sha1($password) "')");
注意:更改顺序以匹配您的模式,并消除字符串连接的混乱

注2:密码字段太短,无法保存完整的哈希密码。对于将来的校对,我建议使用完整的
varchar(255)

最好像这样使用
密码\u hash()

$hashed = password_hash($password);

$result = mysqli_query($conn, 
          "insert into user values('$username', '$hashed', '$email')");
然后要检查用户何时再次登录,请使用

if ( password_verify($_POST['password'], $db_hashed_password) ) {
    echo 'Password OK';
} else {
    echo 'Password failed';
}

这条线肯定是你的问题之一

$result = mysqli_query($conn, 
           "insert into user values('".$username."', sha1('".$password."'), '".$email."')");
换成

$result = mysqli_query($conn, 
          "insert into user values('$username', '$email',  '" . sha1($password) "')");
注意:更改顺序以匹配您的模式,并消除字符串连接的混乱

注2:密码字段太短,无法保存完整的哈希密码。对于将来的校对,我建议使用完整的
varchar(255)

最好像这样使用
密码\u hash()

$hashed = password_hash($password);

$result = mysqli_query($conn, 
          "insert into user values('$username', '$hashed', '$email')");
然后要检查用户何时再次登录,请使用

if ( password_verify($_POST['password'], $db_hashed_password) ) {
    echo 'Password OK';
} else {
    echo 'Password failed';
}

在您的第二个代码片段中,似乎有
$conn=db_connect()在此代码段之前。这是正确的吗?您从未设置过
$conn
请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用
密码\u hash()
。在散列之前,请确保您在它们上安装或使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。表示了解的语句。即使是这样也不安全!在第二个代码段中的代码段中显示,它看起来像是
$conn=db_connect()在此代码段之前。这是正确的吗?您从未设置过
$conn
请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用
密码\u hash()
。在散列之前,请确保您在它们上安装或使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。表示了解的语句。即使是这样也不安全!一方面,在您的代码片段中显示MySQL()中确实有一个SHA1函数,这会很有用。也就是说,以这种方式使用该方法