Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
ComfyMobile
 Аватар для DedBoroda
89 / 89 / 8
Регистрация: 04.11.2010
Сообщений: 376

Простые запросы

04.11.2010, 11:44. Показов 2688. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
При создании программы возникла необходимость использовать БД.
Использую MySQL + php движок для работы с ней. С MySQL никогда не работал.

Функционал создаваемого php сервера весьма скуден:
1) Аутификация юзера
2) Таблица данных 3xN.
|----------------------|
|ID|аргумент|значение|
------------------------
|1.| 1.........| 1,2,3......|
------------------------
|2.| 2.........| 3...........|
------------------------
|N | arN......| qN.........|
------------------------

Поиск значения по таблице относительно аргумента, вводимого юзером. Если данный аргумент есть в таблице и ему соответствует значение, то нужно вывести это значение(если значений несколько - вывести одно, рандомно).

MySQL на компьютере установлен. Есть и phpmyadmin.
Интуитивно сделал процесс аутификации, используя комментарии phpmyadmin.

PHP
1
2
3
4
5
6
7
8
function authuser($a,$b){
    $query = "SELECT `user` FROM `users` WHERE `user`='$a' AND `pass`='$b' LIMIT 1";
    $arr = mysql_query($query) or die(mysql_error());
    if (mysql_num_rows($arr) == 1) {
        return true; }else{
            return false;
        }
}
А как вторую часть реализовать - не знаю. Для решения этой задачи не хочется читать целую книгу, посему прошу знающих людей привести пару простых примеров-запросов с выборкой данных к БД для достижения моих целей.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.11.2010, 11:44
Ответы с готовыми решениями:

простые запросы
здравствуйте! помоги, пожалуйста, найти ошибку в моем запросе: SELECT Year(Got_postuplenia)= AS , Группы.Name,...

Простые запросы
Доброго времени суток, форумчане! Не могу сделать верно следующие запросы: Название столбцов и таблиц полностью произвольные 1....

простые запросы
Определить Общау сумма продажи, за май месяц Количество различных наименование по формал производителя с помощь построителя

19
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
04.11.2010, 11:57
Цитата Сообщение от DedBoroda Посмотреть сообщение
Поиск значения по таблице относительно аргумента,
ты уже написал...
Цитата Сообщение от DedBoroda Посмотреть сообщение
WHERE `user`='$a' AND `pass`='$b' LIMIT 1";
Вопрос! что надо сделать?

Добавлено через 1 минуту
о какой второй части идет речь, и где первая???
1
ComfyMobile
 Аватар для DedBoroda
89 / 89 / 8
Регистрация: 04.11.2010
Сообщений: 376
04.11.2010, 12:06  [ТС]
о какой второй части идет речь, и где первая???
Функционал создаваемого php сервера весьма скуден:
1) Аутификация юзера
2) Таблица данных 3xN.
1 Часть. Аутификация. Я её более-менее сделал, сравнение логина и пароля по базе из двух столбцов.
2 Часть. Работа с основной базой данных, где хранятся аргументы и значения(и порядковый номер id).
0
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
04.11.2010, 12:06
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$query = "select `value` from `table_data` where `argument` = '$argument'";
 
if (($result = mysql_query($query)) && mysql_num_rows($result) > 0)
{
    $values = mysql_result($result, 0);
    if (is_int($values))
        $value = $values;
    else {
        $values = explode(',', $values);
        $value = $values[array_rand($values)];
    }
    echo "Аргумент: $value";
}
else
{
    echo 'Аргумент на найден в БД.';
}
1
ComfyMobile
 Аватар для DedBoroda
89 / 89 / 8
Регистрация: 04.11.2010
Сообщений: 376
04.11.2010, 12:28  [ТС]
если аргумент-строка кириллических символов, то в запросе аргумент становится чтото типа Р°СЂРіСѓРјРµРЅС .

