Visualizzazione risultati 1 fino 8 di 8

Discussione: Impossibile utilizzare CREATE FUNCTION?

  1. #1
    Guest

    Predefinito Impossibile utilizzare CREATE FUNCTION?

    Salve a tutti,
    avrei estremamente bisogno di creare una funzione mysql con CREATE FUNCTION, ma da quello che sono riuscito a capire altevista monta una versione 4.x di mysql, e quindi è impossibile creare delle proprie funzioni poichè non supporta la sintassi. Ho capito bene?!
    So che con una simile versione di mysql sarebbe possibile importare delle funzioni con una UDF, ma non credo che chiunque possa accedere alla directory 'plugin' di mysql.
    Come posso fare? Realizzare una simile cosa in PHP potrebbe essere troppo pesante dal punto di vista delle query.
    Grazie mille

  2. #2
    programmazioned non è connesso Utente attivo
    Data registrazione
    25-03-2008
    Messaggi
    440

    Predefinito

    Hai capito bene: su AlterVista c'è MySQL 4, quindi niente procedure.
    Di che funzione si tratta?
    Ciao!

  3. #3
    Guest

    Predefinito

    Una funzione che serve a calcolare la distanza di Levenshtein fra due stringhe.

    Codice:
    CREATE FUNCTION levenshtein (s1 VARCHAR(255), s2 VARCHAR(255))
      RETURNS INT
        DETERMINISTIC
          BEGIN
            DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
            DECLARE s1_char CHAR;
            DECLARE cv0, cv1 VARBINARY(256);
            SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0;
            IF s1 = s2 THEN
              RETURN 0;
            ELSEIF s1_len = 0 THEN
              RETURN s2_len;
            ELSEIF s2_len = 0 THEN
              RETURN s1_len;
            ELSE
              WHILE j <= s2_len DO
                SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
              END WHILE;
              WHILE i <= s1_len DO
                SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
                WHILE j <= s2_len DO
                    SET c = c + 1;
                    IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF;
                    SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
                    IF c > c_temp THEN SET c = c_temp; END IF;
                    SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
                    IF c > c_temp THEN SET c = c_temp; END IF;
                    SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
                END WHILE;
                SET cv1 = cv0, i = i + 1;
              END WHILE;
            END IF;
            RETURN c;
          END
    Ovviamente si potrebbe rifare in PHP, dato che il PHP stesso mette a disposizione la funzione levenshtein(), ma questo vorrebbe dire scaricarmi tutta la tabella in questione, ed effettuare il controllo direttamente in PHP, e penso che questo potrebbe incidere notevolmente in termini di prestazioni.

  4. #4
    Guest

    Predefinito

    Usi la funzione levenshtein del PHP. Non puoi fare altrimenti, visto che quel codice non puoi usarlo.

    Ciao.

  5. #5
    Guest

    Predefinito

    Eh si...lo so . Mi stavo già ingegnando per utilizzarla, infatti.
    Mi sorgono una serie di dubbi, a riguardo però. Diciamo che questo sia il mio codice.
    Codice PHP:
    $a = array();

    $query = "SELECT nome FROM utenti WHERE 1";

    $ris = mysql_query($query, $conn) or die ("Errore nella query: " .mysql_error());

    for(
    $i = 0; $i < mysql_num_rows($ris); $i++){

    $utente = mysql_fetch_array($ris);

    if(
    levenshtein("nomeDiRiferimento", $utente[nome]) < 6){
    array_push($a,$utente[nome]);
    }

    }
    mi ritroverei in $a i nomi con distanza di levenshtein minore di 6. Se io in seguito volessi avere $a ordinato per distanza di levenshtein, suppongo che dovrei salvare le coppie di valori in $a come (nome,distanza) (ottenendo quindi un array di array), e poi ordinarlo per (distanza,nome). Ma che funzione php dovrei utilizzare per ordinare un array composto in tale modo?!

    per capirci:
    $a = (
    (nome1, 3),
    (nome4, 3),
    (nome6, 4),
    (nome2, 5),
    ...
    )

  6. #6
    Guest

    Predefinito

    Prova così
    Codice PHP:
    $a = array();

    $query = "SELECT nome FROM utenti WHERE 1";

    $ris = mysql_query($query, $conn) or die ("Errore nella query: " .mysql_error());

    for(
    $i = 0; $i < mysql_num_rows($ris); $i++){

    $utente = mysql_fetch_array($ris);

    $distanza = levenshtein("nomeDiRiferimento", $utente[nome]);

    if(
    $distanza < 6)
    $a[] = array($distanza, $utente[nome]);
    }

  7. #7
    Guest

    Predefinito

    si, così mi crea l'array nella maniera corretta, ok...
    il mio problema fondamentale era nel ordinarlo secondo la distanza. Ho notato che se utilizzo sort($a), automaticamente mi ordina gli array per entrata 0 (quindi la distanza). Non so se poi li ordina per entrata 1 a parità di distanza.
    Quello che mi chiedevo è se ci fosse un modo per dire alla funzione sort di ordinare i vari array che compongono l'array $a per un campo determinato (quindi, non per forza per "distanza" ma solo per il campo contenente il "nome", ad esempio).

  8. #8
    Guest

    Predefinito

    eh.. vedi su sito ufficiale la documentazione, sulla sinistra ci sono altre funzioni per l'ordinamento, vedi se ti possono essere utili.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •