2015-07-11 1 views
1

У меня есть PHP-скрипт, в котором я могу регистрировать пользователей новостей. Конечно, я хочу вставить такие вещи, как имя пользователя, пароль и т. Д. (Эти значения исходят от пользователя), но с другой стороны я хочу вставить его user_id (новый пользователь!) В другую таблицу.Несколько Вставка в разные таблицы с вставкой новых AI

Мои SQL

$sql = " 
      BEGIN; 
       INSERT INTO users (username, password, auth_lvl, realname, usercolor) VALUES ('$username', '$password', '$auth_lvl', '$realname', '$usercolor'); 
       INSERT INTO users_startmodules (user_id, startmodule, enabled) VALUES ('(SELECT MAX(user_id)+1 FROM users)', 'newsmodule', '1'); 
      COMMIT; 
      "; 

Как я могу решить эту проблему и BEGIN; ... COMIT; правильный выбор, когда я хочу, чтобы получить запрос отменен, если только одна вещь не работает, потому что я не хочу иметь всего несколько записей в худшем случае.

+0

Вставка данных, предоставленных пользователем непосредственно в вашу базу данных, не самая лучшая идея независимо от того, что вы делаете. Я предлагаю использовать MySQLi или PDO с подготовленными операторами. Я не являюсь частью MySQLi самостоятельно, но с PDO это вопрос использования 'beginTransaction()'/'endTransaction()' – icecub

ответ

1

Я предлагаю изменить тип user_id в таблице пользователей к auto_increment с чем-то вроде этого:

alter table users alter column user_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 

Теперь, Предполагая, что вы избежали пользовательского ввода данных:

$query="INSERT INTO users (username, password, auth_lvl, realname, usercolor) VALUES ('$username', '$password', '$auth_lvl', '$realname', '$usercolor');" 

и запустите это:

$mysqli->query($query); 

затем получить идентификатор пользователя с mysql_insert_id() функцией MySQL или, альтернативно, в PHP:

$userid=$mysqli->insert_id; 

и:

$query="INSERT INTO users_startmodules (user_id, startmodule, enabled) VALUES ('$userid', 'newsmodule', '1');"; 
    $mysqli->query($query); 
1

Это слишком долго для комментария.

Чтобы получить идентификатор, который был только что вставлен, используйте last_insert_id(). Эта функция документирована here.

Затем ответ на ваш вопрос должен начать транзакцию. Я бы дал вам синтаксис, но вам лучше прочитать documentation о транзакциях, прежде чем вы начнете их использовать.

Основная идея заключается в том, что транзакции группируют изменения данных вместе. Либо все происходит, либо нет. По пути вы можете использовать commit или rollback, в зависимости от того, хотите ли вы сохранить изменения или не сохранить ни одно из изменений.