Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439

    [mysql5] user defined function per hash

    Salve a tutti...

    stavo cercando di scrivere una function in mysql che mi tirasse fuori n righe di hash (possibilmente tutti diversi dagli altri... forse occorrerebbe una temporary table per questo):

    Ho scritto questa ma non sembra funzionare... qualcuno sa darmi qualche indicazione?
    Codice PHP:
    CREATE FUNCTION HASH(len INTEGER)
      
    RETURNS INTEGER(255)
      
    NOT DETERMINISTIC
    BEGIN
            
    DECLARE len INT;
            DECLARE 
    i INT;
            DECLARE 
    h STRING;
            
    SET i 0;
            WHILE( 
    len ) DO
            
    select substring(MD5(RAND()), -24) as h;
                
    SET i 1;
            
    END WHILE;
            return 
    h;
    END
    chiamando ad esempio hash(5) dovrebbe tirare fuori 5 righe di hash.
    (naturalmente select substring(MD5(RAND()), -24) as h; fa quello che deve fare correttamente)

    grazie in anticipo
    わさび

  2. #2
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Come ti è venuto in mente che sia possibile restituire "n righe" da una funzione? E poi come penseresti di richiamarla?

  3. #3
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439
    Infatti non ero sicuro che si potesse fare.. ho già scritto altre user defined senza particolari problemi... però mi serviva qualcosa direttamente in mysql che mi restituisse n-righe di hash...

    hai qualche idea in alternativa alla function? dovrei usare una procedura?
    わさび

  4. #4
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da Trinità76
    dovrei usare una procedura?
    Magari sì... visto che una procedura può restituire un result set

  5. #5
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439
    sto provando con questa...

    Codice PHP:
    CREATE PROCEDURE test.HASH(IN len INTIN counter INT)
    READS SQL DATA
    COMMENT 
    ''
    BEGIN
      
    DECLARE done INT DEFAULT 0;
      DECLARE 
    i INT DEFAULT 0;
      DECLARE 
    h VARCHAR(24);
      
    SET @CONCAT('SELECT SUBSTRING(MD5(RAND()), -',len,') AS h');
      
    SET i 0;

      DECLARE 
    sql1 CURSOR FOR @s;
      
      
    CREATE TEMPORARY TABLE IF NOT EXISTS `hashes` (
        `
    idint(10NOT NULL auto_increment,
        `
    hashvarchar(24NOT NULL,
        
    PRIMARY KEY  (`id`),
        
    UNIQUE KEY `hash` (`hash`)
      );
      
      
    OPEN sql1;
      
      
    hash_loopLOOP
      FETCH sql1 INTO h
    ;
      
      
    INSERT IGNORE INTO hashes VALUES);

      
    SET i i+1;
      
      IF 
    i=counter THEN
        SET done
    =1;
        
    LEAVE hash_loop;
      
    END IF;
      
      
    END LOOP hash_loop;
      
    CLOSE sql1;
      
      
    SELECT FROM hashes;
      
    DROP TABLE hashes;
      
    END
    ma mi restituisce MySql error number 1064: errore di sintassi vicino declare sql1.....
    わさび

  6. #6
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    i declare devono essere all'inizio

  7. #7
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439
    Originariamente inviato da luca200
    i declare devono essere all'inizio
    infatti, ho provato anche così senza formulare la query in modo variabile, ma da no database selected... eppure ho creato altre funzioni e ho i permessi per farlo

    Codice PHP:
    CREATE PROCEDURE test.HASH(IN len INTIN counter INTOUT rhash VARCHAR(30))
    READS SQL DATA
    COMMENT 
    ''
    BEGIN
      
    DECLARE done INT DEFAULT 0;
      DECLARE 
    i INT DEFAULT 0;
      DECLARE 
    h VARCHAR(24);

      DECLARE 
    sql1 CURSOR FOR 
        
    SELECT SUBSTRING(MD5(RAND()), -24) AS h;
      
      
    CREATE TEMPORARY TABLE IF NOT EXISTS `hashes` (
        `
    idint(10NOT NULL auto_increment,
        `
    hashvarchar(24NOT NULL,
        
    PRIMARY KEY  (`id`),
        
    UNIQUE KEY `hash` (`hash`)
      );
      
      
    OPEN sql1;
      
      
    hash_loopLOOP
      FETCH sql1 INTO h
    ;
      
      
    INSERT IGNORE INTO hashes VALUES);
      
      
    SET i i+1;
      
      IF 
    i=counter THEN
        SET done
    =1;
        
    LEAVE hash_loop;
      
    END IF;
      
      
    END LOOP hash_loop;
      
    CLOSE sql1;
      
      
    set rhash = ( SELECT FROM hashes );
      
    DROP TABLE hashes;
      
    END
    わさび

  8. #8
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439
    oddio.. voleva che specificassi tutte le volte test.nometabella ogni volta che richiamo quella tabella nello script.
    pensavo bastasse farlo una volta...

    ora almeno me l'ha accettato. vediamo un po' come funziona
    わさび

  9. #9
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439
    niente da fare...

    ho provato in questi due modi ma mi restituiscono sempre
    no data - zero rows fetched, selected or processed

    Codice PHP:
    CREATE PROCEDURE test.HASH(IN len INTIN counter INTOUT param CHAR(24))
    READS SQL DATA
    COMMENT 
    ''
    BEGIN
      
    DECLARE i INT DEFAULT 0;
      DECLARE 
    h VARCHAR(24);

      DECLARE 
    sql1 CURSOR FOR 
        
    SELECT SUBSTRING(MD5(RAND()), -24) AS h;
      
      
    CREATE TEMPORARY TABLE IF NOT EXISTS test.`hashes` (
        `
    idint(10NOT NULL auto_increment,
        `
    hashvarchar(24NOT NULL,
        
    PRIMARY KEY  (`id`),
        
    UNIQUE KEY `hash` (`hash`)
      );
      
      
    OPEN sql1;
      
      
    hash_loopLOOP
        FETCH sql1 INTO h
    ;
        
    INSERT IGNORE INTO test.hashes hash VALUES);
        
    SET i i+1;
        IF 
    i=counter THEN
          LEAVE hash_loop
    ;
        
    END IF;
      
    END LOOP hash_loop;
      
      
    CLOSE sql1;
      
      
    SET param = (SELECT hash FROM test.hashes);
      
    DROP TABLE test.hashes;
      
    END
    Codice PHP:
    CREATE PROCEDURE test.HASH(IN len INTIN counter INTOUT param CHAR(24))
    READS SQL DATA
    COMMENT 
    ''
    BEGIN
      
    DECLARE i INT DEFAULT 0;
      DECLARE 
    h VARCHAR(24);

      DECLARE 
    sql1 CURSOR FOR 
        
    SELECT SUBSTRING(MD5(RAND()), -24) AS h;
      
      
    CREATE TEMPORARY TABLE IF NOT EXISTS test.`hashes` (
        `
    idint(10NOT NULL auto_increment,
        `
    hashvarchar(24NOT NULL,
        
    PRIMARY KEY  (`id`),
        
    UNIQUE KEY `hash` (`hash`)
      );
      
      
    OPEN sql1;
      
        WHILE( 
    counter ) DO
        
    FETCH sql1 INTO h;
        
    INSERT IGNORE INTO test.hashes hash VALUES);
            
    SET i i+1;
        
    END WHILE;
      
      
    CLOSE sql1;
      
      
    SET param = (SELECT hash FROM test.hashes);
      
    DROP TABLE test.hashes;
      
    END
    chiamata:
    Codice PHP:
    CALL HASH(24,3,@a);
    select @a
    わさび

  10. #10
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Non puoi mettere un result set in un parametro
    Devi chiudere la procedure con una semplice select e poi leggerai il resultset dal codice php

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.