Читал про такой косяк где-то, перед выбором таблицы писал:
PHP
1
2
mysql_query("SET NAMES CP1251");
mysql_query("SET COLLATION_CONNECTION=CP1251_GENERAL_CI");
но, по видимому, не помогло
0
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
04.11.2010, 12:33
Цитата Сообщение от DedBoroda Посмотреть сообщение
если аргумент-строка кириллических символов, то в запросе аргумент становится чтото типа Р°СЂРіСѓРјРµРЅС .

Читал про такой косяк где-то, перед выбором таблицы писал:
PHP
1
2
mysql_query("SET NAMES CP1251");
mysql_query("SET COLLATION_CONNECTION=CP1251_GENERAL_CI");
но, по видимому, не помогло
В этих запросах следует указывать не кодировку БД, а кодировку скрипта. Если ваши скрипты работают под utf8, то надо указывать utf8.

Добавлено через 1 минуту
И лучше вместо этих двух запросов использовать:
PHP
1
mysql_set_charset('utf8');
1
ComfyMobile
 Аватар для DedBoroda
89 / 89 / 8
Регистрация: 04.11.2010
Сообщений: 376
04.11.2010, 12:35  [ТС]
Цитата Сообщение от ostgals Посмотреть сообщение
В этих запросах следует указывать не кодировку БД, а кодировку скрипта. Если ваши скрипты работают под utf8, то надо указывать utf8.
как указать кодировку скрипта?

По поводу вашего кода выше:
как вывести значение(ия), соответствующее аргументу?
0
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
04.11.2010, 12:38
Цитата Сообщение от DedBoroda Посмотреть сообщение
как указать кодировку скрипта?
Это зависит от редактора.

Цитата Сообщение от DedBoroda Посмотреть сообщение
По поводу вашего кода выше:
как вывести значение(ия), соответствующее аргументу?
В моем фрагменте значение выводится в 12-ой строке.

А какая кодировка у БД?
1
ComfyMobile
 Аватар для DedBoroda
89 / 89 / 8
Регистрация: 04.11.2010
Сообщений: 376
04.11.2010, 12:49  [ТС]
Цитата Сообщение от ostgals Посмотреть сообщение
В моем фрагменте значение выводится в 12-ой строке.

А какая кодировка у БД?
в 12ой строке у вас выводится сам аргумент, который, собственно, и был введен для поиска. Ввел аргумент - вывел его же.

MySQL charset: UTF-8 Unicode (utf8)

Добавлено через 2 минуты
я написал как вы сказали и строки с русскими символами ищутся по таблице, я их просто не вижу в браузере при отладке(только если поменять кодировку в браузере на unicode utf-8, ну да и пофиг)

Добавлено через 4 минуты
PHP
1
$result = mysql_query($query);
Как я понял, $result - это некий массив данных, полученный в следствии запроса. Как из него извлечь значение по аргументу, и ,например, id?
0
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
04.11.2010, 13:06
Значит так...

Сделал тестовую БД:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--
-- Table structure for table `data`
--
 
