MySQL. Проверка на наличие 2 значений в таблице.

kollya007

Участник
Сообщения
22
Реакции
1
Есть таблица из 2 полей.
steamid ip
и то и другое может повторяться т.е они не являются уникальными.

Как отправить такой запрос в базу чтоб он вернул bool значение или же мне просто нужно узнать есть ли такой steamid и\или ip в таблице, при чем сделать это нужно в 1 запросе.

Вернуть должно так:
steamid = true\false
ip = true\false

и если не сложно 2 вариант: чтоб возвращало не true\false а VARCHAR . Если совпадений не найдено то возвращало NULL (пустую строку).

Вернуть должно так:
steamid = 'STEAM_ID00123123'\'NULL' - если нет такого стимид
ip = '192.168.0.1'\'NULL' - если нет такого ip

Благодарю за внимание.
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,335
В одном запросе вряд ли получится, но получится в запросе с объединением. Это кстати сразу второй вариант, т.к. он проще.
C-подобный:
SELECT IFNULL((SELECT`steamid` FROM `my_table` WHERE `steamid`= 'STEAM_ID:0:0:123123'), 'NULL')
UNION ALL
SELECT IFNULL((SELECT`ip` FROM `my_table` WHERE `ip`= '192.168.0.1'), 'NULL');
 

kollya007

Участник
Сообщения
22
Реакции
1
В одном запросе вряд ли получится, но получится в запросе с объединением. Это кстати сразу второй вариант, т.к. он проще.
C-подобный:
SELECT IFNULL((SELECT`steamid` FROM `my_table` WHERE `steamid`= 'STEAM_ID:0:0:123123'), 'NULL')
UNION ALL
SELECT IFNULL((SELECT`ip` FROM `my_table` WHERE `ip`= '192.168.0.1'), 'NULL');
спасибо) я тоже ковырял UNION но у меня ниче не получалось. ваш код сработал но возникла другая проблема.
В Callback на этот запроос:
PHP:
if(SQL_HasResultSet(hndl) && SQL_FetchRow(hndl))
   {
    SQL_FetchString(hndl, 0, steaimid, 32);
    SQL_FetchString(hndl, 1, ip, 16); //На эту строку ругается 288
   }

PHP:
L 05/10/2017 - 17:22:32: [SM] Exception reported: Error fetching data from field 1
L 05/10/2017 - 17:22:32: [SM] Blaming: y.smx
L 05/10/2017 - 17:22:32: [SM] Call stack trace:
L 05/10/2017 - 17:22:32: [SM]   [0] SQL_FetchString
L 05/10/2017 - 17:22:32: [SM]   [1] Line 288, C:\Users\y.sp::SQL_CheckGetDonateCallback
 

sBorislav

Взломал GameCMS 3.411 - 27.02.18
Сообщения
196
Реакции
177
Зачем проверять и/или если ты можешь просто делать селект:
А возвращать значение или возващать NULL это вообще глупость, так никто не делает, тем более если ты его уже знаешь.
C-подобный:
SELECT * FROM `table` WHERE `steamid`= 'STEAM_ID:0:ххххх' OR `ip` = 'x.x.x.x'
Ответом есть такое значение в таблице или нет, будет количество найденных срок. Если строка не найдена, то их количество будет равно нулю.
Так и делают проверку на наличие значений в таблице. Можешь воспользоваться функцией COUNT().
P.S. если у тебя нет большого опыта с SQL, то зачем ты перекладываешь на него работу, которую может сделать твоя основная программа
 

kollya007

Участник
Сообщения
22
Реакции
1
Т.К БАЗА ПУСТА ВО ВРЕМЯ ЗАПРОСА ОТВЕТ ДОЖЕН БЫТЬ :
steaimid = 'NULL'
ip = 'NULL'

а оно бьет ошибку.
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
966
мб у тебя просто 2 выхода? Попробуй похимичить с FetchRow
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #7
@kollya007, если не будет нужных строк в базе SQL_FetchRow вернет false
 

kollya007

Участник
Сообщения
22
Реакции
1
@sBorislav, мне нужно узнать есть ли совпадения это стимид и ип в базе.
Если есть совпадения по IP то делаю один код.
Если есть совпадения по стим - другой код
Если нет совпаденияй - трейтий код
Если совпадения по Ип и стим - четвеортый код.

Вот как-то так.
 

kollya007

