【问题标题】:SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'ID' cannot be nullSQLSTATE [23000]:违反完整性约束:1048 列“ID”不能为空
【发布时间】:2019-10-06 21:22:35
【问题描述】:

我正在尝试创建用户注册表单。但是,在本地机器上测试时,我得到一个错误:

SQLSTATE[23000]:违反完整性约束:1048 列“ID” 不能为空。

我在 AMPPS Apache、PHP 7.1 / MySQL 上运行它。我的操作系统是 macOS Mojave 10.4。我基本上已经尝试了以前答案中关于“违反完整性约束:1048”的所有建议,但仍然没有任何线索。 我希望有人能帮忙。感谢您的检查!

这里是php:

$event_owner_id=$_POST['event-owner-id'];
$event_owner_familyname=$_POST['event-owner-familyname'];
$event_owner_firstname=$_POST['event-owner-firstname'];
$event_owner_familyname_yomi=$_POST['event-owner-familyname-yomi'];
$event_owner_firstname_yomi=$_POST['event-owner-firstname-yomi'];
$event_owner_creditname=$_POST['event-owner-creditname'];
$event_owner_post=$_POST['event-owner-post']; 
$event_owner_address=$_POST['event-owner-address'];
$event_owner_phone=$_POST['event-owner-phone'];
$event_owner_mail=$_POST['event-owner-mail'];
$event_owner_pass=$_POST['event-owner-pass'];
$event_owner_pass_kaku=$_POST['event-owner-pass-kaku'];

try {
  $dsn = 'mysql:host=localhost;dbname=xxx;charset=utf8';
  $pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
  $sql = 'INSERT INTO User (ID, Type, LastName, FirstName, LastNameKana, FirstNameKana, Credit, PostCode, Address, PhoneNumber, eMailAddress, Password) VALUES (:ID, 002, :LastName, :FirstName, :LastNameKana, :FirstNameKana, :Credit, :PostCode, :Address, :PhoneNumber, :eMailAddress, :Password)';
  $stmt=$pdo->prepare($sql);
  $stmt -> bindParam(":ID", $event_owner_id, PDO::PARAM_STR);
  $stmt -> bindParam(":LastName", $event_owner_familyname, PDO::PARAM_STR);
  $stmt -> bindParam(":FirstName", $event_owner_firstname, PDO::PARAM_STR);
  $stmt -> bindParam(":LastNameKana", $event_owner_familyname_yomi, PDO::PARAM_STR);
  $stmt -> bindParam(":FirstNameKana", $event_owner_firstname_yomi, PDO::PARAM_STR);
  $stmt -> bindParam(":Credit", $event_owner_creditname, PDO::PARAM_STR);
  $stmt -> bindParam(":PostCode", $event_owner_post, PDO::PARAM_INT);
  $stmt -> bindParam(":Address", $event_owner_address, PDO::PARAM_STR);
  $stmt -> bindParam(":PhoneNumber", $event_owner_phone, PDO::PARAM_INT);
  $stmt -> bindParam(":eMailAddress", $event_owner_mail, PDO::PARAM_STR);
  $stmt -> bindParam(":Password", $event_owner_pass, PDO::PARAM_STR);
  $stmt->execute();
 } 
 catch (PDOException $e) {
 echo $e->getMessage();
 }

$pdo=null;

【问题讨论】:

  • 嗯,$event_owner_id 是空的吗?
  • 这是什么:ID, 002,
  • 添加var_dump($_POST),看看event-owner-id有什么价值
  • 永远不要存储纯文本密码!请使用 PHP 的built-in functions 来处理密码安全问题。如果您使用的 PHP 版本低于 5.5,您可以使用 password_hash() compatibility pack在散列之前不需要escape passwords 或对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。

标签: php mysql sql insert bindparam


【解决方案1】:

正如 aynber 所建议的,ID 变量实际上为空。
我的注册表应该包括 3 页:
1.HTML表单
2.确认页面
3.数据库插入和成功消息页面。
变量只传递到确认页面,当涉及到实际的数据库插入时,它们确实都是空的。我能够通过会话解决这个问题:

//form page HTML:
<form method="post" action="confirmation.php">
<input type="text" name="user-id" >

//confirmation page PHP:
session_start();
$_SESSION['user-id']=$_POST['user-id'];

//database insert and success message page PHP:
session_start();
$user_id = $_SESSION['user-id'];

感谢大家的帮助。
感谢 Jay Blanchard 关于密码安全的说明。我一定会解决这个问题。

【讨论】:

    猜你喜欢
    • 2021-02-01
    • 2019-11-20
    • 2021-08-16
    • 2020-10-25
    • 2017-02-28
    • 2017-04-15
    • 2017-12-26
    • 2019-11-24
    • 2018-01-25
    相关资源
    最近更新 更多