За последние 24 часа нас посетили 18434 программиста и 1606 роботов. Сейчас ищут 907 программистов ...

Помогите с массивом

Тема в разделе "PHP для новичков", создана пользователем LAlexS, 16 июл 2014.

  1. LAlexS

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

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Есть следующее:
    Код (Text):
    1. <input type='hidden' value='".$id."' name='id[]'><input type='text' name='price[]' value='".$price."'>
    2. <input type='hidden' value='".$id."' name='id[]'><input type='text' name='price[]' value='".$price."'>
    3. <input type='hidden' value='".$id."' name='id[]'><input type='text' name='price[]' value='".$price."'>
    Передается методом POST в обработчик.
    Код (Text):
    1. $id = $_POST ['id'];
    2. $price = $_POST ['price'];
    Мне надо обновить значения в БД
    Код (Text):
    1. mysql_query ("UPDATE product_info SET price='$price' WHERE id='$id'")
    Не могу понять как это сделать с помощью foreach. Или здесь другая конструкция требуется?
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Не могу понять, зачем вам программировать, если вы уже все сказали, и даже как.
     
  3. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Я ж надеюсь, что у вас поле "id" или первичный, или уникальный ключ? Если да - смотрим ниже:
    1. Объединяете массивы
    Код (PHP):
    1. $allData = array_map( null, $id, $price );
    2. Генерируете запрос:
    Код (PHP):
    1. $query = "INSERT INTO `product_info` (`id`,`price`) VALUES ";
    2. $params = array();
    3. foreach($allData as $val){
    4.     $params[] = '('.$val[0] .','.$val[1].')';
    5. }
    6. $query .= implode(',', $params) . " ON DUPLICATE KEY UPDATE `price` = VALUES(`price`)";
    3. Запускаете запрос и идёте на радостях пить пиво.
    (*) Обязательно следите за порядком. В примере, объединяя массивы, первое значение - id, а второе - price. При генерировании запроса, значения подставлять соответственно.
     
  4. LAlexS

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

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Благодарю за участие!
    Код (Text):
    1. Warning: array_map() [function.array-map]: Argument #2 should be an array in ... on line 15
    2. Invalid argument supplied for foreach() in ... on line 19
    Выдает такую ошибку ((
     
  5. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Посмотрите, что у вас приходит в $_POST['id'] и $_POST['price'], видимо, что-то из них не массив
     
  6. LAlexS

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

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Проверил с помощью print_r. И то и другое массив.
     
  7. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Тогда проверяйте непосредственно то, что передается в array_map.
     
  8. LAlexS

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

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Вызвал print_r($allData);
    получил
    Код (Text):
    1. Array ( [0] => Array ( [0] => 4661 [1] => 0 ) [1] => Array ( [0] => 4660 [1] => 0 ) [2] => Array ( [0] => 4659 [1] => 0 ) [3] => Array ( [0] => 4658 [1] => 0 ) [4] => Array ( [0] => 4657 [1] => 0 ) [5] => Array ( [0] => 4656 [1] => 0 ) [6] => Array ( [0] => 4655 [1] => 0 ) [7] => Array ( [0] => 4654 [1] => 0 ) [8] => Array ( [0] => 4653 [1] => 0 ) [9] => Array ( [0] => 4652 [1] => 0 ) [10] => Array ( [0] => 4651 [1] => 0 ) [11] => Array ( [0] => 4650 [1] => 0 ) [12] => Array ( [0] => 4649 [1] => 0 ) [13] => Array ( [0] => 4648 [1] => 0 ) [14] => Array ( [0] => 4647 [1] => 0 ) [15] => Array ( [0] => 4646 [1] => 0 ) [16] => Array ( [0] => 4645 [1] => 0 ) [17] => Array ( [0] => 4644 [1] => 0 ) [18] => Array ( [0] => 4643 [1] => 0 ) [19] => Array ( [0] => 4642 [1] => 0 ) [20] => Array ( [0] => 4641 [1] => 0 ) [21] => Array ( [0] => 4640 [1] => 0 ) [22] => Array ( [0] => 4639 [1] => 0 ) [23] => Array ( [0] => 4638 [1] => 0 ) [24] => Array ( [0] => 4637 [1] => 0 ) [25] => Array ( [0] => 4636 [1] => 0 ) [26] => Array ( [0] => 4635 [1] => 0 ) [27] => Array ( [0] => 4634 [1] => 0 ) [28] => Array ( [0] => 4633 [1] => 0 ) [29] => Array ( [0] => 4632 [1] => 0 ) )
    0 в значении это так и надо. А вот остальное я не совсем понимаю — правильно или нет
     
  9. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Чувствую, пришло время показать код :)
     
  10. LAlexS

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

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    В первом посте просто упростил и изменил имена для простоты восприятия
    Код (Text):
    1. while ($product = mysql_fetch_array ($product_list))
    2. {
    3. <input type='hidden' value='".$product['id']."' name='product_id[]'><input type='text' name='vendor_price[]' value='".$product['vendor_price']."' size='6'>
    4. }
    Код (Text):
    1. $id = $_POST ['product_id'];
    2. $vendor_price = $_POST ['vendor_price'];
    3.    
    4. $allData = array_map(null, $id, $vendor_price);
    5.    
    6. $query = "INSERT INTO `product_info` (`id`,`vendor_price`) VALUES ";
    7. $params = array();
    8. foreach($allData as $val){
    9.  $params[] = '('.$val[0] .','.$val[1].')';
    10.     }
    11. $query .= implode(',', $params) . " ON DUPLICATE KEY UPDATE `vendor_price` = VALUES(`vendor_price`)";
     
  11. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Переходите по этой ссылке, нажимаете Run (или F9) для запуска сценария, отправляете форму и убеждаетесь в том, что всё работает нормально. Дальше ищите тридцать три отличия в вашем реальном коде и рассказываете о них. Тогда будем думать.
     
  12. LAlexS

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

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Всем спасибо за участие. Решил вопрос таким образом (с удовольствием почитаю критические отзывы такого решения):
    Код (Text):
    1. $n=sizeof($_POST['product_id']) ;
    2.     for($i=0;$i<$n;$i++)
    3.         {
    4.         $id =$_POST['product_id'][$i];
    5.         $vprice=$_POST['vendor_price'][$i];
    6.         mysql_query("UPDATE product_info SET vendor_price='$vprice' WHERE id=$id");
    7.         }
    Зато все работает ))
     
  13. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Это решение "влоб" и первое, что приходит на ум новичкам. Не буду критиковать его, оно имеет право на жизнь, но вот точно покритикую за то, что до сих пор используете устаревшее расширение для работы с базой mysql_*. Переходите на PDO или MySQLi.
     
  14. LAlexS

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

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Спасибо! Учту.