[sql] Вопросы по БД

Discussion in 'PHP' started by FraiDex, 25 Feb 2008.

Thread Status:
Not open for further replies.
  1. phpdreamer

    phpdreamer Member

    Joined:
    26 Jul 2009
    Messages:
    522
    Likes Received:
    86
    Reputations:
    19
    В SQL нет порядка записей, а как там хранят записи подсистемы MyISAM и InnoDB - не отражается на работе с базой.
     
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    phpdreamer как ваши посты и "знание" внутреннего устройства реляционных СУБД помогает ответить на вопрос "подскажите запрос, который бы позволил получить номер строки по ее первичному ключу?"

    Кстати говоря, вы считаете ожидаемым поведение субд, если бы она всегда возвращала бы записи в случайном порядке?

    НTL для одной записи попробуйте так:
    Code:
    SELECT count(*) FROM `tabl` WHERE `prim_key`< 100000
    Вроде бы использует индексы и достаточно быстрый запрос, правда, не уверен. Вы лучше сформулируйте что хотите получить и зачем вам это нужно?
     
    _________________________
  3. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Спс, но я уже решил проблему следующим способом:
    Code:
    SELECT COUNT(*) FROM `Users` WHERE `Rate` >= (SELECT Rate FROM `Users` WHERE `Uid`='".$UserID."')
    
    2Gifts, это нужно для ТОП'а, точнее для "Вы занимаете X место"
     
  4. cool_haCker

    cool_haCker New Member

    Joined:
    22 Apr 2011
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Ребята помогите пожалуйста, на запрос

    http://****/site/page.php?news=-99%20select%20count

    Выдает:

    Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /opt/web/lib/site/page.php on line 145

    Помогите подобрать sql инъекцию, особо не шарю так что критику воспринимаю как урок:)
     
  5. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    2cool_haCker, в коде:
    PHP:
    $news=preg_replace('~[^0-9]*~','',$_GET["news"]);
    Эта строка удаляет все символы кроме цифр


    Раньше находил утилиту для снятия/заливки дампа в MySQL, которая мне очень понравилась, только вот когда она действительно понадобилась я ее потерял..
    Подскажите какие утилиты есть? (Только на PHP, база весит 100мб)
     
  6. dister

    dister New Member

    Joined:
    15 Jan 2011
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Итак, Ачатовцы, вопрос в следующем. В базе есть строка содержащая массив из символов, например: "Q, W, E, R, T, Y". Пользователь передает через Веб интерфейс какое-либо значемние переменной. Надо проверить содержится ли переданное пользователем значение переменной в строке базы (массиве). Как это можно осуществить?

    PS: Пораскинув извилиной нашел решение сам. Хоть оно, я так думаю, не самое рациональное, но, су*а, я пришел к нему сам, а это радует.
     
    #1406 dister, 7 May 2011
    Last edited: 8 May 2011
  7. trunker

    trunker Member

    Joined:
    5 Feb 2009
    Messages:
    44
    Likes Received:
    66
    Reputations:
    1
    Нужно создать хранимую процедуру которая будет увеличивать зарплату на %
    есть таблица
    № сотрудника|зарплата.
    1 |25000

    Входные параметры: № сотрудника, процент.
     
    #1407 trunker, 21 May 2011
    Last edited: 21 May 2011
  8. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    trunker может быть уточните хотя бы тип СУБД? И вы не пробовали учиться, ведь ради знаний вам дают домашние задания.

    Для mysql будет как-то так:
    Code:
    CREATE FUNCTION `len_delat_domashku`(`worker_num` int,`percent` real)
     RETURNS real
     READS SQL DATA
    BEGIN
      DECLARE out_variable REAL DEFAULT 0;
    	SELECT `zarplata`*`percent`/100 INTO `out_variable` FROM `workers` WHERE `id`=`worker_num`;
    
    	RETURN `out_variable`;
    END;
    Вызов, второй параметр указывается сразу в процентах:
    Code:
    SELECT len_delat_domashku(1, 20);
    
    База:
    PHP:
    CREATE TABLE `workers` (
      `
    idint(11NOT NULL,
      `
    zarplataint(11NOT NULL,
      
    PRIMARY KEY  (`id`)
    )
     
    _________________________
    #1408 Gifts, 21 May 2011
    Last edited: 21 May 2011
  9. trunker

    trunker Member

    Joined:
    5 Feb 2009
    Messages:
    44
    Likes Received:
    66
    Reputations:
    1
    sql manager

    Пробовал, но с процедурами еще не разобрался толком(
     
  10. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    trunker sql manager - не является названием СУБД
     
    _________________________
  11. trunker

    trunker Member

    Joined:
    5 Feb 2009
    Messages:
    44
    Likes Received:
    66
    Reputations:
    1
    SQL Manager for SQL Server
    Можете для него написать данную процедуру?
     
  12. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    trunker вы хоть что нибудь типа этого прочтите: http://www.devels.ru/index.php?what=art&p=99 Ну и фамилию препода запишите, пригодится

    Code:
    CREATE PROCEDURE [len_delat_dz]
    @worker_id [int] =1 ,
    @percent [real] =100
    AS
    BEGIN
      UPDATE workers SET zarplata = zarplata*@percent/100  where id=@worker_id
    END
     
    _________________________
    #1412 Gifts, 21 May 2011
    Last edited: 21 May 2011
    1 person likes this.
  13. ZloiKombat

    ZloiKombat Banned

    Joined:
    16 Jan 2011
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Всем привет. Подскажите почему мускул может не хотеть работать внутри функции? Такое ощущение что он не видит подключения. Я код выношу за пределы функции, все нормально работает
     
  14. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    ZloiKombat если вы создаете подключение внутри функции - переменная создается в локальной области видимости функции, чтобы избежать этого предварительно объявите переменную глобальной с помощью ключевого слова global. Проще будет, если вы покажете приблизительный код
     
    _________________________
  15. Mas

    Mas Banned

    Joined:
    30 Apr 2010
    Messages:
    15
    Likes Received:
    1
    Reputations:
    0
    Что не так с процедуро? помогите пож испраивть

    Задание следующее:
    Создать процедуру с использованием курсора для вывода списка занятий определенного преподавателя за определенный календарный период с подведением итогов по видам занятий.

    Талицы:

    Данные регистрации студентов
    Номер зачетки Код занятия Код предмета Время начала Время окончания Дата занятия
    10001 1 1 11:20 13:15 14.01.02


    Таблица 3
    Тип занятия
    Код занятия Тип занятия
    1 По расписанию


    Таблица 4
    Преподаватели
    Код преподавателя Преподаватель Код кафедры
    1 Серов 1

    Таблиц. 6
    Кафедры
    Код кафедры Кафедра
    1 Экономической информатики


    Таблица 7
    Предметы
    Код предмета Предмет Код кафедры
    1 БД 1


    create or replace procedure p_prepod_zanyat_dat(p_dat1 in date, p_dat2 in date,
    p_pr in varchar2) is
    CURSOR zanyat IS
    Select reg.K_P, z.n_tz, b.KAB, b.VR_N, round((b.vr_ok-b.vr_n),6) as vrem
    from
    registr reg inner join tip_zanyat tz on reg.kod_z=tz.kod_z
    where b.prep=p_prep order by z.n_tz;
    s number:=0;
    ktz zanytie.n_tz%type;
    p number:=0;
    begin
    DBMS_OUTPUT.PUT_LINE (RPAD('Код предмета',20,'_') || RPAD('Тип занятия',25,'_') ||RPAD('Кабинет',10,'_')||RPAD('Время начала',30,'_')||TO_CHAR('Кол-во часов'));
    FOR vstroka IN spis_zan LOOP
    if p=0 then /*проверка на первую запись в курсоре*/
    p:=1;
    ktz:=trim(vstroka.n_tz);
    s:=s+vstroka.vrem;
    else
    if
    trim(ktz)=trim(vstroka.n_tz) then
    s:=s+vstroka.vrem;
    else
    DBMS_OUTPUT.PUT_LINE (RPAD('Итого',21,'_')||ktz||LPAD(perevod(s),56,'_'));
    s:=0;
    ktz:=vstroka.n_tz;
    s:=s+vstroka.vrem;
    end if;
    end if;
    DBMS_OUTPUT.PUT_LINE(RPAD(vstroka.K_P,20,'_')||RPAD(vstroka.n_tz,25,'_')||RPAD (TO_CHAR(vstroka.kab),10,'_')||RPAD(TO_CHAR(vstroka. VR_N),30,'_')||perevod(vstroka.vrem));
    end loop;
    DBMS_OUTPUT.PUT_LINE (RPAD('Итого',21,'_')||ktz||LPAD(perevod(s),55,'_'));
    END;
     
  16. geforse

    geforse Elder - Старейшина

    Joined:
    2 Mar 2008
    Messages:
    617
    Likes Received:
    290
    Reputations:
    1
    PHP:
    mysql_query("UPDATE XXX SET last_login=".date("Y-m-d H:i:s")." WHERE login='xxx'");
    datetime. Не обовляет значение :(
     
  17. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    geforse строковые переменные (результат функции date) следует заключать в кавычки:
    PHP:
     mysql_query("UPDATE XXX SET last_login='".date("Y-m-d H:i:s")."' WHERE login='xxx'");  
     
    _________________________
  18. geforse

    geforse Elder - Старейшина

    Joined:
    2 Mar 2008
    Messages:
    617
    Likes Received:
    290
    Reputations:
    1
    Gifts, спасибо. Ещё вопрос.
    Есть таблица вида:

    id login value
    1 admin XX
    2 admin YY
    3 user ZZ


    Как получить ХХ и YY ? (тоесть все value пользователя admin)
     
  19. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    Code:
    SELECT `value` from `table` WHERE login='admin'
     
    1 person likes this.
  20. geforse

    geforse Elder - Старейшина

    Joined:
    2 Mar 2008
    Messages:
    617
    Likes Received:
    290
    Reputations:
    1
    XAMEHA, собственно так и делаю, но..

    PHP:
    $data mysql_fetch_assoc(mysql_query("SELECT value FROM users WHERE login='admin'"));
    print_r($data);
    Array ( [value] => XX )

    YY не выводится :(
     
Thread Status:
Not open for further replies.