Вернуться   Дизайнерский форум » ВЕБ-ПРОГРАММИРОВАНИЕ » ASP, Perl, PHP и MySQL

Как правильно написать запрос на MySQL?

Обсуждение темы Как правильно написать запрос на MySQL? в разделе ASP, Perl, PHP и MySQL, часть категории ВЕБ-ПРОГРАММИРОВАНИЕ; Это первая попытка, посмотрите пож.все ли правильно я делаю, а то что то страшновато ... Код: $Q1 = mysql_query("SELECT ip, data_vx, COUNT(ID) AS ...


Закрытая тема
 
Опции темы
Старый 23.02.2010, 13:10   #1
Это первая попытка, посмотрите пож.все ли правильно я делаю, а то что то страшновато ...

Код:
$Q1 = mysql_query("SELECT ip, data_vx, COUNT(ID) AS 'Options' FROM inform WHERE (ip=$ip) AND (data_vx=$data_vx)");

if(mysql_num_rows($Q1) >0) {$r = mysql_fetch_array($Q1) }
if ($r['Options']>100) echo 'вы превысили лимит ввода данных на сегодня, приходите к нам завтра';
так правильно или нет?
 
Старый 23.02.2010, 13:10
Ссылки
Старый 23.02.2010, 21:37   #2
Ну работать то должно, но масло масленное у вас получилось.
1. COUNT(ID) - вообщето агрегативные функции сами по себе смысла несут мало. Их холосо использовать с GROUP BY. например так.

SELECT ip, data_vx, COUNT(ID) AS 'Options' FROM inform GROUP BY ip, data_vx

кстати, быстрее отработает так:

SELECT ip, data_vx, COUNT(*) AS 'Options' FROM inform GROUP BY ip, data_vx

Это вам выдаст таблицу, где для каждого ip, data_vx будет количество операций.
Ваше же выражение выдаст лишь одну строку в любом случае, и было бы не рабочим, если бы вы не поставили WHERE.
Но вам же нужна не вся таблица, а только ряд её. и COUNT вам в целом то не нужен.

Нужно делать так:
PHP код:
$Q1 mysql_query("SELECT ID FROM inform WHERE ip = $ip AND data_vx = $data_vx")

if(
mysql_num_rows($Q1) > 100) echo 'вы превысили лимит ввода данных на сегодня, приходите к нам завтра'
 
Старый 23.02.2010, 23:11   #3
Цитата:
Сообщение от Асмодиан Посмотреть сообщение
Ну работать то должно, но масло масленное у вас получилось.
Это вам выдаст таблицу, где для каждого ip, data_vx будет количество операций.
$Q1 = mysql_query("SELECT ID FROM inform WHERE ip = $ip AND data_vx = $data_vx")
Позвольте с вами не согласиться, мне как раз и нужна одна строка с общим количеством записей за один день и по одному (конкретному айпи адресу), а вот у вас при группировке получаеся энное количество уникальных записей , которые мне совершенно без пользы. Или к вашему запросу нужно еще ставить фильтр на конкретный день и айпишник или как то по другому нужно организвать запрос, к сожалению ваш пример не приводит к нужному результату, может быть вы попытаетесь еще раз ... но в любом случае спасибо , что попытались помочь.
 
Старый 23.02.2010, 23:13   #4
vt-aas, ну сначала до конца-то прочитайте, чтоб судить.

Цитата:
Сообщение от Асмодиан Посмотреть сообщение
Но вам же нужна не вся таблица, а только ряд её.
 
Старый 23.02.2010, 23:24   #5
Цитата:
Сообщение от Асмодиан Посмотреть сообщение
vt-aas, ну сначала до конца-то прочитайте, чтоб судить.
прочитал еще раз, у вас в примере выйдет только одна строка, первая скорее всего, где будет совпадать данное условие, но и все, а мне нужно получить количество строк , удовлетворяющее данному условию, разве не так?
 
Старый 23.02.2010, 23:43   #6
Учимся читать SQL по русски:
SELECT ID FROM inform WHERE ip = $ip AND data_vx = $data_vx
Выбрать все записи из таблицы inform, у которых ip и data_vx соответствует заданным значениям (ну $ip и $data_vx). Все соответствующие записи.
И после этого функция mysql_num_rows($Q1) нам вернёт количество таких вот записей.
Да, кстати: $ip как я понимаю строка. А сторки в такм виде указывать нельзя.
Нужно
SELECT ID FROM inform WHERE ip = '$ip' AND data_vx = '$data_vx'
заключать их в кавычки. Без кавычек можно оставлять только числа. Но и их можно заклюить в кавычки - хуже не будет. И так на всякий случай неплохо предварительно проэскейпить:
$ip = mysql_escape_string($ip);
$data_vx = mysql_escape_string($data_vx);

Добавлено через 2 минуты

И на закусочку: метод взлома и порчи сайтов, проводимый за счёт отсутствия кавычек в SQL - строках или отсутствия эскейпов называется SQL-инъекцией

Последний раз редактировалось Асмодиан; 23.02.2010 в 23:43.. Причина: Добавлено сообщение
 
Старый 23.02.2010, 23:53   #7
Цитата:
Сообщение от Асмодиан Посмотреть сообщение
Учимся читать SQL по русски:

Да, кстати: $ip как я понимаю строка. А сторки в такм виде указывать нельзя.
Нужно
SELECT ID FROM inform WHERE ip = '$ip' AND data_vx = '$data_vx'
заключать их в кавычки. Без кавычек можно оставлять только числа. Но и их можно заклюить в кавычки - хуже не будет. И так на всякий случай неплохо предварительно проэскейпить:
$ip = mysql_escape_string($ip);
$data_vx = mysql_escape_string($data_vx);
спасибо за терпение, но все равно не понятно зачем нужны кавычки '$ip', $ip - это переменная, а в кавычках она из переменной превращается в строку, а я же сравниваю со значением в этой переменной, а не со строкой. И потом по запросу, вы правы , я получу не первую строку , а несколько строк, тогда мне придется ставить еще цикл по всем полученным строкам и считать количесство этих строк. Поэтому более оптимально в данном случае использовать COUNT - функцию подсчета записей в самом запросе и не устанавливать дополнительный цикл, не могли бы вы написать в общем, а то я слишком много отнимаю времени наверно.
 
Старый 24.02.2010, 13:15   #8
vt-aas, эээээххх... умение слушать - это тоже искусство.
Учимся читать php по русски:
mysql_num_rows - вернуть количество строк, выбранных в запросе.
Понимете или нет? Простите, уважаемый, но серьёзно прошу лишь послушать программиста, имеющего опыт работы с БД уже более 7 лет.
То есть понимаете, что делает мой пример:
1. Выбирает все записи для заданного ip и заданного data_vx.
А потом функция mysql_num_row возвращает количество таких запией. Разве вам не это нужно? И правда проще нежели делать масло маслянное?

А насчёт ip - давайте объясню.

$ip = "192.168.0.1"
$data_vx = "lalala"

SELECT ID FROM inform WHERE ip = $ip AND data_vx = $data_vx

после подстановки значений, и перед тем как строка попадят в SQL, она будет преобразованна так:
SELECT ID FROM inform WHERE ip = 192.168.0.1 AND data_vx = lalala
как вы думаете, это корректный синтаксис?
В любом языке программирования, любые строковые константы должны быть заключены в кавычки (одинарные или двойные, в зависимости от требований языка)
А в той строке, которая отправиться в SQL этих кавычек нет.
на этой строке всё у вас упадёт.

PS. Очень сложно с вами. Ведь и советы даю дельные, и разжовываю всё по пальцам, а вы только возражаете, хотя знаний SQL да и PHP у вас явно недостаточно.
 
Этот пользователь сказал спасибо Асмодиан за это полезное сообщение:
Вертер (24.02.2010)
Старый 24.02.2010, 16:42   #9
Цитата:
Сообщение от Асмодиан Посмотреть сообщение
vt-aas, эээээххх... умение слушать - это тоже искусство.


PS. Очень сложно с вами. Ведь и советы даю дельные, и разжовываю всё по пальцам, а вы только возражаете, хотя знаний SQL да и PHP у вас явно недостаточно.
Спасибо вам огромное, теперь все понятно, ну не всем же быть таким умным, очень много людей посредственных, что делать кого то природа наделила, а кому то недодала чего то, но не хочется бросать начатое на середине, вот и приходится просить помощи, а вы думаете это легко просить, нет не так то и просто, лучше уж читать до посинения литературу и не спрашивать, но если и это не помогает, тогда на форум, вот так и живем, как можем и как получается... спасибо!!!
 
Старый 24.02.2010, 23:26   #10
Не забудьте про эскейпы - очень и очень полезная привычка.
 
Старый 24.02.2010, 23:26
Закрытая тема


Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос? kostia ASP, Perl, PHP и MySQL 11 08.02.2015 14:52
запрос оценки Milestone Зал дебютантов 14 13.07.2009 17:37
Запрос на доступ Freeze Библиотека 2 20.01.2007 12:08
MySQL запрос? viTTas ASP, Perl, PHP и MySQL 2 26.09.2005 14:53
Как правильно написать Css -файл??? Green HTML, CSS, JavaScript 6 26.02.2005 17:39


Текущее время: 22:59. Часовой пояс GMT +4.

Реклама на форуме Условия размещения рекламы
Биржа ссылок Заработай на сайте!
Дизайнерский форум