За последние 24 часа нас посетили 37154 программиста и 1721 робот. Сейчас ищут 649 программистов ...

запутался с foreach

Тема в разделе "PHP и базы данных", создана пользователем TigerZaka, 14 дек 2012.

  1. TigerZaka

    TigerZaka Активный пользователь

    С нами с:
    16 сен 2011
    Сообщения:
    189
    Симпатии:
    1
    Приветствую!

    приходит такой массив POST:
    Код (Text):
    1.  
    2. array(3) {
    3.  ["city"]=> string(1) "1"
    4.  ["block"]=> array(2)
    5.     {
    6.      [0]=> string(1) "2"
    7.      [1]=> string(1) "4"
    8.     }
    9.  ["streetN"]=> string(3) "ул.Ленина"
    10. }
    вот мой код:
    Код (Text):
    1.  
    2. $cityID = $_POST['city'];
    3. $street = $_POST['streetN'];
    4.  
    5. $query = "INSERT INTO `streets` VALUES(NULL, '$street', '$cityID' )";
    6. foreach ($_POST['block'] as $values) {
    7.     $query1 = "INSERT INTO `streets_blocks` VALUES (LAST_INSERT_ID(), '$values')";
    8. }
    9. if (mysql_query($query) & mysql_query($query1)) {
    10.     echo "успешно";
    11. } else {
    12.     echo "ошибка", mysql_error();
    13. }
    ну первая таблица отлично, а во вторую добавляется только последнее значение:
    Код (Text):
    1.  
    2. string(55) "INSERT INTO `streets` VALUES(NULL, 'ул.Ленина', '1' )"
    3. string(59) "INSERT INTO `streets_blocks` VALUES (LAST_INSERT_ID(), '4')"
    Подскажите, как это исправить, никак не пойму синтаксис
     
  2. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    Код (Text):
    1. mysql_query($query1)){
    этот код делается вне foreach, который, в данном варианте, перезаписывает переменную $query1
    надо например так
    Код (Text):
    1. foreach ($_POST['block'] as $values) {
    2.    $query1 = "INSERT INTO `streets_blocks` VALUES (LAST_INSERT_ID(), '$values')";
    3. mysql_query($query1);
    4. }
    ну думаю разберётесь.
    и так же обратите внимание на использовании LAST_INSERT_ID, если вы будете юзать его в foreach тогда значение LAST_INSERT_ID будет меняться если в таблице есть инкремент-индекс поле, поэтому, как я понимаю, вам нужно после
    Код (Text):
    1. $query = "INSERT INTO `streets` VALUES(NULL, '$street', '$cityID' )";
    дописать например
    Код (Text):
    1. $street_id=LAST_INSERT_ID();
    и соотв.
    Код (Text):
    1. $query1 = "INSERT INTO `streets_blocks` VALUES (LAST_INSERT_ID(), '$values')";
    поменять на
    Код (Text):
    1. $query1 = "INSERT INTO `streets_blocks` VALUES ($street_id, '$values')";
    так же советую прочитать про массовый INSERT в одну таблицу. валидней делать всё одним запросом чем многими, если это возможно. массовый работает в десятки раз быстрее чем много мелких.
     
  3. TigerZaka

    TigerZaka Активный пользователь

    С нами с:
    16 сен 2011
    Сообщения:
    189
    Симпатии:
    1
    Большое спасибо, все стало понятно. Единственное, last_insert_id() - вроде sql функция? вообщем, если использовать
    Код (Text):
    1. $street_id=LAST_INSERT_ID();
    то выскакивает ошибка
    Код (Text):
    1. Fatal error: Call to undefined function LAST_INSERT_ID
    Попробовал заменить на mysql_insert_id, тогда в ID'шники возвращается ноль. В чем здесь может быть загвоздка?
     
  4. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    Код (Text):
    1. $street_id=mysql_query(LAST_INSERT_ID());
    попробуй так
     
  5. TigerZaka

    TigerZaka Активный пользователь

    С нами с:
    16 сен 2011
    Сообщения:
    189
    Симпатии:
    1
    неа,..если возникнут идеи, буду рад )
     
  6. tchk

    tchk Активный пользователь

    С нами с:
    8 дек 2012
    Сообщения:
    10
    Симпатии:
    0
    Код (Text):
    1.  
    2. $sql= 'INSERT INTO streets (cityid,strname) VALUES ('.$_POST['cityid'].','.$_POST['strname'].')';
    3. if (!mysql_query($sql))
    4.   {
    5.   die('Error: ' . mysql_error());
    6.   }
    7. $street_id=mysql_insert_id();
    При условии что в таблице streets есть какой_то_id (auto_increment) (без него не пробовал :))

    Стало интересно - проверил. Если в таблице нет PRIMARY KEY auto_increment - mysql_insert_id() возвращает 0.
    Помогает следующее надругательство над таблицей MYSQL:
    Код (Text):
    1. ALTER TABLE `test` ADD `id` INT(9) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
     
  7. TigerZaka

    TigerZaka Активный пользователь

    С нами с:
    16 сен 2011
    Сообщения:
    189
    Симпатии:
    1
    спасибо за ответы. В итоге вернулся к 'mysql_insert_id()'.
    Сам себя надурил, у меня 0 возвращался, потому что я mysql_query позже чем надо вставил ))