CREATE TABLE IF NOT EXISTS `data` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `argument` VARCHAR(255) COLLATE utf8_unicode_ci NOT NULL,
  `value` VARCHAR(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
 
--
-- Dumping data for table `data`
--
 
INSERT INTO `data` (`id`, `argument`, `value`) VALUES
(1, 'аргумент А', '65'),
(2, 'аргумент Б', '66');
И скрипт (кодировка windows-1251 - стандартная кириллическая для Windows):
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
 
header('Content-type: text/html; charset=windows-1251');
 
mysql_connect('localhost', 'root', '');
mysql_select_db('test');
mysql_set_charset('cp1251');
 
$argument = 'аргумент А';
 
$query = "select `value` from `data` where `argument` = '$argument'";
 
if (($result = mysql_query($query)) && mysql_num_rows($result) > 0)
{
    $values = mysql_result($result, 0);
    if (is_int($values))
        $value = $values;
    else {
        $values = explode(',', $values);
        $value = $values[array_rand($values)];
    }
    echo "Аргумент: $value";
}
else
{
    echo 'Аргумент на найден в БД.';
}
Все работает как часы.

Добавлено через 6 минут
Цитата Сообщение от DedBoroda Посмотреть сообщение
Как я понял, $result - это некий массив данных, полученный в следствии запроса.
Не совсем. Строго говоря, $result - это дескриптор ресурса, через который можно вытащить данные.


Цитата Сообщение от DedBoroda Посмотреть сообщение
Как из него извлечь значение по аргументу, и ,например, id?
id можно извлечь только в том случае, если мы его запросили в select-запросе.
В нашем случае select-запрос:
PHP
1
$query = "select `value` from `data` where `argument` = '$argument'";
запрашивает только поле value.

Чтобы получить id, нужно добавить поле id в запрос:
PHP
1
$query = "select `id`, `value` from `data` where `argument` = '$argument'";
И потом извлекать данные таким образом:
PHP
1
2
3
$result = mysql_query($query);
while ($row = mysql_fetch_assoc($result))
    echo "Аргумент (id: {$row['id']}, value: {$row['value']})";
1
ComfyMobile
 Аватар для DedBoroda
89 / 89 / 8
Регистрация: 04.11.2010
Сообщений: 376
04.11.2010, 13:24  [ТС]
Русский язык отображается, если задать переменную аргумента заранее. А если вводить через url - получаются иероглифы. Планируются post запросы, так что, думаю, проблем не будет с этим.

Понял как выбирать данные в строке. А если мне нужно, например, чтобы в одной ячейке было несколько значений(массив значений, получается массив в массиве - трехмерный массив), то как вывести определенный элемент такой ячейки? и какой правильный тип данных задавать ячейке?
0
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
04.11.2010, 13:38
Цитата Сообщение от DedBoroda Посмотреть сообщение
А если мне нужно, например, чтобы в одной ячейке было несколько значений(массив значений, получается массив в массиве - трехмерный массив), то как вывести определенный элемент такой ячейки? и какой правильный тип данных задавать ячейке?
Это все зависит от конкретной задачи.

В приведенном вами примере в поле value могут храниться несколько целых чисел, разделенных запятой. Если их не слишком много и они используются только как значения (а не как идентификаторы каких-то других данных), то можно так и оставить. Тип данных в этом случае - строка переменной длины (varchar).
1
ComfyMobile
 Аватар для DedBoroda
89 / 89 / 8
Регистрация: 04.11.2010
Сообщений: 376
04.11.2010, 13:46  [ТС]
Цитата Сообщение от ostgals Посмотреть сообщение
Это все зависит от конкретной задачи.

В приведенном вами примере в поле value могут храниться несколько целых чисел, разделенных запятой. Если их не слишком много и они используются только как значения (а не как идентификаторы каких-то других данных), то можно так и оставить. Тип данных в этом случае - строка переменной длины (varchar).
В данной задаче в поле value хранится одно и более значений, скорее всего, строкового типа:
'12345'
'абвгд'
'35601'
Этих значений может быть от одного до сотни, примерно.
0
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
04.11.2010, 13:55
Цитата Сообщение от DedBoroda Посмотреть сообщение
В данной задаче в поле value хранится одно и более значений, скорее всего, строкового типа:
'12345'
'абвгд'
'35601'
Этих значений может быть от одного до сотни, примерно.
Тогда лучше значения вынести в отдельную таблицу.
1
ComfyMobile
 Аватар для DedBoroda
89 / 89 / 8
Регистрация: 04.11.2010
Сообщений: 376
04.11.2010, 13:59  [ТС]
Цитата Сообщение от ostgals Посмотреть сообщение
Тогда лучше значения вынести в отдельную таблицу.
Тогда для каждого аргумента соответствует таблица. Как такое реализовать?
Создать отдельную таблицу в 1 столбец? Если да, то как перевести указатель со строки найденного аргумента на эту таблицу?
0
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
04.11.2010, 14:02
Цитата Сообщение от DedBoroda Посмотреть сообщение
Тогда для каждого аргумента соответствует таблица. Как такое реализовать?
Не совсем так. Каждому аргументу будет соответствовать определенное количество строк из таблицы значений. Таблица значений будет иметь индексное поле, где будет храниться id аргумента, к которому относится значение.

P.S. Это основы реляционных БД.
1
ComfyMobile
 Аватар для DedBoroda
89 / 89 / 8
Регистрация: 04.11.2010
Сообщений: 376
04.11.2010, 14:08  [ТС]
Цитата Сообщение от ostgals Посмотреть сообщение
Не совсем так. Каждому аргументу будет соответствовать определенное количество строк из таблицы значений. Таблица значений будет иметь индексное поле, где будет храниться id аргумента, к которому относится значение.

P.S. Это основы реляционных БД.
А если добавлять столбцы, по типу 'значение1','значение2','значение3'...'з начениеN', это сильно скажется на производительности?
0
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
04.11.2010, 14:10
Цитата Сообщение от DedBoroda Посмотреть сообщение
А если добавлять столбцы, по типу 'значение1','значение2','значение3'...'з начениеN', это сильно скажется на производительности?
Производительность упадет, однозначно.
1
ComfyMobile
 Аватар для DedBoroda
89 / 89 / 8
Регистрация: 04.11.2010
Сообщений: 376
04.11.2010, 14:27  [ТС]
Всё же, таблицу значений для аргумента сложно реализовывать? что она из себя представляет, тип данных или отдельную таблицу?
Если сложно - дайте, пожалуйста, ссылку, где можно с этим разобраться. Ищу по запросу "MySQL таблица значений" и "MySQL много значений в одном поле" - ничего не находит.

Добавлено через 11 минут
Хотя, я думаю типа данных LongText мне хватит...

Большое спасибо за помощь, Вы хороший человек
0
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
04.11.2010, 14:57
Для примера...

Структура:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
--
-- Table structure for table `arg_names`
--
 
CREATE TABLE IF NOT EXISTS `arg_names` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
 
-- --------------------------------------------------------
 
--
-- Table structure for table `arg_values`
--
 
CREATE TABLE IF NOT EXISTS `arg_values` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name_id` INT(11) NOT NULL,
  `value` VARCHAR(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `name_id` (`name_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
Во второй таблице поле name_id - это id из первой таблицы.
Допустим, если мы хотим для 'аргумент А' хранить несколько значений, то это будет выглядеть так:
PHP
1
2
3
4
5
6
7
8
$result = mysql_query("INSERT INTO `arg_names` (`id`, `name`) VALUES (NULL, 'аргумент А')") or die(mysql_error());
$name_id = mysql_insert_id();
 
$result = mysql_query("
    INSERT INTO `arg_values` (`id`, `name_id`, `value`) VALUES
    (NULL, $name_id, '65432'),
    (NULL, $name_id, '12345')
    ");
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.11.2010, 14:57
Помогаю со студенческими работами здесь

Простые SQL запросы
Из таблицы ZIPCODE_INFO запросить zip_code, city, state в виде одного столбца. Разделить данные запятой. Пример: 400050, Mumbai, MH. Дать...

Создать простые запросы
Создать простые запросы всех типов , от выборки до удаления включительно . БД выложенна в этой...

Простые запросы на выборку
Вычислите сумму и число тех элементов заданного вектора X1, X2, ... , Xn, значение которых меньше 10 или находятся в пределах от 20 до 30...

Простые запросы на выборку
Как в условии отбора ( когда делаешь запрос) сделать так чтобы из нескольких цифр которые заданы он отбирал только первую. Допустим есть...

Простые запросы: Street и Person
Доброго времени суток! :) Только разбираюсь с SQL, было бы просто замечательно, если вы поможете мне разобраться в ряде запросов,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru