Come è possibile hrtime(true) mi dia Duplicate Key?!

di il
6 risposte

Come è possibile hrtime(true) mi dia Duplicate Key?!

Ho una colonna in sql che è unica, IDprivate, che è un varchar(100)
ma come è possibile che con il codice sottostante sql me lo blocca scrivendomi Duplicate entry '96320031010279' for key 'IDprivate'
$result = mysqli_query($mysqli_connection, "SELECT * FROM CATALOGO WHERE IDprivate IS NULL GROUP BY oggetto");
while($row = mysqli_fetch_assoc($result)){
    $oggetto = $row['oggetto'];
    $IDprivate = hrtime(true);
    if(!mysqli_query($mysqli_connection, "UPDATE CATALOGO SET IDprivate = '$IDprivate' WHERE oggetto = '$oggetto'")){
        echo $oggetto." ".$IDprivate."<br>".mysqli_error($mysqli_connection);
        exit();
    }else{
        echo "ok";
    }
}
me lo fa anche se metto una cosa del genere
$IDprivate = hrtime(true).microtime(true).rand(1,9999999);

è assurdo che prenda IDprivate uguali... boh... come fa a pescare dei valori uguali, che tra l'altro vado a vedere sul database e non esistono tra quelli già inseriti...

su 8000 risultati circa me ne ha modificato appena 100, e poi basta, dopo questi 100 continua a darmi Duplicate Key

Ma le stranezze tutte a me?


Non c'è verso, non capisco perché veda dei valori uguali quando nemmeno ci sono nella tabella.
è un valore estremamente random, come fa a dirmi che c'è già nella tabella?
Eppure 100 li ha modificati. Non capisco perché dopo questi 100 continua a vedere valori duplicate che nemmeno esistono poi nel campo IDprivate...
Sto cercando anche nella documentazione ma non trovo nulla...

6 Risposte

  • Re: Come è possibile hrtime(true) mi dia Duplicate Key?!

    melixo ha scritto:


    è assurdo che prenda IDprivate uguali... boh... come fa a pescare dei valori uguali, che tra l'altro vado a vedere sul database e non esistono tra quelli già inseriti...
    Chi garantisce che hrtime() ecc. restituiscano valori sempre diversi?
    Usa un contatore che si incrementa sempre più di una unità, per sicurezza.
  • Re: Come è possibile hrtime(true) mi dia Duplicate Key?!

    Sì ma...
    anche hrtime(true).microtime(true).rand(1,9999999);
    è impossibile...
    anche rand(1,9999999).rand(1,99999).rand(1,9999999).rand(1,99999);
    ho provato ad aggiungerne anche altri... è impossibile che diano risultati uguali, che tra l'altro non è vero che esistono nel database. Perché se prendo quel valore duplicato e lo cerco nel campo IDprivate non esiste!
    Anche microtime.rand(1,99999) come fa a dare risultati uguali se microtime si incrementa ogni millesimo di secondo??
    E comunque questo Duplicate compare subito alla prima iterazione, sempre!
    Non è un problema di valore di IDprivate.
    C'è qualcos'altro che non capisco
    Adesso provo un incremento++ e vediamo se mi dà lo stesso problema...
    Anche facendo
    $IDprivate = hrtime(true);
    $IDprivate++;
    risultato è uguale

    ecco qua...
    anche facendo
    $IDprivate = 0;
    $IDprivate++ ad ogni ciclo, il risultato è questo
    Duplicate entry '1' for key 'IDprivate
  • Re: Come è possibile hrtime(true) mi dia Duplicate Key?!

    Returns an array of integers in the form [seconds, nanoseconds], if the parameter as_number is false. Otherwise the nanoseconds are returned as int (64bit platforms) or float (32bit platforms). Returns false on failure.
    Non è Unix Time Stamp ma misurazione di secondi (Timer frequency in ticks per second) e nanosecondi e dipende dalla tua piattaforma e dalla versione php per l'alta risoluzione. Può restituire lo stesso valore.

    Però dovrebbe stampare intero positivo di 17, 16 o 15 cifre, forse la tua piattaforma non supporta 64bit. Poiché 14 cifre è il valore del float su Windows o derivati.
    <?php
    // PHP >= 7.1
    ini_set('precision', -1);
    ini_set('serialize_precision', -1);
    $forsefloat = 12345678901234567;
    $test = hrtime(TRUE);
    var_dump(PHP_INT_MAX, $forsefloat, $test);
    
    Un 1000000 di microsecondi è esattamente un secondo.

    Prova semplicemente con
    $tz = new DateTimeZone('Europe/Rome');
    // PHP >= 7.1 imposta i microsecondi che potrebbe essere diverso da 000000
    $date = new DateTime('now', $tz); //poi oggettoDateTime
    $variabileinvolucro = $date->format('U'); // Ritorna la differenza in secondi dall'epoca Unix.
    var_dump($variabileinvolucro);
    
    
    Per Post-increment "$i++" in php viene trasformato quando eccede il limite o in talune situazioni anche con piattaforma a 64bit ma le funzioni sono limitate a 32bit. Comunque è vero dovresti usare un contatore ma da qualche parte lo devi memorizzare (database, sessioni php o cookie, file di testo) poiché non è già noto il valore dentro il tuo database, poi incrementi
  • Re: Come è possibile hrtime(true) mi dia Duplicate Key?!

    In realtà nelle risposte avete parlato dei time ecc... ma il problema non è quello, il problema è che Duplicate Key me lo dà con qualsiasi valore io dia a IDprivate, e in qualunque modo io dia valore a IDprivate.
    A me non interessa utilizzare hrtime, a me interessa dare un valore univoco in qualunque modo a IDprivate perché 8.000 righe in database devono avere un IDprivate diverso (che è un campo UNIQUE varchar(100)).
    Il punto non è hrtime, il punto è che in QUALUNQUE modo si cerchi di dare un valore a IDprivate mi dà sempre Duplicate Key, e quel valore che lui vede duplicato in realtà non c'è! E questo errore me lo dà sempre e solo alla prima iterazione.

    Anche semplicemente usando un semplice $count++ ad ogni iterazione, mi dà Duplicate Key.
    È assurdo.

    È possibile che sia perché il campo è utf8_general_ci ?
    ad ogni modo hrtime mi dà sempre valori del genere
    36961249385551256
    36961249385562443
    36961249385565693
    36961249385567981
    36961249385570094
    36961249385572256
    se poi a questo ci aggiungo un rand(1,9999999) non può dare risultati uguali
    Considerando che hrtime aumenta sempre con il passare del tempo, in più ci aggiungo un rand, mi sembra assurdo
    Ma ripeto, non è questo il punto perché duplicate key me lo dà con qualsiasi valore
  • Re: Come è possibile hrtime(true) mi dia Duplicate Key?!

    Sei sicuro che nella tabella CATALOGO non ci siano più record con IDprivate = NULL con lo stesso valore nel campo oggetto?
    perché in questo caso con la query di UPDATE andresti ad inserire lo stesso IDprivate a più di un record.
  • Re: Come è possibile hrtime(true) mi dia Duplicate Key?!

    Madonna che stupido che sono... per carità, roba da sbattermi la testa al muro
    Grazie peo, mi ero fissato che avendoci messo GROUP BY oggetto allora il campo oggetto fosse univoco
    per carità...
    cancellatemi il post perché ho posto un problema inutile
    scusate
Devi accedere o registrarti per scrivere nel forum
6 risposte