|
|
|
| решил опробовать интересный плагин chosen, где в селект форма имеет строку поиска и где можно выбрать несколько записей сразу(в моем случае, это адресаты) так вот у меня вопрос, как заносить в БД несколько по сути одинаковых переменных?
исходники
запрос к БД( мне бы его модифицировать)
$query = "SELECT * FROM usermessages";
$query = "INSERT INTO usermessages (`nomer`, `to`, `from`, `date`, `title`, `message`, `new`) VALUES ('$nr', '$to', '$user', '$date', '$titles', '$messages', '$novo')";
$result=mysql_query($query, $link) or die(" Error returned if any: ".mysql_error());
}
|
код селекта
<select data-placeholder="Кому..." class="chosen-select" multiple style="width:300px;" tabindex="4" name="to">
<?php
global $link;
$query = "SELECT id, name, surname FROM `users`
WHERE `id` IN (SELECT IF(`user_invited` = $user_id, `user_inviter`, `user_invited`)FROM `users_status` WHERE (`user_inviter` = $user_id OR `user_invited` = $user_id) AND `stat_val_id` = 2)";
$result=mysql_query($query, $link) or die(" Error returned if any: ".mysql_error());
while ($myrow = mysql_fetch_array($result)){
echo "<option value='".$myrow['id']."'> ".$myrow['name']." ".$myrow['surname']." </option>";
}
echo "</select>"; ?>
|
поясню - при выборе нескольких адресатов ($to) мне необходимо составить запрос к скуль, который внесет либо несколько записей в БД, либо одну, но с несколькими адресатами одновременно.
Спасибо за внимание и заранее благодарю за помощь | |
|
|
|
|
|
|
|
для: Ph_mx
(23.09.2013 в 15:59)
| | Добавляй []
В цикле занеси в базу | |
|
|
|
|
|
|
|
для: Jovidon
(23.09.2013 в 17:07)
| | спасибо большое, теперь, правда возникают проблемы с отображением получаемого сообщения у пользователя. плюс не совсем понятно как в БД хранить информацию- там в to сохранен array
скрипт получателя сообщения
<?php
global $link;
$query = "SELECT * FROM usermessages where `to`='$user_id' order by id desc";
$result = mysql_query($query, $link);
echo "<table border=\"0\">";
echo "<tr><td width=\"70\"> от кого </td><td width=\"100\">время</td><td width=\"200\">заголовок
</td><td width=\"100\"></td></tr>";
while ($rows = mysql_fetch_array($result))
{
$new = "$rows[new]";
if($new=='yes')
{
echo "<tr><td><b><a href=\"member.php?id=$rows[from]\">$rows[from]</a></b></td><td><b>$rows[date]</b></td><td><b><a href=\"viewmessage.php?id=$rows[nomer]\">$rows[title]</a></b></td> <td></td></tr>";
}
else
{
echo "<tr><td><a href=\"member.php?id=$rows[from]\">$rows[from]</a></td><td>$rows[date]</td><td><a href=\"viewmessage.php?id=$rows[nomer]\">$rows[title]</a></td><td></td></tr>";
}
}
echo "</table>";
?>
|
и если можно - подскажите пожалуйста как составить запрос к БД, что б в $rows[from] отображались имя и фамилия(from 'users' where id=$rows[from]). ведь по сути нельзя в запросе MySQL указывать массив. благодарю за оказанное внимание и прошу прощения за мою некомпетентность в вопросах масивов и PHP в целом)) | |
|
|
|
|
|
|
|
для: Ph_mx
(23.09.2013 в 18:02)
| |
<select name="to[]">
<?php
.....
while($myrow = mysql_fetch_array($result)){
echo '<option value="'.$myrow['id'].'">'.$myrow['name'].' '.$myrow['surname'].'</option>';
}
?>
</select>
|
скрипт получателя сообщения
<?
for($i=0; $i<count($to); $i++){
$query = "SELECT *
FROM usermessages
WHERE `to` = " . $to[$i] . "
ORDER BY id
DESC";
// и выводите сообщение
}
|
>и если можно - подскажите пожалуйста как составить запрос к БД, что б в $rows[from] отображались имя и фамилия(from 'users' where id=$rows[from])
то есть вы хотите $rows[form] отображались имя и фамилия а потом запрос в бд говорите где id = имя и фамилия ?
Вы сами свой вапрос поняли? | |
|
|
|
|
|
|
|
для: Jovidon
(24.09.2013 в 09:02)
| | >и если можно - подскажите пожалуйста как составить запрос к БД, что б в $rows[from] отображались имя и фамилия(from 'users' where id=$rows[from])
>то есть вы хотите $rows[form] отображались имя и фамилия а потом запрос в бд говорите где id = имя и фамилия ?
Вы сами свой вапрос поняли?
поясню, в $rows[from] у меня отображается id пользователя, а мне нужно использовать этот id для запроса к другой таблице, где данному id соответствуют имя и фамилия пользователя.
я пробовал даже что то типа такого
$id = mysql_query("SELECT id FROM users WHERE id=' "$rows[from] " ' ",$link);
$from_id = mysql_fetch_array($id, MYSQL_NUM);
$from_id = $from_id[0];
SELECT * FROM users WHERE id=' "$from_id " ' ",$link
|
но все равно не выходит | |
|
|
|
|
|
|
|
для: Ph_mx
(24.09.2013 в 13:07)
| | То есть вы выбираете id из таблицы users гдае id = id
и еще раз выбыраете все(*) из того же таблицы users где id = id ??? | |
|
|
|
|
|
|
|
для: Jovidon
(24.09.2013 в 14:02)
| | лоханулся, простите. но даже без последнего запроса, скуль не кушает массив. ругается что синтакс еррор.
вот у меня и возникает вопрос, как избежать отправки "$rows[from]"? по сути наверняка можно составить одновременный запрос к двум таблицам, но каким же тогда должен быть цикл, чтоб выводить этот компот на одной странице циклом? | |
|
|
|
|
|
|
|
для: Ph_mx
(24.09.2013 в 14:05)
| | Покажи скрипт отправки и обработчик | |
|
|
|
|
|
|
|
для: Jovidon
(24.09.2013 в 14:08)
| | отправка в БД
if(isset($_POST['send_mess'])) {
$titles = $_POST['titles'];
$titles = preg_replace("/</","<",$titles);
$titles = preg_replace("/>/",">",$titles);
$titles = trim($titles); #убираем пробелы по краям, если они есть
if(empty($titles)) echo "clean"; #если пустая, выводим Пусто!
else { #не пустая
}
$messagez = $_POST['messagez'];
$messagez = preg_replace("/</","<",$messagez);
$messagez = preg_replace("/>/",">",$messagez);
$messagez = nl2br($messagez);
$messages = $messagez;
if(empty($messages)) echo "clean"; #если пустая, выводим Пусто!
else { #не пустая
}
$ida= uniqid('message');
$ida2= uniqid('$ida');
$nr= uniqid($ida);//
$date = $_POST['date'];//
if(empty($date)) echo 'Clean!'; #если пустая, выводим Пусто!
else { #не пустая
}
$user = $_POST['user'];//
$novo = $_POST['new'];
$to = $_POST['to'];
global $link;
$query = "SELECT * FROM usermessages";
$query = "INSERT INTO usermessages (`nomer`, `to`, `from`, `date`, `title`, `message`, `new`) VALUES ('$nr', '$to', '$user', '$date', '$titles', '$messages', '$novo')";
$result=mysql_query($query, $link) or die(" Error returned if any: ".mysql_error());
}
?>
<table><form action="message.php" method="post">
<input type="hidden" name="new" value="yes">
<input type="hidden" name="user" value="<?php print $user_id ;?>">
<input type="hidden" name="date" value="<?php echo $date=date('j.m.Y'); ?>">
<tr><td>кому :</td><td><select data-placeholder="Кому..." class="chosen-select" multiple style="width:300px;" tabindex="4" name="to[]">
<?php
global $link;
$query = "SELECT id, name, surname FROM `users`
WHERE `id` IN (SELECT IF(`user_invited` = $user_id, `user_inviter`, `user_invited`)FROM `users_status` WHERE (`user_inviter` = $user_id OR `user_invited` = $user_id) AND `stat_val_id` = 2)";
$result=mysql_query($query, $link) or die(" Error returned if any: ".mysql_error());
while ($myrow = mysql_fetch_array($result)){
echo "<option value='".$myrow['id']."'> ".$myrow['name']." ".$myrow['surname']." </option>";
}
?>
</select> </td></tr>
<tr><td>заголовок :</td>
<td><input type="text" name="titles" class="input" value="Без темы <?php @print $titles; ?>"></td><tr>
<tr><td><label for="messagez">тема :</label></td>
<td><TEXTAREA NAME="messagez" COLS="40" ROWS="8" class="textinput">
</TEXTAREA></td></tr>
<tr><td></td><td><input type="submit" name="send_mess" class="btm" value="<?php echo $lang_write;?>" ></td></tr>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
<script src="js/chosen.jquery.js" type="text/javascript"></script>
<script src="docsupport/prism.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
var config = {
'.chosen-select' : {},
'.chosen-select-deselect' : {allow_single_deselect:true},
'.chosen-select-no-single' : {disable_search_threshold:10},
'.chosen-select-no-results': {no_results_text:'Oops, nothing found!'},
'.chosen-select-width' : {width:"95%"}
}
for (var selector in config) {
$(selector).chosen(config[selector]);
}
</script></form></table>
|
код, который выводит все входящие
<?php
global $link;
for($i=0; $i<count($to); $i++){
$query = "SELECT *
FROM usermessages
WHERE `to` = " . $to[$i] . "
ORDER BY id
DESC";
}
$result = mysql_query($query, $link);
echo "<table border=\"0\">";
echo "<tr><td width=\"70\"> от </td><td width=\"100\">дата</td><td width=\"200\">$lang_title
</td><td width=\"100\"></td></tr>";
while ($rows = mysql_fetch_array($result))
{
$new = "$rows[new]";
if($new=='yes')
{
echo "<tr bgcolor=\"#cccccc\"><td><b><a href=\"member.php?id=$rows[from]\">$rows[from]</a></b></td><td><b>$rows[date]</b></td><td><b><a href=\"viewmessage.php?id=$rows[nomer]\">$rows[title]</a></b></td> <td></td></tr>";
}
else
{
echo "<tr><td><a href=\"member.php?id=$rows[from]\">$rows[from]</a></td><td>$rows[date]</td><td><a href=\"viewmessage.php?id=$rows[nomer]\">$rows[title]</a></td><td></td></tr>";
}
}
echo "</table>";
?>
|
| |
|
|
|
|
|
|
|
для: Ph_mx
(24.09.2013 в 14:20)
| | Когда вам сказал выводите в цикле имел виду вот так!
<?
for($i=0; $i<count($to); $i++)
{
$query = "SELECT *
FROM usermessages
WHERE `to` = " . $to[$i] . "
ORDER BY id
DESC";
$result = mysql_query($query) or die("Ощибка при выборке из таблыцы usermessages" . mysql_error());
if(mysql_num_rows($result) > 0)
{
while($rows = mysql_fetch_array($result))
{
if($rows['new'] == 'yes') // выводите что то;
else // выводите что то;
}
}
else echo 'Данный ползователь не оставил никаких сообщение.';
}
|
| |
|
|
|
|
|
|
|
для: Jovidon
(24.09.2013 в 14:50)
| | Вот так как раз и не стоит ) | |
|
|
|
|
|
|
|
для: confirm
(24.09.2013 в 15:05)
| | а как лучше тогда? | |
|
|
|
|
|
|
|
для: Ph_mx
(24.09.2013 в 15:30)
| | Одним запросом к базе. Если у вас есть входной массив значений ID, то нужно его представить строкой для конструкции IN:
<?
//к примеру на входе имеем POST массив $_POST['id'], который содержит id записей
//обработаем значения этого массива для безопасного запроса
//и сформируем из него строку для IN()
$ids = implode(',', array_map('intval', $_POST['id']));
//и выбираем все записи принадлежащие этим id
$query = "SELECT * FROM table WHERE id IN(". $ids . ")
ORDER BY id DESC";
//то же самое можно делать и для строковых значений
//например, если поля to вашей таблицы, это строки
//то нужно лишь изменить обработку этих значений
//и обрамить их в кавычки
$to = '"'. implode('","', array_map('mysql_real_escape_string', $_POST['to'])) . '"';
$query = "SELECT *
FROM usermessages
WHERE `to` IN(" . $to . ")
ORDER BY id DESC";
//а далее поучаем и выводим записи
if($query && mysql_num_rows($query)) {
while($row = mysql_fetch_assoc($query)) {
//вывод значений
}
}
|
| |
|
|
|
|
|
|
|
для: confirm
(24.09.2013 в 15:05)
| | Почему??? | |
|
|
|
|
|
|
|
для: Jovidon
(24.09.2013 в 15:44)
| | Потому, что терроризировать базу запросами вредно. ) | |
|
|
|
|
|
|
|
для: confirm
(24.09.2013 в 15:48)
| | а вот такой вопрос возник, если в базе вместо айдишек сидит array, т е прям так и написано, это нормально?
и все таки мне так и не понятно, как решить проблему отображения имени и фамилии юзеров? неужели только добавлением пары столбцов с именами и фамилиями? ведь если они уже есть в другой таблице, почему бы не вытащить их от туда, а не дублировать? | |
|
|
|
|
|
|
|
для: Ph_mx
(24.09.2013 в 16:00)
| | Это каким образом в базе "сидит" array?
Что означает "проблема отображения имени и фамилии юзеров"?
Если они есть в другой таблице, то эти данные можно связать с таблицей, из которой происходит выборка, по id юзеров, и сделав в этом запросе объединение с таблицей их имен и фамилий, получите все необходимое. | |
|
|
|
|
|
|
|
для: confirm
(24.09.2013 в 16:09)
| | ну там так и написано array)) вот подскажите пожалуйста, как мне этот запрос составить, прям как для чайника. и, общею, если все заработает - отстану от всех и буду благодарен по гроб жизни)))
парой сообщений выше я скинул исходники. там, например, во входящих сообщениях в поле от кого, пишется $rows[from] который является просто id пользователя, мне нужно использовать этот id для запроса по поводу имени и фамилии к БД users. проблема в том, что чтобы я не пытался делать результата никакого. я так понимаю, что проблема из-за того, что сообщения выводятся циклом | |
|
|
|
|
|
|
|
для: Ph_mx
(24.09.2013 в 16:18)
| | Где это так написано, в инструкции по пользованию чайником? Не может поле таблицы содержать array, нет в mysql такого типа данных. Массив в поле можно содержать только в виде сериализованном или JSON, что и то, и другое является строкой.
Чего вам надо - получая сообщения пользователей из одной таблицы, получить и имена их авторов из другой таблицы? Ну я же написал как.
Пусть у вас есть две таблицы: mss - сообщения, и usr - пользователи. Для примера вот их дампы:
--
-- Структура таблицы `mss`
--
CREATE TABLE IF NOT EXISTS `mss` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`msg` varchar(500) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=8 ;
--
-- Дамп данных таблицы `mss`
--
INSERT INTO `mss` (`id`, `uid`, `msg`) VALUES
(1, 10, 'Привет!'),
(2, 11, 'Привет!'),
(3, 10, 'Как живешь?'),
(7, 11, 'Хреново.');
--
-- Структура таблицы `usr`
--
CREATE TABLE IF NOT EXISTS `usr` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(40) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=12 ;
--
-- Дамп данных таблицы `usr`
--
INSERT INTO `usr` (`uid`, `name`) VALUES
(10, 'Колян'),
(11, 'Вован');
|
Импортируйте их. А далее как и говорилось - нужно сделать в запросе вложенный запрос для получения имен пользователей:
<?
$q = mysql_query("SELECT *, (SELECT name FROM usr WHERE uid=mss.uid) name FROM mss ORDER BY id") or die (mysql_error());
if(mysql_num_rows($q)) {
while($r = mysql_fetch_assoc($q)) echo '<p>'.$r['msg'].' '.$r['name'].'</p>';
}
|
Выполните этот запрос. Что получаете? | |
|
|
|
|
|
|
|
для: confirm
(24.09.2013 в 16:55)
| | ну вот подписал под себя и выдает ошибку
$query = "SELECT *, (SELECT name, surname FROM users WHERE id=usermessages.id) name, surname FROM usermessages where `to`='$user_id' order by id desc";
$result = mysql_query($query, $link);
echo "<table border=\"0\">";
echo "<tr><td width=\"70\"> от </td><td width=\"100\">дата</td><td width=\"200\">$lang_title
</td><td width=\"100\"></td></tr>";
while ($rows = mysql_fetch_assoc($result))
{
$new = "$rows[new]";
if($new=='yes')
{
echo "<tr bgcolor=\"#cccccc\"><td><b><a href=\"member.php?id=$rows[from]\">$rows[name] $rows[name]</a></b></td><td><b>$rows[date]</b></td><td><b><a href=\"viewmessage.php?id=$rows[nomer]\">$rows[title]</a></b></td> <td></td></tr>";
}
else
{
echo "<tr><td><a href=\"member.php?id=$rows[from]\">$rows[from]</a></td><td>$rows[date]</td><td><a href=\"viewmessage.php?id=$rows[nomer]\">$rows[title]</a></td><td></td></tr>";
}
}
echo "</table>";
|
| |
|
|
|
|
|
|
|
для: Ph_mx
(26.09.2013 в 00:07)
| | Ну еще бы не выдавало. Я бы мог написать так:
(SELECT name FROM usr WHERE uid=mss.uid) AS name
|
где выражение AS предписывает вернуть результат в массиве под ключом 'name', в противном случае это значение будет иметь имя ключа равное строке запроса. Просто выражение AS можно опускать.
Что у вас? У вас возвращается два значения, которым вы хотите сопоставить одному имени ключа (а этого быть не может), надеясь, что mysql второму значению присвоит имя ключа 'surname'. И зря, этого не произойдет, mysql будет искать поле surname в таблице основного запроса.
Вам нужно объединить значения вложенного запроса в одно (CONCAT или CONCAT_WS):
"SELECT *, (SELECT CONCAT_WS(' ', name, surname) FROM users WHERE id=usermessages.id) name FROM usermessages WHERE `to`=$user_id ORDER BY id DESC"
|
Если $user_id это цифра, то обрамлять ее в кавычки не надо, но обязательно обработать перед вставкой в запрос. | |
|
|
|
|
|
|
|
для: confirm
(26.09.2013 в 01:00)
| | намного понятнее стало, исправил usermessages.id на usermessages.from - только вот все равно не выводит и не понятно почему кавычки пустые (' ', и точно ли в отобразится в $row[name]? | |
|
|
|
|
|
|
|
для: Ph_mx
(26.09.2013 в 02:29)
| | Да уж, видно как вам понятно. И зачем заменили? usermessages.from будет означит следующее - найти в таблице "usermessages" поле "from". Слово FROM является зарезервированным словом, а так как по этому вопросу много рассказывать, а вы простых вещей не понимаете, то скажу кратко - не используйте такие слова. Тем более что у вас разве есть поле такое?
Если вы точно представили данные таблиц, и именно так нужно выборку сделать, то все должно работать. Если нет, значит ваши исходные данные не верны. | |
|
|
|
|
|
|
|
для: confirm
(26.09.2013 в 06:07)
| | ну именно в поле from у меня хрянятся id отправителей, которые соответствуют id в таблице users, именно $row[from] отображает цифру id, и именно вместо $row[from] оочень хочу видеть имя с фамилией, а не цифру
ведь usermessages.id никак не соответствует users.id | |
|
|
|
|
|
|
|
для: Ph_mx
(26.09.2013 в 09:05)
| | Значит так, я вам написал о зарезервированных словах. Такие слова в запросах нужно обрамлять так, как это вы делаете и с полем to
Учтите, что не со всеми зарезервированными словами прокатит. Так что, если вы не знаете или не понимаете много, то переименуйте это поле, благо в английском языке слов достаточно для выражения "эмоций".
Приведите здесь структуры обеих этих таблиц из которых вы получаете данные. Объясните словами что вам надо получить и по какому условию, ибо перечитывать и вникать в посты выше мне сейчас некогда. | |
|
|
|
|
|
|
|
для: confirm
(26.09.2013 в 10:08)
| | спасибо большое)! все работает. есть только одно НО, два значения заносятся в одну переменную, и получается, что отображаются они слитно | |
|
|
|
|
|
|
|
для: Ph_mx
(26.09.2013 в 16:55)
| | Вы думаете я обязан догадаться о каких своих значениях и переменной вы говорите? ) | |
|
|
|
|
|
|
|
для: confirm
(26.09.2013 в 18:30)
| | и name и surname, из таблицы users "слипаются" в $rows[name] | |
|
|
|
|
|
|
|
для: Ph_mx
(26.09.2013 в 19:58)
| | А вы выше внимательно читали? Я же вам объяснял, что вы написали ахинею, думая что mysql вам автоматом поименует ключи как вы задумали, и как выход написал что сделать - ОБЪЕДИНИТЬ одной из двух функций, что и делается в запросе
"SELECT *, (SELECT CONCAT_WS(' ', name, surname) FROM users WHERE id=usermessages.id) name FROM usermessages WHERE `to`=$user_id ORDER BY id DESC"
Поэтому и объединяется. Эти два значения name и surname принадлежать разным пользователям что ли, почему они раздельно должны быть?
Открывайте учебники и изучать! | |
|
|
|
|
|
|
|
для: confirm
(26.09.2013 в 20:21)
| | мне всего лишь нужно запустить между ними пробел
а учебники читал, как раз софттаймовские | |
|
|
|
|
|
|
|
для: Ph_mx
(26.09.2013 в 23:28)
| | CONCAT_WS(' ', name, surname) и соединяет через пробел (первый аргумент функции).
Этот же эффект будет, если применить CONCAT, в этом случае должно быть так:
CONCAT(name, ' ', surname)
|
| |
|
|
|
|
|
|
|
для: confirm
(27.09.2013 в 00:06)
| | ну слава богу! все заработало! спасибо нечеловечески огромное | |
|
|
|
|
|
|
|
для: confirm
(24.09.2013 в 15:48)
| | я подумал - шут с нем, с этим многопользовательским чатом. снесу плагин, поставлю другой. мне б только имена и фамилии отобразить)) | |
|
|
|
|