ФорумПрограммированиеPHP для идиотов → foreing key

foreing key

  • web-bee

    Сообщения: 119 Репутация: N Группа: Кто попало

    Spritz 14 июня 2010 г. 0:07

    В базе есть 2 таблицы, созданные так:
    	CREATE TABLE `users` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `login` VARCHAR(50) NOT NULL default '',
    `password` VARCHAR(32) NOT NULL default '',
    PRIMARY KEY(`id`)
    ) ENGINE = InnoDB;

    CREATE TABLE `items` (
    `itemid` INT NOT NULL AUTO_INCREMENT,
    `userid` INT NOT NULL,
    `name` VARCHAR(255) NOT NULL default '',
    PRIMARY KEY(`itemid`),
    FOREIGN KEY (`userid`) REFERENCES `users`(`id`)
    ) ENGINE = InnoDB;


    Пыталась связать таблицы, чтобы 1 юзеру соответствовало множество айтемс..
    Запись в таблицу `users` добавляется, а `items` - нет..
    $query = "INSERT
    INTO `items`
    SET
    `name`='{$name->mydata}'
    ";
    $sql = mysql_query($query) or die (mysql_error());

    И выдаёт такое:
    Cannot add or update a child row: a foreign key constraint fails (`sniperdb/items`, CONSTRAINT `items_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `users` (`id`))


    Видимо, неправильно я таблицы связываю.. Как исправить?
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 14 июня 2010 г. 0:34, спустя 27 минут 38 секунд

    Если строка из items привязывается к users по полю userid, очевидно, его тоже нужно задавать при вставке.
  • web-bee

    Сообщения: 119 Репутация: N Группа: Кто попало

    Spritz 14 июня 2010 г. 0:50, спустя 15 минут 39 секунд

    vasa_c, делала вот так:

    $query = "INSERT
    INTO `items`
    SET
    `userid`='users(id)',
    `name`='{$name->mydata}'
    ";
    $sql = mysql_query($query) or die (mysql_error());


    результат такойже..
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 14 июня 2010 г. 1:23, спустя 33 минуты 10 секунд

    что такое 'users(id)'? результирующий запрос покажите. В users есть строка соответствующая?
  • web-bee

    Сообщения: 119 Репутация: N Группа: Кто попало

    Spritz 14 июня 2010 г. 1:26, спустя 3 минуты 11 секунд

    users(id) - хотела написать в таблице users, поле id.. неправильно?
    а у меня его и нет.. этого результирующего запроса.. а что в нём должно быть?
  • Josh

    Сообщения: 2008 Репутация: N Группа: Кто попало

    Spritz 14 июня 2010 г. 1:58, спустя 32 минуты 11 секунд

    Какой SET ?
    $user_id = 1; //(или сколько там)
    $sql = "INSERT INTO items VALUES (null, $user_id, 'newname')";
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 15 июня 2010 г. 7:25, спустя 1 день 5 часов 27 минут

    web-bee, я не понял, ты одним INSERT сразу в две таблицы хочешь вставить?
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 15 июня 2010 г. 7:22, спустя 23 часа 56 минут 57 секунд

    Josh, SET допустим в INSERT
    Спустя 46 сек.

    $user_id = 1; //(или сколько там)
    $sql = "INSERT INTO items SET userid = $user_id, name = 'newname'";
    Спустя 68 сек.
    Josh, твой запрос плох тем, что при изменении структуры таблицы все наебнется
    Спустя 20 сек.
    т.е. добавление колонки например
    adw/0
  • web-bee

    Сообщения: 119 Репутация: N Группа: Кто попало

    Spritz 15 июня 2010 г. 11:00, спустя 3 часа 37 минут 45 секунд

    AlexB, неа, в одну..
    Сначала при авторизации нового пользователя в табл. users заносится его логин и пароль, id - автоматически добавляется..
    потом пользователь в хочет купить какой-то item,
    добавляет его себе, а мы заносим данные об этом item в табл. items,
    а чтобы знать, что этот item выбрал именно этот user - в таблице items мы показываем userid=id (из табл. users)..

    насяльника, ну, разве я похо придумаль?
    только надо теперь разобратся как этот userid в табл. создавать равным id
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 15 июня 2010 г. 11:04, спустя 3 минуты 43 секунды

    web-bee, надо этот ид брать из таблицы users и класть его в таблицу items. Так же как и
    `name`='{$name->mydata}'
    типа того
    `userid`='{$user->id}'
    adw/0
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 15 июня 2010 г. 11:10, спустя 5 минут 58 секунд

    Ну эдворд уже ответил - добавлять его явно, иначе как база узнает о каком юзере идет речь? Поэтому и ругается, foreing key как раз предохраняет от занесения в базу "подвешенного в воздухе" айтема. Могу только добавить, что как правило этот id хранят в сессии, чтоб на каждое действие пользователя его не извлекать.
  • web-bee

    Сообщения: 119 Репутация: N Группа: Кто попало

    Spritz 15 июня 2010 г. 11:19, спустя 8 минут 44 секунды

    пасиб. только как правильно обратиться к таблице?
    `name`='{$name->mydata}' - $name->mydata - это ж переменная класса,
    может так как-то:
    `userid`='users(id)' ..
  • web-bee

    Сообщения: 119 Репутация: N Группа: Кто попало

    Spritz 15 июня 2010 г. 11:24, спустя 5 минут 54 секунды

    Даже если из $_SESSION извлекать, нужно как-то id туда получить..
  • web-bee

    Сообщения: 119 Репутация: N Группа: Кто попало

    Spritz 15 июня 2010 г. 11:32, спустя 7 минут 10 секунд

    Может как-то запрос в запросе сделать? Подскажите, пожалуйста.
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 15 июня 2010 г. 12:33, спустя 1 час 1 минуту 13 секунд


    Сначала при авторизации нового пользователя в табл. users заносится его логин и пароль, id - автоматически добавляется..

    Получаете этот id и храните его в сессии, например $_SESSION['user_id']


    потом пользователь в хочет купить какой-то item,
    добавляет его себе, а мы заносим данные об этом item в табл. items,
    а чтобы знать, что этот item выбрал именно этот user - в таблице items мы показываем userid=id (из табл. users)..

    `userid`='{$_SESSION['user_id']}' ..
    adw/0

Пожалуйста, авторизуйтесь, чтобы написать комментарий!