Pagina 1 di 2 12 UltimoUltimo
Visualizzazione risultati 1 fino 30 di 50
Like Tree10Likes

Discussione: strpos + substr e stringa

  1. #1
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Exclamation strpos + substr e stringa

    Salve a tutti

    vorrei visualizzare una parte della stringa compresa tra ( e )

    esempio:

    5 feet, 4 inches (163 cm)
    il risultato dovrebbe essere 163

    con il codice sotto visualizzo (163, si dovrebbe toglire (

    Codice PHP:

    <?php
    $string
    = $row['height'];

    $pos1 = strpos($string, "(");

    $pos2 = strpos($string, "cm", $pos1);

    $text = substr($string,$pos1,$pos2-$pos1);
    echo
    $text;
    ?>
    Ultima modifica di blackskyisback : 02-12-2020 alle ore 11.49.12

  2. #2
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Codice PHP:
    $text = substr($string,$pos1(+1),$pos2-($pos1+1));
    Ultima modifica di darbula : 02-12-2020 alle ore 12.02.03

  3. #3
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Codice PHP:
    $text = substr($string,$pos1(+1),$pos2-($pos1+1));
    ciao darbula

    modificato ma ..purtroppo non funziona, viene restituita ancora la (

    Codice PHP:
    <?php
    $string
    = $row['height'];

    $pos1 = strpos($string, "(");

    $pos2 = strpos($string, "cm", $pos1);

    $text = substr($string,$pos1,$pos2-($pos1+1));

    ?>
    Codice PHP:
    <td><?php echo $text;?></td>

  4. #4
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Ho impostato la variabile manualmente e ho l'output atteso di 163 se uso il mio codice per creare la variabile $text.
    https://3v4l.org/hQLtO
    Ultima modifica di darbula : 02-12-2020 alle ore 15.20.16

  5. #5
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    strano

    Codice PHP:
    <?php
    $string
    = $row['height'];

    $pos1 = strpos($string, "(");

    $pos2 = strpos($string, "cm", $pos1);

    $text = substr($string,$pos1+1,$pos2-2+$pos1);
    ?>
    Codice PHP:
    <td><?php echo $text;?></td>
    sparita questa
    (
    ma adesso e' ricomparsa questa
    )


    le stringhe di prova sono queste (in blu quello da visualizzare)

    testo da nascondere (170) testo da nascondere

    testo da nascondere (175) testo da nascondere

    testo da nascondere (180) testo da nascondere

    output


  6. #6
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Con questo codice puoi unicamente usarlo solo su stringe (numero cm) altrimenti non funziona, la stringa può anche essere (numero) ?
    Codice PHP:
    $row["height"] = '(163 cm)';
    $string= $row['height'];

    $pos1 = strpos($string, "(");

    $pos2 = strpos($string, "cm", $pos1);

    $text = substr($string,$pos1+1,$pos2-2+$pos1);
    echo
    $text;

  7. #7
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Con questo codice puoi unicamente usarlo solo su stringe (numero cm) altrimenti non funziona, la stringa può anche essere (numero) ?
    Codice PHP:
    $row["height"] = '(163 cm)';
    $string= $row['height'];

    $pos1 = strpos($string, "(");

    $pos2 = strpos($string, "cm", $pos1);

    $text = substr($string,$pos1+1,$pos2-2+$pos1);
    echo
    $text;
    non funziona correttamente il risultato e' questo


    170) testo da nasc


    il campo height e di tipo text


    con questo codice

    Codice PHP:
    <?php
    $string
    = $row['height'];

    $pos1 = strpos($string, "(");

    $pos2 = strpos($string, "cm", $pos1);

    $text = substr($string,$pos1,$pos2-($pos1+1));

    ?>
    Codice PHP:
    <td><?php echo $text;?></td>
    visualizzo cosi

    (170

  8. #8
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Una bella PCRE:
    Codice PHP:
    preg_match_all('/(\d*)/', $row['height'], $matches);
    $matches = array_values(array_filter($matches[0]));
    echo
    $matches[0];
    Qualche esempio:
    Codice PHP:
    preg_match_all('/(\d*)/', '(189 cm)', $matches);
    $matches = array_values(array_filter($matches[0]));
    var_dump($matches[0]);

    preg_match_all('/(\d*)/', '(189)', $matches);
    $matches = array_values(array_filter($matches[0]));
    var_dump($matches[0]);

    preg_match_all('/(\d*)/', '189 cm', $matches);
    $matches = array_values(array_filter($matches[0]));
    var_dump($matches[0]);

    preg_match_all('/(\d*)/', '189', $matches);
    $matches = array_values(array_filter($matches[0]));
    var_dump($matches[0]);
    Produce:
    Codice:
    string(3) "189"
    
    string(3) "189"
    
    string(3) "189"
    
    string(3) "189"

    I suggerimenti che do più spesso:


  9. #9
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Ciao mzanella

    come ho scritto sopra la stringa da visualizzare deve stare tra

    (
    e
    )

    tutto il resto iniziale (feet& inches, testo da nascondere e per demo) e finale (info) deve essere nascosto

    ecco il risultato del tuo codice, qualcosa e' migliorato ma...



  10. #10
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Codice PHP:
    $string= $row['height'];

    $pos1 = strpos($string, "(");
    $pos2 = strpos($string, "cm", $pos1);
    $text = '';
    if(
    $pos1 !== false && $pos2 > $pos1)
    $text = substr($string,$pos1+1,$pos2-$pos1-2);
    echo
    $text;
    Il codice recupera da un carattere dopo ( a due caratteri prima di cm altrimenti di default è una stringa vuota.
    Se vuoi la ricerca più stringente dovrebbe essere da ( a ) cioè comune in ogni situazione anche se assente cm. Per questo esempio mi affido alla presenza di cm , chiedi pure se vuoi una ricerca più stringente da ( a ) che preleva solo una sequenza numerica.
    Ultima modifica di darbula : 03-12-2020 alle ore 11.44.18
    blackskyisback likes this.

  11. #11
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    come ho scritto sopra la stringa da visualizzare deve stare tra
    (
    e
    )
    Tecnicamente questo non è vero . Se fosse così la stringa (189 cm) non dovrebbe produrre risultati perché il 189 sta tra ( e cm, non tra ( e ). Probabilmente quello che cerchi è la più lunga sotto stringa composta da cifre della sotto stringa contenuta tra parentesi tonde.

    Puoi smanettare con le posizioni dei caratteri come suggerisce darbula, oppure usare una PCRE adattata:
    Codice PHP:
    preg_match_all('/\([^\d]*(\d*)[^\d]*\)/', $row['height'], $matches);
    echo
    $matches[1][0];
    Questo ha il vantaggio di essere indipendente dall'unità di misura. Al bisogno si può adattare per gestire i decimali.

    In generale, però, meglio se queste cose sono gestite nello schema del database prevedendo una colonna "altezza" numerica, anziché una stringa che poi vada "spacchettata" per recuperare l'informazione .
    blackskyisback likes this.

    I suggerimenti che do più spesso:


  12. #12
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Codice PHP:
    $string= $row['height'];

    $pos1 = strpos($string, "(");
    $pos2 = strpos($string, "cm", $pos1);
    $text = '';
    if(
    $pos1 !== false && $pos2 > $pos1)
    $text = substr($string,$pos1+1,$pos2-$pos1-2);
    echo
    $text;
    Il codice recupera da un carattere dopo ( a due caratteri prima di cm altrimenti di default è una stringa vuota.
    Se vuoi la ricerca più stringente dovrebbe essere da ( a ) cioè comune in ogni situazione anche se assente cm. Per questo esempio mi affido alla presenza di cm , chiedi pure se vuoi una ricerca più stringente da ( a ) che preleva solo una sequenza numerica.
    Finalmente, adesso funziona

    mi potresti gentilmente spiegare il codice? , una specie di debug


    cosi capisco meglio GRAZIE


    Ultima modifica di blackskyisback : 03-12-2020 alle ore 13.55.24

  13. #13
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Tecnicamente questo non è vero . Se fosse così la stringa (189 cm) non dovrebbe produrre risultati perché il 189 sta tra ( e cm, non tra ( e ). Probabilmente quello che cerchi è la più lunga sotto stringa composta da cifre della sotto stringa contenuta tra parentesi tonde.

    Puoi smanettare con le posizioni dei caratteri come suggerisce darbula, oppure usare una PCRE adattata:
    Codice PHP:
    preg_match_all('/\([^\d]*(\d*)[^\d]*\)/', $row['height'], $matches);
    echo
    $matches[1][0];
    Questo ha il vantaggio di essere indipendente dall'unità di misura. Al bisogno si può adattare per gestire i decimali.

    In generale, però, meglio se queste cose sono gestite nello schema del database prevedendo una colonna "altezza" numerica, anziché una stringa che poi vada "spacchettata" per recuperare l'informazione .
    GRAZIE, anche questo funziona adesso

    quale scegliere tra i due?

    il motivo per cui il campo height e di tipo text e' semplice
    esempio:
    all'inizio va
    5 feet, 6 inches
    poi
    (168 cm)
    e poi (non sempre) una descrizione, tipo, altezza non verificata o altro

    l'alternativa era creare 2 campi, uno per 168 e l'altro per la descrizione, ma dovrei manipolare tutti i dati dall'inizio

    come ho chiesto a darbula lo chiedo anche a te

    mi potresti spiegare gentilmente questo codice

  14. #14
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    GRAZIE, anche questo funziona adesso
    quale scegliere tra i due?

    come ho chiesto a darbula lo chiedo anche a te
    mi potresti spiegare gentilmente questo codice
    preg_match_all cerca corrispondenze utilizzando PCRE, un'estensione nativamente supportata da PHP delle espressioni regolari. Queste ultime descrivono i linguaggi prodotti da grammatiche regolari. Il primo parametro rappresenta il pattern, il secondo la stringa su cui lavorare, e il terzo il vettore in cui saranno inseriti i risultati.
    La parte più interessante è il pattern, che definisce il formato della stringa in cui cercare corrispondenze. Questo pattern:
    Codice:
    \([^\d]*(\d*)[^\d]*\)
    va letto come "cerca una parentesi aperta \(", poi "ignora qualsiasi sequenza di caratteri non numerici [^\d]*", "seleziona la più lunga sequenza di caratteri numerici (\d*)", poi "ignora ancora qualsiasi sequenza di caratteri non numerici [^\d]*", infine "cerca una parentesi chiusa \)".
    Oltre a essere una scrittura più compatta, generalmente è anche più semplice dimostrare la correttezza di una PCRE, benché per casi così semplici non cambi molto.

    il motivo per cui il campo height e di tipo text e' [...]
    Seguendo questo ragionamento, i database potrebbero usare solo il tipo VARCHAR, lasciando che chi ci scrive dentro rappresenti le informazioni in maniera testuale come preferisce. Ovviamente è possibile, e purtroppo c'è chi lo fa, ma questo riduce moltissimo le possibilità di un sistema. Certo, ora che è strutturato in questo modo, probabilmente conviene tenerlo così.
    blackskyisback likes this.

    I suggerimenti che do più spesso:


  15. #15
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    molto dettagliata la descrizione sulle espressioni regolari,
    c'e' qualche tool in cui digitare il tutto e ti fa' il live-preview del risultato ?

    Grazie mzanella

  16. #16
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Io di solito uso regex101.com, ma ce ne sono anche altri.

    I suggerimenti che do più spesso:


  17. #17
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Io di solito uso regex101.com, ma ce ne sono anche altri.
    provato e mi restituisce questo




    Grazie

  18. #18
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Conversione da centimetri a inches (pollice) ogni pollice equivalente 2.54 centimetri. Una sequenza numerica con separatore decimale (il punto o la virgola) è diverso da un numero intero e può essere di tipo float o double (come detto sopra una sequenza numerica con separatore decimale o forzando l'impostazione del tipo)
    Quindi in realtà avrai una misura intera come input originale o altrimenti qualche volta la sequenza numerica potrebbe anche essere un'approssimazione del numero reale.
    Fatta questa premessa per la Russia e Italia il separatore decimale è la virgola, quindi si dovrebbe comunque convertire alla lingua selezionata dal proprio utente però discorso diverso se height sarebbe un indice o comunque qualcosa da ordinare nel database ma nel tuo caso credo sia impossibile ordinare per altezza attore/attrice lol.
    Comunque 168/2.54=66.1417 e non 6 inches come da te mostrato.
    Scusami il codice è già spiegato un carattere dopo la parentesi tonda aperta e due caratteri prima di spazio_biancocm.
    Dunque la funzione strpos ritorna la posizione del carattere di ricerca che potrebbe anche essere 0 che significa il primo carattere di una stringa spiegandolo con un'esempio:
    Codice PHP:
    $string = '(163 cm)';
    $pos1 = strpos($string, '(');
    echo
    substr($string, $pos+1, 3);
    In $pos1 avrò il valore 0 della funzione strpos, in substr recupero una stringa dal carattere $pos1+1 (1 che indica il secondo carattere della stringa) mentre il terzo argomento 3 indica quanti caratteri recuperare. 163 ovviamente tiene esattamente tre caratteri.
    Ultima modifica di darbula : 03-12-2020 alle ore 17.07.44
    blackskyisback likes this.

  19. #19
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    il codice da feet inches a cm in realta' e' generato con un programmino in javascript, non so quanto e' attendibile

    ottima spiegazione

    grazie darbula


    per le espressioni regolari segnalo questo su github che lavora anche su computer

    https://github.com/ysmood/regex-builder

    certo devo prima studiare le espressioni

  20. #20
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    questo addirittura mi propone anche il codice in base alla stringa inserita

    https://github.com/noxone/regex-generator

    Try Regex Generator online.

    https://regex-generator.olafneumann.org/

  21. #21
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    rieccomi,

    come elaboarare questa stringa?

    Alexisback (from imd), Alexs (from google), Alexandr, Al

    le parti in rosso devono essere esclusi

    il deliminatore e' la virgola

    codice

    Codice PHP:
    <?php
    require_once("connetti.php");

    $actor_id = $_GET['id'];

    $query = "SELECT * FROM actor WHERE actor_id=". $actor_id;
    $arr = array();
    $result = mysql_query( $query );
    if (!
    $result)
    die(
    "mySQL error: ". mysql_error());
    while(
    $row = mysql_fetch_object( $result ) ) : ?>


    <?php

    $risultato
    = explode(" , ", $row->performer_aka);
    foreach (
    $risultato as $res) {
    array_push($arr, $res);
    }





    ?>
    <?
    endwhile; ?>
    <?php
    // poi fuori dal while fai cosi:
    natcasesort($arr); // Sort array items in PHP so that it is not case sensitive to letters, https://www.php.net/manual/en/function.natcasesort.php
    foreach (array_unique($arr) as $ok){


    echo
    "<span class='label green'><a href='film_tags_credited.php?tag=$ok&actor_id=$actor_id' target='_blank''>$ok *</a></span> ";



    }
    ?>

  22. #22
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Questo problema è sintomo che la struttura del database non è opportuna, viene utilizzata una singola colonna per memorizzare più di un'informazione in un formato personalizzato. La soluzione corretta è normalizzare il database.

    Una soluzione non corretta sarebbe mettere una toppa e assecondare la struttura del database, usando un'altra PCRE per sostituire l'informazione tra parentesi con una stringa vuota:
    Codice PHP:
    foreach ($risultato as $res) {
    $res = preg_replace('/([^\(]*)\s+\([^\)]*\)/', '${1}', $res);
    $res = trim($res);
    array_push($arr, $res);
    }
    Esempio:
    Codice PHP:
    $res = 'Alexisback (from imd)';
    $res = preg_replace('/([^\(]*)\s+\([^\)]*\)/', '${1}', $res);
    echo
    $res . PHP_EOL;
    // Output: Alexisback
    Spiegazione: l'espressione regolare utilizzata seleziona il più lungo prefisso che non contiene uno spazio seguito da una partentesi aperta seguita da una qualsiasi sotto stringa seguita da una parentesi chiusa. È più semplice da interpretare al contrario: la seconda parte di pattern \s+\([^\)]*\) identifica l'informazione tra parentesi da omettere, la restante parte [^\(]* quella da mantenere, che è quindi posta tra parentesi tonde: ([^\(]*).
    Il secondo parametro è la stringa di sostituzione, indica come trasformare la stringa (fornita come terzo parametro). In questo caso si tratta di considerare solo la porzione di stringa per cui esiste una corrispondenza con la prima parte del pattern, il che si indica come ${1}.
    blackskyisback likes this.

    I suggerimenti che do più spesso:


  23. #23
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Questo problema è sintomo che la struttura del database non è opportuna, viene utilizzata una singola colonna per memorizzare più di un'informazione in un formato personalizzato. La soluzione corretta è normalizzare il database.
    Ciao mzanella, Buona Domenica

    quando ho incominciato a progettare il database ero indeciso su che tipo di campo/i impostare,
    cosi ho optato per un type Text per il semplice motivo che potevo inserire molti dati li,

    normalizzare il database

    come?

    mi potresti consigliare come impostare il tipo di campo e come prelevari i dati che saranno sicuramente multi

    Grazie

  24. #24
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    normalizzare il database
    come?
    mi potresti consigliare come impostare il tipo di campo e come prelevare i dati che saranno sicuramente multi 
    È più un'arte che una scienza, nel senso che non c'è una procedura o "algoritmo" specifico da seguire, però ci sono molte indicazioni e esempi anche nella pagina dedicata su Wikipedia. Inoltre per capire come normalizzare bisogna conoscere esattamente il significato di cosa si sta inserendo nella base di dati (su questo qualcosa dal codice credo di averlo capito).

    Se non erro ogni attore ha una lista di "performer_aka", ciascun elemento di questa lista ha un nome (es. Alexisback) e, opzionalmente, una fonte (es. imdb, google).
    È chiaro che la relazione tra l'attore e i "performer_aka" sia di tipo uno a molti (ogni attore può avere più "performer_aka"), che in ambito SQL viene generalmente reso creando una tabella separata "performer_aka", che mantenga un riferimento all'attore. Poiché le informazioni rilevanti sono il nome (obbligatorio, mi pare) e la fonte (opzionale, mi pare), questa tabella potrebbe avere 3 colonne così strutturate:
    Codice:
    CREATE TABLE perfomer_aka(
        actor_id INT NOT NULL,
        name VARCHAR(255) NOT NULL,
        source VARCHAR(255) NULL DEFAULT NULL,
        PRIMARY KEY(actor_id, name, source),
        CONSTRAINT FK_actor_performer FOREIGN KEY (actor_id)
        REFERENCES actor(id)
    );
    CREATE INDEX IDX_performer_aka ON performer_aka(actor_id);
    La primary key utilizzata comprende tutti e tre i campi: non possono esistere due record identici, possono però esistere due record relativi allo stesso attore, con lo stesso nome, ma fonte diversa. L'indice, creato nell'ultima riga, serve e rendere più efficienti le letture per attore, che verosimilmente saranno l'operazione più frequente su questa tabella.

    Dato l'id di un attore è abbastanza semplice recuperare la sua lista di "performer_aka":
    Codice:
    SELECT name, source FROM performer_aka WHERE actor_id = 42
    Se hai invece bisogno di recuperare l'informazione per tutti gli attori, puoi ricorrere a una JOIN
    Codice:
    SELECT actor.id AS actor_id, actor.name AS actor_name, performer_aka.name AS performer_aka_name, performer_aka.source AS performer_aka_source
    FROM actor JOIN performer_aka ON actor.id = performer_aka.actor_id
    i risultati saranno nella forma
    Codice:
    actor_id | actor_name | performer_aka_name | performer_aka_source
           1 |       nome |         Alexisback |                 imdb
           1 |       nome |          Alex back |               google
           1 |       nome |                 Al |                 NULL
           3 |      nome2 |                XXX |               google
    che potrai poi scandire e raggruppare, per esempio in un vettore:
    Codice PHP:
    $actors = [];
    while (
    $row = ...) {
    $actors[$row['actor_id']]['name'] = $row['actor_name'];
    $actors[$row['actor_id']]['performer_aka'][] = [
    'name' => $row['performer_aka_name'],
    'source' => $row['performer_aka_source']
    ];
    }
    che alla fine avrà questa forma:
    Codice:
    $actors = [
        '1' => [
            'name' => 'nome',
            'performer_aka' => [
                ['name' => 'Alexisback', source => 'imdb'],
                ['name' => 'Alex back', source => 'google'],
                ['name' => 'Al', source => null],
            ]
        ],
        '2' => [
            'name' => 'nome2',
            'performer_aka' => [
                ['name' => 'XXX', source => 'google']
            ]
        ]
    ]
    Quando mostrerai i dati, quindi, non avrai più problemi. Per esempio:
    Codice PHP:
    foreach ($actors as $actor) {
    echo
    $actor['name'];
    echo
    "<ul>";
    foreach (
    $actor['performer_aka'] as $performer_aka) {
    echo
    "<li>" . $performer_aka['name'] . "</li>";
    }
    echo
    "</ul>";
    }
    Se vuoi mostrare anche la fonte basta sostituire con:
    Codice PHP:
    if (!is_null($performer_aka['source'])) {
    echo
    "<li>" . $performer_aka['name'] . "(" . $performer_aka['source'] . ")</li>";
    }
    else {
    echo
    "<li>" . $performer_aka['name'] . "</li>";
    }
    E c'è di più, se in futuro volessi aggiungere delle informazioni, per esempio un link alla fonte, potresti semplicemente aggiungere una colonna source_link a performer_aka senza che questo intacchi il resto del codice (cosa non possibile col formato che usi attualmente), oppure potresti voler inserire informazioni sul tipo di fonte, per esempio una descrizione di cosa sono imdb e google. In questo caso dovresti creare una tabella source con le colonne name, description dove name è la chiave primaria, e può essere consultata in JOIN con performer_aka come
    Codice:
    SELECT * from performer_aka JOIN source ON performer_aka.source = source.name;
    in questo caso useresti delle chiavi naturali, puoi anche passare alle chiavi surrogate se preferisci.
    blackskyisback likes this.

    I suggerimenti che do più spesso:


  25. #25
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    WOOW

    una spiegazione dettagliatissima

    per gli attori e i film ho utilizzato un tecnica simile, sia per evitare duplicati e sia per non avere informazioni rindondanti

    adesso provo a mettere in atto il tuo codice

    come al solito ti ringrazio moltissimo, sto imparando molte cose in questo forum

    abbiate pazienza con me se a volte chiedo delle cose incomprensibili (per me)

    come diceva il grande Eduardo De Filippo, Gli esami non finiscono mai.

    Grazie

  26. #26
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    mzanella ciao

    Ci sono problemi

    ho provato a creare l'altra tabella con i campi ma mi ha generato errore



    queste sono le relazioni



    e questi i campi del database presenti (coinvolti per adesso)



    Ultima modifica di blackskyisback : 06-12-2020 alle ore 14.24.23

  27. #27
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Avevo dato per scontato che la chiave primaria della tabella actor si chiamasse id, si chiama invece actor_id: il codice per la nuova tabella va modificato di conseguenza:
    Codice:
    CREATE TABLE perfomer_aka(
        actor_id INT NOT NULL,
        name VARCHAR(255) NOT NULL,
        source VARCHAR(255) NULL DEFAULT NULL,
        PRIMARY KEY(actor_id, name, source),
        CONSTRAINT FK_actor_performer FOREIGN KEY (actor_id)
        REFERENCES actor(actor_id)
    );
    (è cambiata la penultima riga)

    I suggerimenti che do più spesso:


  28. #28
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Avevo dato per scontato che la chiave primaria della tabella actor si chiamasse id, si chiama invece actor_id: il codice per la nuova tabella va modificato di conseguenza:
    Codice:
    CREATE TABLE perfomer_aka(
        actor_id INT NOT NULL,
        name VARCHAR(255) NOT NULL,
        source VARCHAR(255) NULL DEFAULT NULL,
        PRIMARY KEY(actor_id, name, source),
        CONSTRAINT FK_actor_performer FOREIGN KEY (actor_id)
        REFERENCES actor(actor_id)
    );
    (è cambiata la penultima riga)
    Niente, non ne vuole sapere


  29. #29
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Avevo anche dato per scontato che actor.actor_id fosse ti tipo INT, invece è SMALLINT UNSIGNED. Sto perdendo colpi .
    Codice:
    CREATE TABLE perfomer_aka(
        actor_id SMALLINT UNSIGNED NOT NULL,
        name VARCHAR(255) NOT NULL,
        source VARCHAR(255) NULL DEFAULT NULL,
        PRIMARY KEY(actor_id, name, source),
        CONSTRAINT FK_actor_performer FOREIGN KEY (actor_id)
        REFERENCES actor(actor_id)
    );

    I suggerimenti che do più spesso:


  30. #30
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    perfetto, adesso funziona

    non ti preoccupare, ti puoi permettere di sbagliare

    domani continuo e ti faccio sapere

    Grazie, pizza e birra (virtuale) a volonta'

Pagina 1 di 2 12 UltimoUltimo

Regole di scrittura

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