Здравствуйте! Подскажите, пожалуйста! Как создать запрос 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), которые переданы формой? Заранее огромное СПАСИБО!
Спасибо за ответ tommyangelo! Видимо я не совсем правильно объяснил. Если в код я поставлю WHERE id IN (1,2,3,4 ... 500), то выдедутся все данные из БД с id=1...id=500, а нужно только те, которые выбрал посетитель, т.е. которые передаются формой в виде переменной $numer. Например если выбраны из 500 пунктов только 1-й, 25-й, 27-й, 153-й, 489-й, то их и нужно вывести из БД. Заранее спасибо!
АлексейKKK Блин, это видимо я неправильно объяснил WHERE id IN (1,25,37,153, 489) В скобках перечисляешь нужные значения
tommyangelo Только загвоздка в том, что я не знаю эти нужные значения, к сожалению. Какие из 500 пунктов выберет посетитель мне неизвестно, а если он выберет 5, 10, 35.... или 7, 18, 56 к примеру, вот поэтому мне и нужна переменная $numer, которая передаёт выбранный посетителем номер или номера в файл-обработчик и уже в нем мне нужно прописать код, ктоторый бы и выводил только те номера которые выбраны, но сам указать эти номера я не могу, т.к. не знаю какие из 500 будут выбраны. Спасибо! P.S. Извините за настойчивость.
tommyangelo $result=mysql_query("SELECT * FROM table WHERE id='$numer'",$db); Теперь немного проясняется, действительно нужно выводить массивом. Уважаемый tommyangelo если Вам не трудно, подскажите пожалуйста как это делается (кусочек кода - если можно). Заранее большое спасибо!
Давай на ты. Мы сейчас о разных вещах говорим. Вопрос - как ты планируешь дать пользователю возможность выбора? Как будет выглядеть форма? Желательно код, хотя бы кусочек
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. Наверное Вам такой еще лузер не встречался.
Вообще, я бы лучше методом 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): $sql = "SELECT * FROM table WHERE id IN ("; foreach ($number as $key=>$value) { $sql .= "'".$value."',"; } //только у нас получается лишняя запятая, обрежем её $sql = rtrim ( $sql, ","); //допишем запрос до конца $sql .= ");"; $result = mysql_query($sql); Это общая идея.
Спасибо большое tommyangelo! Идея понятна, как только сделаю обязательно отпишусь. Ещё раз СПАСИБО! До встречи!
Здравствуйtommyangelo! Я извиняюсь за долгое молчание, на то были причины личного характера. Возвращаясь к нашему вопросу, то спешу выразить тебе огромное спасибо! Твой пример действительно очень помог мне разобраться с вопросом. Ещё раз большое спасибо!
Здравствуйте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 в БД Не исключено, что и форма изначально сделана неправильно. Вот такая блин ситуация.....уже голову сломал. Заранее спасибо!
1)Форма вернет только 2 значения, т.к. имена полей совпадают и одни значения затирают другие. Т.е. надо использовать массивы: name=categ[]. 2)Нужно соотнести идентификатор категории с номером, например: HTML: <form action="obr.php" method="post" name="form"> <input name="categ[0]" type="text" size="2" maxlength="5"> <input name="id[0]" type="hidden" value="1"> <input name="categ[1]" type="text" size="2" maxlength="5"> <input name="id[1]" type="hidden" value="2"> <input name="categ[2]" type="text" size="2" maxlength="5"> <input name="id[2]" type="hidden" value="3"> <input name="sub" type="submit" value="Отправить"> </form> 3)Обрабатываем форму: PHP: <?php $catIds=$_POST['categ']; $nums=$_POST['id']; $catNum=count(catIds); $sql='SELECT * FROM table 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);
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].') ';
Добрый день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); Или я не прав?
1)Ошибка была в том, что перед catIds[$i] не хватает знака доллара. 2)Посмотрите на итоговый запрос. Если не написать 1=2, то БД ругнется на неправильный синтаксис около where. 3)Естественно $db->select заменяется на ваш способ работы с БД. Моя задача показать идею, а ваша задача эту идею понять и адаптировать.
Уважаемый Volt(220) Я понимаю, что глупые вопросы раждражают, но простите пожалуйста, что только не делал и как только не пробывал адаптировать последнюю строку под свой манер, но ничего не выходит, помогите если не сложно. Я вместо $db->select прописал: while($row=mysql_fetch_array($result)// берем результаты из каждой строки echo "<p> '.$row['text'].'</p>";// выводим данные но ничего не выходит, данные не выводятся из БД. Уже всё перепробывал....ну что не так? Видимо совсем знаний рнр не хватает.
0)Вылезают ли какие-нибудь ошибки? Какие? 1)Перед $result=mysql_query($sql); Сделайте die($sql); и покажите какой получается запрос. Проверьте его в консоли, PMA или в той программе которую вы используете для работы с БД.
Здравствуйте 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.
0)Что значит данная ошибка? Почему она возникает? 1) Код (Text): die ($result); Зачем?! Переменной $result еще не существует. Более того $result будет переменной типа ресурс, его даже var_dump'ом не просмотреть. И он нас совершенно не интересует. 2) Код (Text): $result=mysql_query("SELECT * FROM test_1 WHERE 1=2",$db); Смысл данной строчки? 1=2 всегда false т.е. запрос не вернет ничего. 3) Код (Text): $result.=" or (id='.$nums[$i].' and categ='.$catIds[$i].') "; Зачем вы пытаетесь сконкатенировать ресурс и строку? 4)Сравните PHP: <?php $sql='SELECT * FROM table 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); и PHP: <?php $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>";// выводим данные В чем разница? 5)Размечайте код соответствующими bb кодами.
Вернул код к исходному: <?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]