Je possède ce code à l'intérieur d'un crochet de sortie dans un module personnalisé:fonction Drupal db_query() stocke la valeur de débordement pour INTs qui ne sont pas trop grand
$diff = round(((microtime(true)-$script_start_time)*1000));
watchdog('thaty', $diff);
if(variable_get('thingy', 0) == 1) {
$data = array(
'q'=>$_GET['q'],
'memory'=>memory_get_peak_usage(),
'execution_time'=>$diff
);
db_query('INSERT INTO {blah} (q,memory,dt,execution_time) VALUES (\'%s\',%b,UNIX_TIMESTAMP(),%b)',$data);
}
La valeur de diff $ sera de temps en temps toujours obtenir enregistré dans la base de données comme 2147483647, qui est la valeur de débordement pour un INT, je crois, en PHP. Lorsque je connecte la valeur via watchdog, je peux confirmer qu'il n'est pas défini sur 2147483647, mais la valeur réelle, qui est un nombre entier à trois chiffres.
valeurs typiques (confirmé par l'exploitation forestière):
La colonne execution_time est int (11).
Je n'arrive pas à trouver la source de ce problème. Ce que j'ai essayé:
- En utilisant% d au lieu de% b pour la valeur
- Affectation diff $ à une nouvelle variable INT
- Vérification de cette valeur erronée pré-insérer
- Confirmation de la valeur de diff $ est pas trop grand pour un INT en PHP
- en utilisant% n Essayé, re: http://www.lullabot.com/articles/drupocalypse-now-or-dangerous-integer-handling-drupal-write-record
De quel type est la colonne execution_time? –
@Pekka - merci, ajouté à la poste. int (11) – Justin
Pouvez-vous vider la requête terminée avant qu'elle ne soit envoyée au serveur? –