Участник
Сообщения
22
Реакции
1
Дайте пожалуйста наглядный пример Callback который будет работать как я описал выше.
 

kollya007

Участник
Сообщения
22
Реакции
1
@R1KO, так в том то и дело SQL_FetchRow(hndl)) = true, т.к все ок.. но при этом


PHP:
if(SQL_HasResultSet(hndl) && SQL_FetchRow(hndl))
   {
    SQL_FetchString(hndl, 0, steaimid, 32);
    SQL_FetchString(hndl, 1, ip, 16); //На эту строку ругается 288
   }

[PHP]L 05/10/2017 - 17:22:32: [SM] Exception reported: Error fetching data from field 1
L 05/10/2017 - 17:22:32: [SM] Blaming: y.smx
L 05/10/2017 - 17:22:32: [SM] Call stack trace:
L 05/10/2017 - 17:22:32: [SM]   [0] SQL_FetchString
L 05/10/2017 - 17:22:32: [SM]   [1] Line 288, C:\Users\y.sp::SQL_CheckGetDonateCallback

Посоветуйте как сделать правильно... ?

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

sBorislav

Взломал GameCMS 3.411 - 27.02.18
Сообщения
196
Реакции
177
@sBorislav, мне нужно узнать есть ли совпадения это стимид и ип в базе.
Если есть совпадения по IP то делаю один код.
Если есть совпадения по стим - другой код
Если нет совпаденияй - трейтий код
Если совпадения по Ип и стим - четвеортый код.

Вот как-то так.
C-подобный:
Select if ( (Select COUNT(`steam`)  from  `table` where `steam` = 'steam:0:xxx') >0, 'true', 'false') AS `steam`, if ( ( select COUNT(`ip`) from  `table` where `ip` = 'x.x.x.x') >0 , 'true', 'false') AS `ip`
Держи
 

kollya007

Участник
Сообщения
22
Реакции
1
@inklesspen,
Format(sQuery, sizeof(sQuery), "SELECT IFNULL((SELECT `steamid` FROM `test` WHERE `steamid`= '%s'), 'NULL') UNION ALL SELECT IFNULL((SELECT `ip` FROM `test` WHERE `ip`= '%s'), 'NULL')", Steam_ID, IP);

Возвращать оно полюбому должно 2 строки согласно запросу.
1 строка: или Steam_ID или NULL
2строка: или IP или NULL

а от этого я уже дальше буду "плясать"..
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,335
C-подобный:
SQL_FetchRow(hndl);
SQL_FetchString(hndl, 0, steaimid, 32);
SQL_FetchRow(hndl);
SQL_FetchString(hndl, 0, ip, 16);
Проверять на SQL_HasResultSet(hndl) && SQL_FetchRow(hndl) нет смысла, т.к. в любом случае будет либо результат, либо 'NULL'. Поэтому можно сразу извлекать данные из ответа.
 

kollya007

Участник
Сообщения
22
Реакции
1
@Reiko1231, так вопрос в том почему оно бьет ошибку)))

Согласно запросу - возврат полюбому должен быть строкой в которой что-то есть:
Возвращать оно полюбому должно 2 строки согласно запросу.
1 строка: или Steam_ID или NULL
2строка: или IP или NULL
--- Добавлено позже ---
@sBorislav, Спасибо, я не силен в MySQL боюсь ошибиться какой тут будет callback, что вернет?)
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,335
@kollya007, потому что нужно вызывать SQL_FetchRow два раза, после каждого раза считывая нулевой индекс. В примере показал же.
SQL_FetchRow(hndl);
SQL_FetchString(hndl, 0, steaimid, 32);
SQL_FetchRow(hndl);
SQL_FetchString(hndl, 0, ip, 16);
 

sBorislav

Взломал GameCMS 3.411 - 27.02.18
Сообщения
196
Реакции
177
@kollya007 вернет два столбца (steam, ip). Но этот способ не дает определениия, что стим и ip принадлежат друг другу. Это просто ответы, что он нашел их.
Возвращаясь в мое первое сообщние проще написать три запроса, чем заниматься идиотизмом.
Если в твоей задаче надо выполнить три условия, то и сделай эти запросы
if ( *найти по стиму и ip* ) {}
else if ( *найти по ip* ) {}
else if ( *найти по стиму* ) {}
else {} // ничего не найдено
 
Сверху Снизу