auto_increment не устанавливает значение для первичного ключа?

0

Я сбит с толку, когда я использую терминал (mysql) и вставляю в username столбцы account_password, user_id AUTO_INCREMENTS, как и положено.

мой стол:

        CREATE TABLE users (
  user_id int NOT NULL  AUTO_INCREMENT,
  user_type VARCHAR(20) NULL,
  creation_date TIMESTAMP NOT NULL,
  username VARCHAR(100) NOT  NULL,
  account_password VARCHAR(255) NOT NULL,
  PRIMARY KEY (user_id)
);

еще когда я использую этот скрипт:

use strict;
use warnings FATAL => 'all';# good for debugging, FATAL kills program so warnings are more identifiable
use CGI qw/:standard/;
use CGI::Carp qw(fatalsToBrowser); # good for debugging, sends info to browser
use DBI;
use DBD::mysql;
use Digest::SHA qw(sha256);

print header, start_html;
my $fName    = param('firstName');
my $lName    = param('lastName');
my $compName = param('compName');
my $email    = param('email');
my $pswrd    = param('password');
my $cnfPswrd = param('confPassword');
my $encpswrd = "";

#check passwords match, if not display error, and exit script
if ($pswrd eq $cnfPswrd) {
    $encpswrd = sha256($pswrd);
} else {
    print "Passwords did not match! refresh form!";
    exit;
}

#database credentials, to be changed accordingly
my $database = "intsystest";
my $host     = "localhost";
my $user     = "root";
my $pw       = "password";
my $dsn      = "dbi:mysql:$database:localhost:3306";

#connect to database
my $dbh      = DBI->connect($dsn, $user, $pw,
                           { RaiseError => 1 }) or die "unable to connect:$DBI::errstr\n"; # <- this line good for debugging

#create, prepare, execute query, disconnect from DB
my $personsQuery = "INSERT INTO persons (first_name, last_name) VALUES (?,?)";
my $compQuery    = "INSERT INTO company (company_name) VALUES (?)";
my $usersQuery   = "INSERT INTO users (username, account_password) VALUES (?,?)";

my $sth   = $dbh->prepare($personsQuery); 
$sth->execute($fName, $lName);
$sth      = $dbh->prepare($compQuery);
$sth->execute($compName);
$sth      = $dbh->prepare($usersQuery);
$sth->execute($email, $encpswrd);
$dbh -> disconnect;

# additional processing as needed ...

print end_html;

Я получаю эту ошибку:

 DBD::mysql::st execute failed: Field 'user_id' doesn't have a default value at /usr/lib/cgi-bin/compSignUpDBCGI.pl line 44.

Я предполагаю, что, вероятно, что-то не так с обработчиком. Что мне не хватает??

  • 0
    Я предполагаю, что в user_id persons или company нет поля user_id ?
  • 0
    есть поле внешнего ключа в persons , но ни одного в таблице company .
Показать ещё 7 комментариев
Теги:

1 ответ

0

Если persons таблица имеет внешний ключ к users таблице, то вам нужно вставить users запись первой, а затем получить идентификатор новых users записи и добавить, что в SQL вставить количество persons запись.

Что-то вроде этого:

my $usersQuery   = "INSERT INTO users (username, account_password) VALUES (?,?)";
$sth      = $dbh->prepare($usersQuery);
$sth->execute($email, $encpswrd);

$sth = $dbh->prepare('SELECT user_id FROM users WHERE username = ?');
$sth->execute($email);
my $user_id = $sth->fetch->[0];

my $personsQuery = "INSERT INTO persons (user_id ,first_name, last_name) VALUES (?,?,?)";
$sth   = $dbh->prepare($personsQuery); 
$sth->execute($user_id, $fName, $lName);

Это та область, где DBIx :: Class определенно облегчит вашу жизнь.

  • 0
    Спасибо за ответ, я мог видеть проблему, но не знал perl достаточно хорошо, чтобы ее решить.
  • 0
    Это сделало трюк! Спасибо.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню