Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 30
  1. #1

    Inserire elementi di un array multi-dimensionale in una tabella mysql: i dati passati devono essere tra gli apici ?

    Ragazzi devo inserire in una tabella mysql gli elementi di un array php multidimensinale ma non so se gli elementi che passo in VALUES vadano bene cosi oppure devono essere tra gli apici:

    Allora creo la tabella:

    codice:
    CREATE TABLE earthquakes (
      milliseconds BIGINT,
      latitude FLOAT,
      longitude FLOAT,
      magnitude FLOAT,
      depth FLOAT,
      source VARCHAR(2),
      region SMALLINT,
      serial VARCHAT(16)
    );
    Innanzi tutto devo specificare la lunghezza dei caratteri anche per le altre colonne ?

    Poi il codice:

    codice:
    $array = array(
     array(12345678901112145,-35.4905,167.7843,7.5,450.4,"E",134,"2017-01-10-134"),
     array(12345678901112145,35.4905,-167.7843,3.2,45.4,"U",13,"2016-01-10-14"),
     array(12345678901112145,-35.4905,-167.7843,10.0,4,"I",1,"2016-01-10-1")
    );
    
    
    $data = array();
    foreach($array as $row) {
     $milliseconds = mysql_real_escape_string($row[0]);
     $latitude = mysql_real_escape_string($row[1]);
     $longitude = mysql_real_escape_string($row[2]);
     $magnitude = mysql_real_escape_string($row[3]);
     $depth= mysql_real_escape_string($row[4]);
     $source= mysql_real_escape_string($row[5]);
     $code= mysql_real_escape_string($row[6]);
     $serial= mysql_real_escape_string($row[7]); 
    
    
     $data[] = "($milliseconds,$latitude,$longitude,$magnitude,$depth,'$source',$code,'$serial')";
    }
    
    $values = implode(',', $data);
    
    
    $sql = "INSERT INTO earthquakes (milliseconds,latitude,longitude,magnitude,depth,source,region,serial) VALUES $values";

    Ovviamente $values è di tipo STRING ma ciò che mi chiedo e se gli elementi debbano essere tra gli apici oppure va bene tutto cosi come è...

    Scusate ma sono una capra in mysql

  2. #2
    Stai facendo confusione tra il preparare una riga per l'inserimento ed il prepararle tutte!

    La query INSERT, per come l'hai scritta, accetta un elenco separato da virgole dei valori dei campi di UN SINGOLO RECORD.

    Quindi fare implode(',',$data) dove in $data ha TUTTE le righe da inserire è sicuramente sbagliato.

    foreach($data as $drow) {
    $sql = "INSERT INTO earthquakes (milliseconds,latitude,longitude,magnitude,depth,s ource,region,serial) VALUES $drow;

    //qui esegui quella $sql
    }
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  3. #3
    https://stackoverflow.com/questions/...-rows-in-mysql

    però posso inserire più record con il solo INSERT
    quindi dov'è che sbaglio ?

    @Shores questo è $values:

    codice:
    VALUES (12345678901112145,-35.4905,167.7843,7.5,450.4,'E',134,'2017-01-10-134'),(12345678901112145,35.4905,-167.7843,3.2,45.4,'U',13,'2016-01-10-14'),(12345678901112145,-35.4905,-167.7843,10,4,'I',1,'2016-01-10-1')

    piuttosto mi chiedo se è corretto come ho scritto i dati? forse dovrei racchiudere ogni singolo elemento preso dall'array tra gli apici ?
    Ultima modifica di Rodrigoson6; 08-06-2017 a 14:48

  4. #4
    Scusa, si, hai ragione tu, la sintassi della INSERT dovrebbe essere ok.

    Ma non ti dà nessun tipo di errore quando esegui quella query?

    Sei sicura che i tipi di campo possano contenere i dati che ci inserisci (per esempio i millisecondi in un bigint, non so quanto risulti grande il bigint se non si dice esplicitamente...)?

    Al di là di questo, sai che Mysql ha anche dei tipi di dato geografici fatti apposta per conservare latitudine e longitudine?
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  5. #5
    Quote Originariamente inviata da Shores Visualizza il messaggio
    Scusa, si, hai ragione tu, la sintassi della INSERT dovrebbe essere ok.

    Ma non ti dà nessun tipo di errore quando esegui quella query?

    Sei sicura che i tipi di campo possano contenere i dati che ci inserisci (per esempio i millisecondi in un bigint, non so quanto risulti grande il bigint se non si dice esplicitamente...)?

    Al di là di questo, sai che Mysql ha anche dei tipi di dato geografici fatti apposta per conservare latitudine e longitudine?
    No non ho proprio provato ad eseguire...
    sto scrivendo un file php (bello grosso, sulle 3500 linee) e ora mi sto occupando di questa cosa, ovvero passare i dati nella tabella mysql pero di mysql non ne so nulla...
    Quindi la mia paura principale era sulla questione apici o non apici.

    A te come sembra quel codice ?

    Comunque il dato "millisecondi" è di 14-15 cifre mentre BIGINT è molto molto più grande...
    Dici che mi conviene dichiarare esplicitamente la lunghezza per tutti i campi ?
    che succede se dichiaro una lunghezza però poi il dato è più piccolo ?
    e se non dichiaro la lunghezza ?

  6. #6
    Se non dichiari la lunghezza di un campo esiste sicuramente un valore di default, che non ricordo, ma che sicuramente trovi nella documentazione di MySQL.

    Dichiarare o no la lunghezza è una tua scelta, ma assicurati che i dati non vengano mai troncati.

    Dal punto di vista degli apici, io tendenzialmente userei SEMPRE gli apici e mysqli_real_escape (a proposito, NON usare mysql che è stato già rimosso dalle ultime versioni di php, usa sempre mysqli), ma per una attività del genere proverei anche a guardare i prepared statements, può darsi che siano molto più efficienti.

    Quanto al file php di 3500 linee, NON FARLO! Io, che scrivo php da 20 anni, ho scritto un solo file che supera le 4700 linee in tutta la mia carriera, e sto cercando di suddividerlo in funzioni / classi separate perchè è scomodissimo da seguire... spezza le cose in più funzioni, ognuna delle quali si occupi di una precisa parte del compito da svolgere, così eviti di dover lavorare su spezzoni di codice talmente ampi da fare fatica a seguirli.

    Ti segnalo di nuovo che MySQL ha tipi di dati appositi per le coordinate geografiche, li hai guardati?
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  7. #7
    Quote Originariamente inviata da Shores Visualizza il messaggio
    Se non dichiari la lunghezza di un campo esiste sicuramente un valore di default, che non ricordo, ma che sicuramente trovi nella documentazione di MySQL.

    Dichiarare o no la lunghezza è una tua scelta, ma assicurati che i dati non vengano mai troncati.
    se dichiaro la lunghezza ma poi il valore è più piccolo cosa succede ?

    Dal punto di vista degli apici, io tendenzialmente userei SEMPRE gli apici e mysqli_real_escape (a proposito,
    Come ho scritto nel mio codice va bene ?

    NON usare mysql che è stato già rimosso dalle ultime versioni di php, usa sempre mysqli), ma per una attività del genere proverei anche a guardare i prepared statements, può darsi che siano molto più efficienti.
    Ti ringrazio di cuore ! stavo proprio cercando su internet la differenza tra mysql_query e mysqli_query

    Quanto al file php di 3500 linee, NON FARLO! Io, che scrivo php da 20 anni, ho scritto un solo file che supera le 4700 linee in tutta la mia carriera, e sto cercando di suddividerlo in funzioni / classi separate perchè è scomodissimo da seguire... spezza le cose in più funzioni, ognuna delle quali si occupi di una precisa parte del compito da svolgere, così eviti di dover lavorare su spezzoni di codice talmente ampi da fare fatica a seguirli.
    Lo so hai perfettamente ragione... purtroppo però non ne so molto di php (io sono più per js,css3,html e via dicendo) e quindi temo ci vorrebbe troppo tempo.
    Alla fine in queste 3500 linee c'è molto codice rindondante che varia giusto leggermente.

    Ti segnalo di nuovo che MySQL ha tipi di dati appositi per le coordinate geografiche, li hai guardati?
    Nono non ho trovato nulla che sia comprensibile a un neofita come me

  8. #8
    Se il dato è più corto non hai problemi, è se è più lungo che viene troncato e puoi avere molti problemi!

    Tu hai messo gli apici solo intorno ai valori stringa, che è lo stretto necessario, io sono solito metterli intorno a tutti i valori.

    Soprattutto se hai codice che si ripete dovresti scrivere una funzione e richiamarla più volte, invece di ripetere il codice, in questo php non è diverso da js, le funzioni sono pressochè identiche...

    Qui trovi tutto quel che riguarda le spatial extensions di Mysql:

    https://dev.mysql.com/doc/refman/5.6...xtensions.html
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  9. #9
    1) quindi se e' più corto non ci sono problemi se non specifico la lunghezza... Giusto? Anche per BIGINT ?

    2) se metto gli apici anche agli altri valori non succede nulla se nei loro campi ho specificato tipi numerici? E sopratutto poi nella tabella mi ritrovo i dati sempre con gli apici ?


    Shores io devo caricare un file csv in questa tabella (sempre gli stessi campi del codice postato) dici che anche nel .csv posso limitarmi a mettere gli apici intorno ai valori stringa oppure attorno a tutti i valori?

  10. #10
    1) No, nessun problema se il valore è più corto del campo.

    2) Gli apici delimitano il valore (indicano dove inizia e finisce il valore) ma NON fanno parte del valore stesso che verrà salvato nel campo.

    Per quel che riguarda il formato CSV, quale migliore reference dello standard:

    https://tools.ietf.org/html/rfc4180

    Ma in ogni caso CSV ha le sue regole, che sono di racchiudere i singoli campi tra virgolette doppie " " (obbligatorio quando un valore contiene spazi, virgole, a capo e virgolette doppie), separare i campi con la virgola ( , ) e separare i record ognuno su una riga chiusa da CR+LF.

    Una buona idea è anche avere una prima riga nel file che contenga i nomi dei campi, ma bisogna poi ricordarsi di saltarla in fase di importazione.

    In un CSV io metto sempre le virgolette doppie e faccio sempre l'escape delle virgolette doppie nel valore.

    Utile anche questa funzione se devi da php leggere un file csv:

    http://php.net/manual/en/function.str-getcsv.php
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

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 © 2025 vBulletin Solutions, Inc. All rights reserved.