Объединение двух SQL запросов

Статус
Закрыто для дальнейших ответов.

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Таблица:

id (int) - id письма
poluchatel -хранится id отправителя
otpravitel - хранится логин того, кто отправил.
id poluchatel otpravitel
1 | 20 | Vasya
2 | 30 | Borya
3 | 20 | Vasya
4 | 100 | Sasha
5 | 50 | Vasya
6 | 30 | Borya
7 | 20 | Vasya
Ну вот так, например мне нужно вывести переписку у Бори и Васи, причем двусторонюю, т.е и отправленные письма и пришедшие.
id Бори = 20, id Васи = 30, получается Вася Боре отправил 3 письма, А боря Васе 2 письма... т.е вывести мне нужно 5 писем, их переписку, остальные письма которые они писали на другие id убрать.
По отдельности то я могу вывести их, вот так:

Код:
$sql = "SELECT * FROM `tablica` WHERE `poluchatel` = '20' AND `otpravitel` = 'Vasya'";
$sql2 = "SELECT * FROM `tablica` WHERE `poluchatel` = '30' AND `otpravitel`= 'Borya'";
Тут запрос мне выведит сперва письма, которые отправил Боря Васе, а потом наоборот. Тогда сбивается последовательность...
Мне надо что бы они шли в том порядке, что у них идет id, ну вобщем нужно сделать историю переписки..
Подробно:
Выведет вот такую последовательность при двух запросах (см. по id писем)

А надо вот так:

 

medwoodu

Злобный модер
Регистрация
22.12.2005
Сообщения
1 418
ну тег UNION никто не отменял, я бы правда сделал таблицу по-другому:

Код:
users
------
id int prem
user string(255)
Код:
message
--------
id int prem
from_user_id int
to_user_id int
create_at timestamp
text text
is_read bool
тогда делается запрос:

Код:
SELECT * FROM message WHERE (from_user_id = 1 AND to_user_id = 2) OR (from_user_id = 2 AND to_user_id = 1) ORDER BY from_user_id ASC, create_at DESC
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Такой вопрос:
А будет ли верен такой запрос в SQL?
Код:
$_res = mysql_real_escape_string($_GET['id']);
$_res = mysql_query("SELECT * FROM `userstable` WHERE `id` = '$_res' ");
Или нужно всегда делать вот так:
Код:
$_res = mysql_query("SELECT * FROM `userstable` WHERE `id` = '".mysql_real_escape_string($_GET['id'])" ' ");
Или вот так:
Код:
$_res = mysql_real_escape_string(trim($_GET['id']));
$_res = mysql_query("SELECT * FROM `userstable` WHERE `id` = '$_res' ");
Что бы обезопасить запрос от SQL инъекции?
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Тут проще, у вас же id типа int. Зачем ескейпить в нем символы, убирать пробелы, если их вообще там не должно быть?
Код:
if(is_numeric($_GET['id'])){
  $res = mysql_query("SELECT * FROM `userstable` WHERE `id` = ".$_GET['id'] );
} else {
  echo 'Epic fail';
}
Но если бы у вас был текст, в поле id, то оба варианты безопасны, я бы даже сказал аналогичны.
Может быть вы не до конца понимаете суть того что пишете? trim всего лишь убирает пробелы, он не влияет на безопасность, а предусматривает ошибки пользователей, когда они случайно ставят пробелы в конце и вначале строки.
mysql_real_escape_string - экранирует спец символы.
Если убрать из внимания trim(), вы сейчас задали такой вопрос:

А какой вариант лучше? Этот:
Код:
$t = $a * $b;
$c = $d * $t;
или этот
Код:
$c = $d * $a * $b;
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Тут проще, у вас же id типа int. Зачем ескейпить в нем символы, убирать пробелы, если их вообще там не должно быть?
Код:
if(is_numeric($_GET['id'])){
  $res = mysql_query("SELECT * FROM `userstable` WHERE `id` = ".$_GET['id'] );
} else {
  echo 'Epic fail';
}
Но если бы у вас был текст, в поле id, то оба варианты безопасны, я бы даже сказал аналогичны.
Может быть вы не до конца понимаете суть того что пишете? trim всего лишь убирает пробелы, он не влияет на безопасность, а предусматривает ошибки пользователей, когда они случайно ставят пробелы в конце и вначале строки.
mysql_real_escape_string - экранирует спец символы.
Если убрать из внимания trim(), вы сейчас задали такой вопрос:

