За последние 24 часа нас посетили 17667 программистов и 1723 робота. Сейчас ищут 885 программистов ...

Создание ассоциативного массива из БД

Тема в разделе "PHP для новичков", создана пользователем Alexnewaro, 21 мар 2015.

  1. Alexnewaro

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

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Приветствую!
    Прошу подсказки, а не сделать за меня.
    Приходит из формы произвольное количество ID ( name чекбоксов = exc[] )
    При приеме собирается в текстовый ряд ID:

    Код (Text):
    1. if( count($_GET['exc']) > 0 )
    2. {
    3. $exc = implode(', ',$_GET['exc']);
    4. }
    А как я могу получить для каждого полученного ID соответствующее название статьи?
    То есть я же не могу прописать заранее ассоциативный массив с названиями в этом случае, так как ID в таблице чекбоксов, доступных пользователю изначально, формируется из базы данных. Получается мне нужно, чтобы ассоциативный массив названий - id сформировался на лету, при получении списка выбранных id.

    Жесть, короче, написал.

    Посоветуете?
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Код (PHP):
    1. "SELECT*FROM `users` WHERE id='сюда подставь свою переменную Id';";
     
  3. Alexnewaro

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

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    да, я так делал

    Код (Text):
    1. if( count($_GET['exc']) > 0 )
    2. {
    3. $exc = implode(', ',$_GET['exc']);
    4. $str = ' IN ('.$exc.');
    5. }
    6.  
    7. $query = "SELECT * FROM puk WHERE `title` = '$str'";
    и спотыкаюсь дальше
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  5. Alexnewaro

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

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    ирония мимо, смотри сообщение выше.
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Ну так, ты сначала тянешь ид каждой статьи, формируешь список статьи, а потом уже в переменной $_GET у тебя уже будет нужные id при отправке на сервер выбранных чекбоксов.
    сначала
    1. получим идентификатор новости
    Код (Text):
    1. "SELECT `id` FROM news;";
    2. формируем форму с чекбоксами
    3. отправляем форму
    4. А потом уже формируем новый запрос в базу как показал денис, или как то по другому, без помощи implode/
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Alexnewaro что выше? Откуда ты взял WHERE `title` = 'IN ('1','2')' ?
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Если тебе надо получить title то
    Код (PHP):
    1. $query = "SELECT `title` FROM puk WHERE `id` in('$str');";
    что то такое
     
  9. Alexnewaro

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

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Я тоже спать хочу )))
    Вы не поняли спросоня. Я уже получил и сформировал набор ID в запросе "блаблабла IN (id1,id2,id3)"
    Короче задача получить titles для статей с выбранными ID, которые уже получены через get запрос.

    Добавлено спустя 1 минуту:
    вы меня не читаете))) это я уже сделал)))

    Добавлено спустя 52 минуты 44 секунды:
    Уточню:

    Вывел таблицу с титлами статей, id статей в качестве value и чекбоксами.
    Человек отметил те статьи, что ему интересны.
    Запрос GET передал эти выбранные id.

    Код (Text):
    1. if( count($_GET['id']) > 0 )
    2. {$exc = implode(',',$_GET['id']);}
    Скидыщь! Красота - получили
    Код (Text):
    1. 5,15,67
    Теперь хорошо бы списочком опять тайтлы подвесить на выбранные id.

    Добавляем сборку значений для запроса, выходит так:

    Код (Text):
    1.  
    2. if( count($_GET['id']) > 0 )
    3. {$exc = implode(',',$_GET['id']);
    4.  $excquery.= ' IN('.$exc.')';}
    Получили запрос:
    Код (Text):
    1. $query = "SELECT * FROM puk WHERE `id` = '$excquery'";
    то есть
    Код (Text):
    1. $query = "SELECT * FROM puk WHERE `id` = 'IN (5,15,67)' ";
    Получили в ответ массив титлов.

    И вот тут случается попа.

    Если бы варианты выбора чекбоксов всегда были одинаковые, то

    Код (Text):
    1.  
    2. $puk[5] = 'Про любовь';
    3. $puk[15] = 'Про картошку';
    4. $puk[67] = 'Про соус Карри';
    , далее

    Код (Text):
    1.  
    2. $exces= array();
    3. foreach ($_GET['id'] as $val) {
    4. $exces[] = $puk[$val];}
    5. $exces= implode(', ', $exces);
    6.  
    7. echo $exces;
    Получили бы
    Код (Text):
    1. Про любовь,Про картошку,Про соус Карри
    НО!

    Чекбоксы все время имеют разные ID, так как список статей для выбора (в самом начале путешествия) формируется на лету из базы, на основе и свежих поступлений. Поэтому заранее определенный ассоциативный массив - не катит. Получается его нужно собирать на лету.

    И вот что делать бедному гусару, если список титлов нужен-нужен?
     
  10. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    если только список title
    Там ты получаешь все содержимое, для таблицы которой id удовлетворяет условию

    Добавлено спустя 38 секунд:
    и вообще это тоже не должно быть проблемой, так тоже можно выдернуть из массива title

    Добавлено спустя 1 минуту 5 секунд:
    сделай вардам и посмотри структуру массива
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Код (PHP):
    1. $sql = "SELECT id, title FROM puk WHERE id IN(10,20,30)";
    2. ...
    3. while … {
    4.   $output[$row['id']] = $row['title'];
    5. }
    6. var_export($output); // array(10=>john, 20=>mary, 30=>jose) 
     
  12. Alexnewaro

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

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Большое спасибо за помощь! Но

    Код (Text):
    1.  
    2. if( count($_GET['id']) > 0 )
    3. {$exc = implode(',',$_GET['id']);
    4.  $excquery.= ' IN('.$exc.')';}
    5.  
    6. $query3 = "SELECT * FROM puk WHERE `id` = '$excquery'";
    7. $res3 = mysql_query($query3) or die(mysql_error());
    8. while( $row=mysql_fetch_assoc($res3))
    9. {
    10.   $output[$row['id']] = $row['title'];
    11. }
    12. var_export($output);
    Выводит NULL

     
  13. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  14. Alexnewaro

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

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Ну, собственно, вполне предсказуемый
    Код (Text):
    1. Notice: Undefined variable: output in .../bron_full.php on line 165 NULL
     
  15. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Alexnewaro поднимайся выше, что в $row смотри
     
  16. Alexnewaro

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

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Поправил запрос и массив "родился":

    Код (Text):
    1.  
    2. if( count($_GET['exc']) > 0 )
    3. {
    4. $exc = implode(',',$_GET['exc']);
    5. $str3.= ' IN('.$exc.')';
    6. }
    7.  
    8. $query3 = "SELECT * FROM puk WHERE `id` $str3";
    9.  
    10. $res3 = mysql_query($query3) or die(mysql_error());
    11. while($row=mysql_fetch_assoc($res3))
    12. {
    13.   $output[$row['id']] = $row['title'];
    14. }
    Код (Text):
    1. array ( 65 => 'Тисо-самшитовая роща в Сочи', 66 => 'Рафтинг на горных реках', )
    Но
    Код (Text):
    1. $output[$exc]
    не выводит в нужном месте список значений массива :-(
     
  17. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    а что в $exc?
     
  18. Alexnewaro

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

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    В $exc - полученные get-данные в виде 65,66
     
  19. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    у тебя в массиве $output есть ключ "65,66" ?
     
  20. Alexnewaro

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

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Я признаю, что дико туплю и чувствую, что вы меня подводите вопросами к смыслу, но пока не ухватить... Глаз замылился, наверное. Или квалификации не хватает ((
     
  21. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    ты совсем не понимаешь что такое массив, вот в чем беда.

    Добавлено спустя 1 минуту 24 секунды:
    [ ассоциативный ] массив в PHP это набор пар ключ => значение. у тебя есть ключи "65" и "66" но нет ключа "65,66"
     
  22. Alexnewaro

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

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Да, у меня мозг чисто гуманитарный, мне сложно в этом всем. Год назад я все помнил - но информация вообще не держится, приходится по мере необходимости писать что-то на PHP почти с нуля все изучать.
    Ну в итоге сделал так, но чувствую - халтура...

    echo '<td><span style="font-size:15px;color:#333; line-height: 18px;">';

    $connect = connectDB();
    {
    //Делаем третий запрос
    $query3 = "SELECT * FROM puk WHERE `id` $str3";
    $res3 = mysql_query($query3) or die(mysql_error());

    while($row=mysql_fetch_assoc($res3))
    {
    echo $output[$row['id']] = $row['title'];
    }
    }
    closeDB ($connect);

    echo '</span></td>';

    Добавлено спустя 6 минут 15 секунд:
    Но это явная фигня. Потому что я не могу управлять выводом в итоге. Результат закономерный: Тисо-самшитовая роща в СочиРафтинг на горных реках, без вариантов
     
  23. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Ну ты получил что просил с самого начала — названия статей. Только непонятно для чего ты их собирался использовать. Когда нет цели, нет и внятных ответов.
     
  24. Alexnewaro

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

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Извините.

    Статьи - условно.
    Есть список экскурсий. Список формируется из базы статей об экскурсиях. Из базы берется название экскурсии и ее ID, а также ссылка на нее.

    То есть человек открывает меню выбора экскурсий. На лету формируется список доступных экскурсий (описание которых в данный момент есть на сайте). Он щелкая на ссылку (на название), читает описание в отдельном окне. Если все нравится - отмечает чекбокс этой экскурсии. И так формирует набор чекбоксов тех экскурсий, которые хочет посетить.

    GET-запросом данные о выбранных экскурсиях (выбранные ID) уходят в форму бронирования.
    В этой форме просто нужно вывести списком выбранные человеком экскурсии, ну как бы резюмируя.

    Вот и вся задача.
     
  25. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Код (PHP):
    1. <!DOCTYPE HTML>
    2. <html>
    3. <head>
    4.     <meta charset="UTF-8">
    5.     <title></title>
    6. </head>
    7. <body>
    8. <?php
    9.  
    10. $array_db = array(1 => 'example1', 'example2', 'example3', 'example4', 'example5', 'example6');
    11.  
    12. function render_checkbox($array_db, $boxes = array())
    13. {
    14.     $buff = "<form action='' method='post'>".PHP_EOL;
    15.  
    16.     foreach ($array_db as $key => $checkbox) {
    17.  
    18.         $checked = '';
    19.  
    20.         if (isset($boxes[$key])) {
    21.             $checked = ' checked';
    22.         }
    23.  
    24.         $buff .= "<input type=checkbox name=boxes[$key] value='1'$checked>$checkbox<br>".PHP_EOL;
    25.     }
    26.  
    27.     $buff .= "<input type=submit><br>";
    28.     $buff .= "</form>";
    29.  
    30.     return $buff;
    31. }
    32.  
    33. echo render_checkbox($array_db, $_POST['boxes']);
    34.  
    35.  
    36. echo "<pre>";
    37. var_dump($_POST['boxes']);
    38. echo "</pre>";
    39. ?>
    40. </body>
    41. </html>