0

当我想为我的数据库提交数据时,我遇到了失败。连接已建立,但是当我使用时:

 $sql = $MyConnection->prepare("
    INSERT INTO AMP_USERS (Username, Password, Lastname, Email) VALUES ('$username', '$password', '$lastname', '$email')
    ");

  $sql->execute();

我失败了。我已经完成了:

$sql->bindParam(:username, $username)

依此类推,但这不起作用/没有提供错误。不知何故,数据没有存储到数据库中,错误一定在这段代码的某个地方。

编辑

虽然我不认为所有的代码都是必要的,但我会发布它:

    <?php

  require('config.php');

  if($MyConnection = new PDO('mysql:host=fdb6.biz.nf;dbname=1446018_venator', $dbusername, $dbpassword)) {
    echo "A connection has been made!";
  }

  $username = $_POST['username'];
  $password = $_POST['password'];
  $lastname = $_POST['lastname'];
  $email = $_POST['email'];

  // Hasing the password:
  // A higher "cost" is more secure but consumes more processing power
  $cost = 10;

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

  // Prefix information about the hash so PHP knows how to verify it later.
  // "$2a$" Means we're using the Blowfish algorithm. The following two digits are the cost parameter.
  $salt = sprintf("$2a$%02d$", $cost) . $salt;

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

  $sql = $MyConnection->prepare("
    INSERT INTO AMP_USERS (Username, Password, Lastname, Email) VALUES (:username, :password, :lastname, :email)
    ");
  $sql->bindParam(':username', $username);
  $sql->bindParam(':password', $hash);
  $sql->bindParam(':lastname', $lastname);
  $sql->bindParam(':email', $email);
  $sql->execute();

?>
4

1 回答 1

1

失败但不报告错误

ChangePDO的错误报告。

$MyConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

如果有 SQL 错误,PDO 应该立即报告。

选择数据库

除了由变量插值引起的可能错误之外,我在您的查询中看到的唯一错误是表名不是完全限定的。如果您尚未选择数据库,则可能需要。

$MyConnection = new PDO("mysql:host=localhost;dbname=DBNAME");
// or in the query
"INSERT INTO DBNAME.AMP_USERS ..."

请注意,您不会直接写DBNAME,而是您的数据库的实际名称是什么。

使用准备好的语句

无论如何,您都应该这样做以防止注入,但根据您使用的变量的内容,它们也可能会导致问题。

$stmt = $MyConnection->prepare("
    INSERT INTO AMP_USERS (Username, Password, Lastname, Email) VALUES (?,?,?,?)
");
$stmt->execute(array($username, $password, $lastname, $email));

使用命名参数 like$stmt->execute(array(":username" => $username))或 using $stmt->bindParam(":username", $username)(or bindValue) 也是有效的。


如果这些解释不能帮助您解决问题,那么您已经从问题中遗漏了重要数据。

于 2013-10-24T18:47:56.307 回答