А какой вариант лучше? Этот:
Код:
$t = $a * $b;
$c = $d * $t;
или этот
Код:
$c = $d * $a * $b;
Спасибо! А не подскажите, можно ли в массив вставить функцию?
Например вот массив:
Код:
$_massiv= Array('<a href="1.php">Ссылка 1</a>','<a href="1.php">Ссылка 2</a>','<a href="1.php">Ссылка 3</a>');
echo $_massiv[0]; // Выведит ссылку 1 и адрес её будет такой: http://localhost/1.php
А нужно что бы вывело вот такой адрес: http://localhost/1.php?r=число
делается это вот так:
Код:
echo '<a href="1.php?r='.rand(100,10000).'">Ссылка 1</a>';
Как то в массиве можно сделать такую ссылку и потом выводить её? А то каждый раз приходится прописывать этот rand для каждой ссылки и httaches нету((
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Код:
$links = array();
for($i=1; $i<15; $i++){
  $links[] = '<a href="'.$i.'.php?r='.rand(100,1000).'" title="Ссылка '.$i.'">Ссылка '.$i.'</a>';
}
echo $links[rand(1,14)];
Если я правильно понял что надо.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Код:
$links = array();
for($i=1; $i<15; $i++){
  $links[] = '<a href="'.$i.'.php?r='.rand(100,1000).'" title="Ссылка '.$i.'">Ссылка '.$i.'</a>';
}
echo $links[rand(1,14)];
Если я правильно понял что надо.
Всё так, почти... Лишь ссылка своё имя не должна менять и не должна меня адрес) Изменяться должно только окончание, вот это: r=190 (на любой число)
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Ну я подсказал решение, а дальше сами, задачка то простейшая ;)
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Ну я подсказал решение, а дальше сами, задачка то простейшая ;)
Не простейшая) Наверное я не правильно сформулировал, вот много ссылок:
Код:
$_k1 = '<a href="enter.php?r='.rand(100,100000).'">Ссылка 1</a>';
$_k2 = '<a href="1.php?r='.rand(100,100000).'">Ссылка 2</a>';
$_k3 = '<a href="1.php?r='.rand(100,100000).'">Ссылка 3</a>';
$_k4 = '<a href="1.php?r='.rand(100,100000).'">ССылка 4</a>';
........
$_k50 = '<a href="1.php?r='.rand(100,100000).'">Ссылка 50</a>';
И вот что бы их все разом вывести мне приходится писать вот так:
Код:
echo $_k1.$_k2.$_k3.$_k4. (......) $_k50;
Обращаю внимание на то, что у всех ссылок будет разное число у переменной r.
Вот можно как то их все объединить в один массив и вывести все?
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
В примере выше я давал пример как избавиться от повторения одинаково кода, и сформировать массива ссылок.
Еще могу посоветовать функцию implode, она позволяет объединить все элементы массива в строку, используя разделитель, например запятую.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
В примере выше я давал пример как избавиться от повторения одинаково кода, и сформировать массива ссылок.
Еще могу посоветовать функцию implode, она позволяет объединить все элементы массива в строку, используя разделитель, например запятую.
А метод POST (не get) нужно обрабатывать функцией mysql_real_escape_string? В смысле через него могут сделать как то инъекцию?
Например чел вводит в формы что-то и отправляется, у меня обрабатываются данные и записываются в бд...
Обрабатываются обычно функциями у меня trim и strip_tags...
Может ченть посоветуете?
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Метод POST и GET только внешне различны, на деле внутри они одно и тоже, так что проверять и обезопасить надо все данные которые приходят от пользователя.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Метод POST и GET только внешне различны, на деле внутри они одно и тоже, так что проверять и обезопасить надо все данные которые приходят от пользователя.
Спасибо)))
А не знаешь как установить лимит? Например отправка не больше 10 писем в минуту?
Форму и т.д это ничего не надо... Принцип создания этого...
И ещё... Например в таблице есть СТРОКА в ней есть последний столбец с названием "oops", в нем содержится только число... Можно как то запросом его увеличивать на 1? Например запрос сделали, было число 10, стало 11, потом ещё запрос сделали и получилось 12... Т.е что бы не строка создавалась новая а изменялось число в строке...
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Не тема получается, а целый урок :laugh: Надеюсь модераторы не против :happy:
Что бы обновить какое-то поле в базе надо использоваться запрос:
UPDATE `table` SET `field` = 'new data' WHERE id = 5
Где `table` это таблица в которой обновляем, field - поле которое обновляем, 'new_data' - значение которое устанавливаем. Можно например написать fields = fields + 1
Where пункт необязательный, но если его не указать, то поле field изменится для всех строк в таблице, поэтому нужно уточнять, у каких строк менять значение. В принципе он очень похож на SELECT в этом плане.

