2013-12-09 4 views
0

У меня есть форма для отправки в базу данных MYSQL. В моей базе данных у меня есть 2 стола, Subscribers и Category_id. Структуры таблиц следующим образом:MYSQL - заявление для вставки в две разные таблицы

Подписчики

subscriber_id INT NOT NULL AUTO_INCREMENT, 
name VARCHAR(30), 
email VARCHAR(30), 
phone INT,PRIMARY KEY (id)) 

CATEGORY_ID

category_id INT, 
subscriber_id INT 

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

$sql="INSERT INTO subscribers (name, email, phone) 
VALUES 
('$_POST[name]','$_POST[email]','$_POST[phone]')"; 

И в то же время, я также хочу, чтобы вставить новую строку в CATEGORY_ID, где Subscribers.subscriber_id = Category_id.subscriber_id // Для «же» записи

Как написать заявление для этого?

+0

Я предполагаю, что подписчик идентификатор автогенерируемая? –

+0

Обязательно избегайте данных, кстати. –

+0

Посмотрите на это: http: // stackoverflow.com/questions/8896447/mysql-return-generated-auto-increment-value-on-insert –

ответ

0

Ваш проект базы данных не исправить то, что вам нужно сделать, это есть две таблицы Subscriber и Category так:

подписчиков => Таблица

SubscriberID PK Auto Increment 
Name 
Email 
Phone 
CategoryID FK references Category(CategoryID) 

Категория => Таблица

CategoryID PK Auto Increment 
CategoryName 

Здесь вы можете заполнить mul несколько категорий, и в каждой категории вы можете иметь несколько подписчиков. Поэтому, когда вы хотите вставить нового абонента, вам нужно определить, в какую категорию вы хотите вставить подписчика, а затем заполнить таблицу subscriber, оставив таблицу category нетронутой. Поступая таким образом, вы всегда можете получить подписчика на категорию, используя только пункт where на абонентской таблице. Это правильный способ сделать это с точки зрения проектирования баз данных.

P.S с этим дизайном вам не придется вставлять две записи на подписчика.

0

Я не уверен, что вы делаете со своей таблицей Category_id. Это выглядит как таблица «многие-ко-многим» между таблицей «Абоненты» и таблицей без названия, которая, вероятно, называется «Категории». Это верно?

Во всяком случае, здесь есть решение, учитывая то, что я думаю, вы спрашиваете:

# set up your connection (often set up globally, just like the old style): 
$dbh = new PDO('mysql:host=localhost;dbname=my_db_name', $user, $pass); 

$dbh->beginTransaction(); 

$query = "INSERT INTO subscribers (name, email, phone) 
      VALUES (:NAME, :EMAIL, :PHONE);"; 

$dbh->prepare($query); 
$dbh->bindValue('NAME', $_POST['name']); 
$dbh->bindvalue('EMAIL', $_POST['email']); 
$dbh->bindValue('PHONE', $_POST['phone']); 
$dbh->execute(); 

$subscriber_id = $dbh->lastInsertId(); 

$query = "INSERT INTO category_id (subscriber_id, category_id) 
      VALUES (:SUBSCRIBER_ID, :CATEGORY_ID) 

$dbh->prepare($query); 
$dbh->bindValue('SUBSCRIBER_ID', $subscriber_id); 
$dbh->bindValue('CATEGORY_ID', $value_from_elsewhere); // Determined earlier. 
$dbh->execute(); 

$dbh->commit(); 

я преобразовал запрос в запрос PDO стиле. Включение переменных из POST непосредственно в строку запроса SQL может оставить вас открытыми для SQL-инъекций.

Проверить эту страницу, или что-нибудь о том, как использовать запросы PDO стиль в PHP: http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

+0

Я пробовал ваш код, но он отображает сообщение об ошибке «Fatal Ошибка: вызов неопределенного метода PDO :: bindValue() в ... строке, где bindValue появляется ". Что-то не хватает? – Cody

+0

Вам необходимо установить его, хотя я считаю, что он по умолчанию. Здесь вы можете найти информацию об этом: http://www.php.net/manual/en/pdo.setup.php –

+0

Я также добавил строку подключения в верхней части кода примера. –

Смежные вопросы