За последние 24 часа нас посетили 18150 программистов и 1599 роботов. Сейчас ищут 932 программиста ...

Вывод из БД нескольких полей с разными id

Тема в разделе "PHP и базы данных", создана пользователем АлексейKKK, 26 дек 2010.

  1. АлексейKKK

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

    С нами с:
    26 дек 2010
    Сообщения:
    22
    Симпатии:
    0
    Здравствуйте! Подскажите, пожалуйста!

    Как создать запрос SELECT , т.е. выбор одновременно нескольких полей из БД с разными id.
    Поясняю. Имеется форма с 500-ми пунктами и выбором для каждого пункта позиций из выпадающего списка цифр от 1 до 5 с именем name=numer..
    Когда посетитель выбирает n- пунктов и присваивает им номер (один из 1 - 5) эти данные передаются в фаил- обработчик например в виде:
    …..obrabotchik.php?numer=1&numer=2&numer=4&numer=3
    (т.е. посетитель выбрал 4 пункта из 500 и присвоил каждому пункту свой номер: 1,2,4,3).

    В БД имеется таблица с полями и поля включают в себя данные: id, naimenovanie, vid, nome, где
    переменной numer соответствуе номер id, в таблице БД, то при команде:

    $result=mysql_query("SELECT * FROM table WHERE id='$numer'",$db);
    do {printf “<p> Наименование: %s </p> <p> Вид: %s </p> <p>Номер: %s </p>
    ",$myrow["naimenovanie"],$myrow["vid"],$myrow["nome"]);}
    while ($myrow= mysql_fetch_array($result));

    Из БД выводятся не все поля с id = numer, а только последнее, в данном случае с id=3, т.к. …&numer=3 стоит последним, а остальные (...?numer=1&numer=2&numer=4) не выводятся.
    Подскажите пожалуйста, как вывести все поля с номерами (id=numer), которые переданы формой?
    Заранее огромное СПАСИБО!
     
  2. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    WHERE id IN (1,2,3,4 ... n)
     
  3. АлексейKKK

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

    С нами с:
    26 дек 2010
    Сообщения:
    22
    Симпатии:
    0
    Спасибо за ответ tommyangelo!
    Видимо я не совсем правильно объяснил.
    Если в код я поставлю WHERE id IN (1,2,3,4 ... 500), то выдедутся все данные из БД с id=1...id=500, а нужно только те, которые выбрал посетитель, т.е. которые передаются формой в виде переменной $numer.
    Например если выбраны из 500 пунктов только 1-й, 25-й, 27-й, 153-й, 489-й, то их и нужно вывести из БД.

    Заранее спасибо!
     
  4. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    АлексейKKK

    Блин, это видимо я неправильно объяснил

    WHERE id IN (1,25,37,153, 489)

    В скобках перечисляешь нужные значения
     
  5. АлексейKKK

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

    С нами с:
    26 дек 2010
    Сообщения:
    22
    Симпатии:
    0
    tommyangelo

    Только загвоздка в том, что я не знаю эти нужные значения, к сожалению.
    Какие из 500 пунктов выберет посетитель мне неизвестно, а если он выберет 5, 10, 35.... или 7, 18, 56 к примеру, вот поэтому мне и нужна переменная $numer, которая передаёт выбранный посетителем номер или номера в файл-обработчик и уже в нем мне нужно прописать код, ктоторый бы и выводил только те номера которые выбраны, но сам указать эти номера я не могу, т.к. не знаю какие из 500 будут выбраны.

    Спасибо!
    P.S. Извините за настойчивость.
     
  6. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    в каком виде ты их принимаешь?
    Массивом?
     
  7. АлексейKKK

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

    С нами с:
    26 дек 2010
    Сообщения:
    22
    Симпатии:
    0
    tommyangelo

    $result=mysql_query("SELECT * FROM table WHERE id='$numer'",$db);
    Теперь немного проясняется, действительно нужно выводить массивом.
    Уважаемый tommyangelo если Вам не трудно, подскажите пожалуйста как это делается (кусочек кода - если можно).

    Заранее большое спасибо!
     
  8. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Давай на ты.

    Мы сейчас о разных вещах говорим.
    Вопрос - как ты планируешь дать пользователю возможность выбора? Как будет выглядеть форма?

    Желательно код, хотя бы кусочек
     
  9. АлексейKKK

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

    С нами с:
    26 дек 2010
    Сообщения:
    22
    Симпатии:
    0
    tommyangelo

    Форма простая в следующем виде:

    <form action="obrabotchik.php" method="post" name="forma">
    Пункт1 <input name="numer" type="checkbox" value="1"> <br>
    Пункт2 <input name="numer" type="checkbox" value="2"> <br>
    Пункт3 <input name="numer" type="checkbox" value="3"> <br>
    ...
    Пункт500<input name="numer" type="checkbox" value="500"> <br>
    <input name="submit" type="submit" value="Отправить">
    </form>

    И затем в файл - обработчик (obrabotchik.php) передаются данные : ...obrabotchik.php?numer=1&numer=25&numer=49&numer=323 например.
    А выдод из БД, согласно моему коду: $result=mysql_query("SELECT * FROM table WHERE id='$numer'",$db);, происходит только последнего номера (323), а номера 1,25,49 - нет.

    Вот такие дела.

    P.S. Наверное Вам такой еще лузер не встречался.
     
  10. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Вообще, я бы лучше методом post передавал, но тебе виднее

    Передавать будем массивом. Для этого меняем в инпутах

    Пункт1 <input name="numer[]" type="checkbox" value="1"> <br>
    Пункт2 <input name="numer[]" type="checkbox" value="2"> <br>
    Пункт3 <input name="numer[]" type="checkbox" value="3"> <br>
    ...
    Пункт500<input name="numer[]" type="checkbox" value="500"> <br>

    Тогда в обработчике мы получим массив $number = $_POST['number'] либо $number = $_GETT['number'] в зависимости от того, каким методом передается форма

    Потом формируем сам sql-запрос в цикле
    Код (Text):
    1.  
    2. $sql = "SELECT * FROM table WHERE id IN (";
    3. foreach ($number as $key=>$value)
    4. {  
    5.     $sql .= "'".$value."',";
    6. }
    7. //только у нас получается лишняя запятая, обрежем её
    8.  
    9. $sql = rtrim ( $sql, ",");
    10. //допишем запрос до конца
    11.  
    12. $sql .= ");";
    13.  
    14. $result = mysql_query($sql);
    Это общая идея.
     
  11. АлексейKKK

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

    С нами с:
    26 дек 2010
    Сообщения:
    22
    Симпатии:
    0
    Спасибо большое tommyangelo!

    Идея понятна, как только сделаю обязательно отпишусь.

    Ещё раз СПАСИБО!

    До встречи!
     
  12. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    А implode не подойдет? =))
     
  13. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    ой, точно, я забыл про него)))
     
  14. АлексейKKK

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

    С нами с:
    26 дек 2010
    Сообщения:
    22
    Симпатии:
    0
    Здравствуйtommyangelo!

    Я извиняюсь за долгое молчание, на то были причины личного характера.
    Возвращаясь к нашему вопросу, то спешу выразить тебе огромное спасибо!
    Твой пример действительно очень помог мне разобраться с вопросом.
    Ещё раз большое спасибо!
     
  15. АлексейKKK

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

    С нами с:
    26 дек 2010
    Сообщения:
    22
    Симпатии:
    0
    ЗдравствуйтеVolt(220)!Если у вас есть возможность подскажите пожалуйста.
    Возвращаясь к данной теме вывода полей из БД, возникла еще одна ситуация.Необходимо вывести из tabl (БД) поле text, но уже не только по номеру (id), а еще и по второму условию, т.е. по категории (categ).
    Форму составил такую:
    <form action="obr.php" method="post" name="form">

    <input name="categ" type="text" size="2" maxlength="5">
    <input name="id" type="hidden" value="1">

    <input name="categ" type="text" size="2" maxlength="5">
    <input name="id" type="hidden" value="2">

    <input name="categ" type="text" size="2" maxlength="5">
    <input name="id" type="hidden" value="3">
    <input name="sub" type="submit" value="Отправить">
    </form>
    Т.е. необходимо создать два условия для выбора поля (text) из БД - это номер пункта (id) и его категория (categ):
    Пример таблицы из БД:
    id categ text
    1 2 Текст описания пункта 1
    2 1 Текст описания пункта 2
    3 3 Текст описания пункта 3

    Например:
    Посетитель в поле формы вводит номер категории, допустим в первое поле формы он ввел 2, затем 3 и далее 1.
    Потом эти данные отпраляются в файл-обработчик в виде:
    obr.php?categ=2&id=1&categ=3&id=2&categ=1&id=3&sub
    И вот здесь задача вывести из БД поля описаний (text), по двум условиям categ и id? что бы паре id и categ соответствовал свой текст описания из поля text в БД
    Не исключено, что и форма изначально сделана неправильно.

    Вот такая блин ситуация.....уже голову сломал.
    Заранее спасибо!
     
  16. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    1)Форма вернет только 2 значения, т.к. имена полей совпадают и одни значения затирают другие. Т.е. надо использовать массивы: name=categ[].
    2)Нужно соотнести идентификатор категории с номером, например:
    HTML:
    1. <form action="obr.php" method="post" name="form">
    2.  
    3. <input name="categ[0]" type="text" size="2" maxlength="5">
    4. <input name="id[0]" type="hidden" value="1">
    5.  
    6. <input name="categ[1]" type="text" size="2" maxlength="5">
    7. <input name="id[1]" type="hidden" value="2">
    8.  
    9. <input name="categ[2]" type="text" size="2" maxlength="5">
    10. <input name="id[2]" type="hidden" value="3">
    11. <input name="sub" type="submit" value="Отправить">
    12. </form>
    3)Обрабатываем форму:
    PHP:
    1. <?php
    2. $catIds=$_POST['categ'];
    3. $nums=$_POST['id'];
    4.  
    5. $catNum=count(catIds);
    6. $sql='SELECT * FROM table WHERE 1=2 ';
    7. for($i=0;$i<$catNum; $i++){
    8.     if (!isset($nums[$i])) die('Форма составлена неверно.');
    9.     $sql.=' or (id='.$nums[$i].' and categ='.catIds[$i].') ';
    10. }
    11.  
    12. $db->select($sql);
    13.  
     
  17. АлексейKKK

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

    С нами с:
    26 дек 2010
    Сообщения:
    22
    Симпатии:
    0
    Volt(220)
    Спасибо! С формой понятно, а вот с РНР выдает ошибку:

    Parse error: syntax error, unexpected '[' in Z:\home\localhost\....\obr.php on line 9, т.е. в строке

    $sql.=' or (id='.$nums[$i].' and categ='.catIds[$i].') ';
     
  18. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Ну уж с синтаксическими ошибками, я думаю можете и сами разобраться.
     
  19. АлексейKKK

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

    С нами с:
    26 дек 2010
    Сообщения:
    22
    Симпатии:
    0
    Добрый деньVolt(220)

    Спасибо большое за код, но т.к. я в РНР еще даже и не начинающий поясните пожалуйста стоку:
    $sql='SELECT * FROM table WHERE 1=2 ' - т.е. запрос к табл. БД вытащить все поля где , а вот здесь не могу разобраться 1=2, как это прочитать?

    А с синтаксическими ошибками разобрался, видимо у меня версия РНР не воспринимает некоторые запросы, а когда поменял ' на " ошибка исчезла, кстати и запрос в виде $db->select($sql), тоже не воспринимает, пробую переписать как:
    $sql=mysql_query("SELECT * FROM test_1 WHERE 1=2",$db);
    Или я не прав?
     
  20. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    1)Ошибка была в том, что перед catIds[$i] не хватает знака доллара.
    2)Посмотрите на итоговый запрос. Если не написать 1=2, то БД ругнется на неправильный синтаксис около where.
    3)Естественно $db->select заменяется на ваш способ работы с БД. Моя задача показать идею, а ваша задача эту идею понять и адаптировать.
     
  21. АлексейKKK

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

    С нами с:
    26 дек 2010
    Сообщения:
    22
    Симпатии:
    0
    Уважаемый Volt(220)

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

    Я вместо $db->select прописал:

    while($row=mysql_fetch_array($result)// берем результаты из каждой строки
    echo "<p> '.$row['text'].'</p>";// выводим данные

    но ничего не выходит, данные не выводятся из БД. Уже всё перепробывал....ну что не так?

    Видимо совсем знаний рнр не хватает.
     
  22. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    0)Вылезают ли какие-нибудь ошибки? Какие?
    1)Перед $result=mysql_query($sql); Сделайте die($sql); и покажите какой получается запрос. Проверьте его в консоли, PMA или в той программе которую вы используете для работы с БД.
     
  23. АлексейKKK

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

    С нами с:
    26 дек 2010
    Сообщения:
    22
    Симпатии:
    0
    Здравствуйте Volt(220)!

    Очень рад, что вы отвечаете на мои вопросы. Спасибо большое!

    Я немного перестроил под свой манер код и сделал die ($result);:

    <?php
    $catIds=$_POST['categ'];
    $nums=$_POST['id'];

    $catNum=count(catIds);
    die ($result);
    $result=mysql_query("SELECT * FROM test_1 WHERE 1=2",$db);
    for($i=0;$i<$catNum; $i++)
    {
    if (!isset($nums[$i])) {die('Форма составлена неверно.');}

    $result.=" or (id='.$nums[$i].' and categ='.$catIds[$i].') ";
    }
    while($row=mysql_fetch_array($result)// берем результаты из каждой строки
    echo "<p> '.$row['text_a'].'</p>";// выводим данные
    ?>

    но в итоге выводит сообщение:

    Parse error: syntax error, unexpected T_ECHO , неправильно прописал функцию echo.
     
  24. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    0)Что значит данная ошибка? Почему она возникает?
    1)
    Код (Text):
    1. die ($result);
    Зачем?! Переменной $result еще не существует. Более того $result будет переменной типа ресурс, его даже var_dump'ом не просмотреть. И он нас совершенно не интересует.
    2)
    Код (Text):
    1. $result=mysql_query("SELECT * FROM test_1 WHERE 1=2",$db);
    Смысл данной строчки? 1=2 всегда false т.е. запрос не вернет ничего.
    3)
    Код (Text):
    1. $result.=" or (id='.$nums[$i].' and categ='.$catIds[$i].') ";
    Зачем вы пытаетесь сконкатенировать ресурс и строку?
    4)Сравните
    PHP:
    1. <?php
    2. $sql='SELECT * FROM table WHERE 1=2 ';
    3.  for($i=0;$i<$catNum; $i++){
    4.      if (!isset($nums[$i])) die('Форма составлена неверно.');
    5.      $sql.=' or (id='.$nums[$i].' and categ='.catIds[$i].') ';
    6.  }
    7.  
    8.  $db->select($sql);
    и
    PHP:
    1. <?php
    2.  $result=mysql_query("SELECT * FROM test_1 WHERE 1=2",$db);
    3. for($i=0;$i<$catNum; $i++)
    4. {
    5. if (!isset($nums[$i])) {die('Форма составлена неверно.');}
    6.  
    7. $result.=" or (id='.$nums[$i].' and categ='.$catIds[$i].') ";
    8. }
    9. while($row=mysql_fetch_array($result)// берем результаты из каждой строки
    10. echo "<p> '.$row['text_a'].'</p>";// выводим данные
    11.  
    В чем разница?
    5)Размечайте код соответствующими bb кодами.
     
  25. АлексейKKK

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

    С нами с:
    26 дек 2010
    Сообщения:
    22
    Симпатии:
    0
    Вернул код к исходному:

    <?php

    $catIds=$_POST['categ'];
    $nums=$_POST['id'];

    $catNum=count(catIds);

    $sql='SELECT * FROM test_1 WHERE 1=2 ';
    for($i=0;$i<$catNum; $i++){
    if (!isset($nums[$i])) die('Форма составлена неверно.');
    $sql.=' or (id='.$nums[$i].' and categ='.$catIds[$i].') ';
    }

    $db->select($sql);

    После этого выдал ошибку:

    Call to a member function select() on a non-object

    поискал в интернете, нашел что то вроде:
    Эта ошибка означает, что $db не является экземпляром объекта.

    Тогда прописал:

    <?php

    $catIds=$_POST['categ'];
    $nums=$_POST['id'];

    $catNum=count(catIds);

    $sql='SELECT * FROM test_1 WHERE 1=2 ';
    for($i=0;$i<$catNum; $i++){
    if (!isset($nums[$i])) die('Форма составлена неверно.');
    $sql.=' or (id='.$nums[$i].' and categ='.$catIds[$i].') ';
    }
    $mydb = new db;// Создаем объект класса db
    $db->select($sql);

    ?>
    после этого выдает ошибку:

    Fatal error: Class 'db' not found
    т.е. не помогло. класс не найден.[/php][/code]