Для лимита писем не существует готового инструмента на пхп.
Смотрит как решать такую задачу.
Что бы ограничить как-то отправку мы должны вести счетчик это вполне естественно, ведь в реальном мире например когда ты хочешь дать кому-то 10 яблок, ты держишь в голове сколько ты ему уже дал. Тут мы тоже будет хранить где-то счетчик.
Но у нас не один посетитель, а много. Можно хранить значение в базе, в отдельной таблице, или в кукисах пользователя(если конечно отправка писем разрешена всем, а не только зарегистрированным пользователям).
И как мы будем идентифицировать пользователя? По кукисам, как и хранить значение отправленных писем - это не вариант - почистить кукисы очень просто.
Значит остается по IP адресу.
Вот у нас уже есть решение, мы храним данные об отправленных письмах в таблице, и у нас уже есть два поля ИП адрес, и счетчик отправленных писем.
Но мы же не можем разрешить отправить только 10 писем за всю жизнь с одного сайта? Какой-нибудь злоумышленник исчерпает все попытки, а потом простой пользователь не сможет отправить.
Значит нам нужно хранить время. Это третье поле в таблице.
Думаю больше значений нам не надо, пригодится - добавим.
Теперь сам скрипт.
Мы получили запрос на отправку письма. Сразу ищем ИП адрес отправителя в таблице. Если находим, его то смотрим число отправленных писем и дату. Если дата последней отправки больше 30 минут, то ставим в базе значение счетчика в ноль.
Отправляем письмо, и обновляем значение счетчика в базе для этого ИП адреса на +1.
Все задачи примерно таким образом надо анализировать и решать.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Угу..Я тебе уже наверное надоел со своими вопросами :eek:hmy:
Так просто.. :huh: просто плюсик поставить и будет само прибавлять, я и не догадывался что всё так автоматизировано в базах) Все бы так объясняли)) хх
Сразу возникает вопрос: А ведь злоумышленник наверное не дурак и может зайти через другой клиент, который меняет ip или использовать проксю.. Например даже с мобилы: Сперва с стандартного браузера а затем на оперу переходишь и ip меняется)
А что если вот так сделать?
Заносим в таблицу id отправителя (т.к он зареген и до этого выполнил вход), дату и счетчик отправленных... А при написании письма пользователем, сравниваем счетчик с временем и если прошло достаточно времени, то отправляем, иначе отказываем) Так можно?
И ещё... последний наверное вопросик и отстану, я давно сайты делаю, на заказ частенько делаю (по большей степени дизайн или добработка), и есть свой, но он на бесплатном хостинге. И хочу приобрести себе сайт в зоне.ру... но не знаю с чего начать:( Мануалов в инете много, но в них написано одно и тоже: Что бы создать сайт надо найти бесплатный хостинг или создать у ся на компе...
Не подскажешь что надо делать что бы его приобрести и потом когда он будет, то что делать, что бы он заработал? :rolleyes:
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Ну про отправку ты уловил правильно мысль, я предлагал ИР адрес пользователя использовать как идентификатор пользователя, если у тебя пользователь обязательно зарегистрирован, то идентифицировать ты можешь их по многим полям, как ИД пользователя, его логин, почта, итд итп, хотя конечно ИД пользователя самое логичное.
А просто отправку с других браузеров, прокси - тут уже ничем не защитится.
По поводу домена, я бы предложил тебе взять любой хостинг где в подарок идет доменное имя, зарегистрируешь аккаунт, оплатишь его, а всю работу по офрмлению домена за тебя сделает хостинг, я про рекламирую тот которым пользуюсь, но в принципе в интернете много других хостингов с такой же услугой. За полгода рублей 700 за хостинг, а домен у тебя на год. Я думаю нормально, тем более искать бесплатный хостинг с пхп, потом на него прикручить домен... проще заплатить лишнее 300-400р и не беспокоится.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Ну про отправку ты уловил правильно мысль, я предлагал ИР адрес пользователя использовать как идентификатор пользователя, если у тебя пользователь обязательно зарегистрирован, то идентифицировать ты можешь их по многим полям, как ИД пользователя, его логин, почта, итд итп, хотя конечно ИД пользователя самое логичное.
А просто отправку с других браузеров, прокси - тут уже ничем не защитится.
По поводу домена, я бы предложил тебе взять любой хостинг где в подарок идет доменное имя, зарегистрируешь аккаунт, оплатишь его, а всю работу по офрмлению домена за тебя сделает хостинг, я про рекламирую тот которым пользуюсь, но в принципе в интернете много других хостингов с такой же услугой. За полгода рублей 700 за хостинг, а домен у тебя на год. Я думаю нормально, тем более искать бесплатный хостинг с пхп, потом на него прикручить домен... проще заплатить лишнее 300-400р и не беспокоится.
Это понятно... Есть такой сайт: http://www.reg.ru/
Так вот, там есть
Хостинг и почта
и
Виртуальные сервервы VPS/VDS
Чем они отличаются друг от друга?
В обоих случаях дают место под сайт и т.д...
:wacko:
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Лучше всего в случае сомнений, это гуглить :laugh: Вопросы люди задают одинаковые много раз, и в интернете уже куча одинаковых ответов. Лучше всего по гуглить "Что такое VDS" "Что такое хостинг" - на википедии все замечательно написано :happy:
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Лучше всего в случае сомнений, это гуглить :laugh: Вопросы люди задают одинаковые много раз, и в интернете уже куча одинаковых ответов. Лучше всего по гуглить "Что такое VDS" "Что такое хостинг" - на википедии все замечательно написано :happy:
Спасибо! Почитал и в принципе понял чем они отличаются...
Но вот Вы бы какой бы мне посоветовали? Выделенный сервер (VDS) или обычный платный хостинг? Сайт много места не занимает (где то 20мб пока, 1 бд), плюс там должна быть поддержка отправки писем с сайта на эмаил (некоторые хостинг-компаниии эту возможность блокируют)... И посещаемость вобщем пока низкая...
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Однозначно обычный хостинг, vds вам вряд ли понадобится в ближайший год а то и более)
 
Статус
Закрыто для дальнейших ответов.
Верх Низ