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

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

04.11.2010, 11:44. Показов 2604. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru