2010-10-17 7 views
1

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é:

+0

De quel type est la colonne execution_time? –

+0

@Pekka - merci, ajouté à la poste. int (11) – Justin

+0

Pouvez-vous vider la requête terminée avant qu'elle ne soit envoyée au serveur? –

Répondre

3

Il semble db_query ("INSERT ....") est déconseillé en faveur de drupal_write_record().

Essayez drupal_write_record(). Comme il s'agit certainement d'un problème de masquage lors de la construction de la requête (plutôt que d'un problème de base de données), peut-être que cela le fait mieux.

+0

Merci, ça a marché. – Justin

+0

Utiliser 'drupal_write_record' n'est pas une mauvaise idée, mais le reste est faux. 'drupal_write_record' est une fonction de commodité qui utilise db_query elle-même, qui est la méthode standard d'interrogation dans drupal. – googletorp

+0

@googletorp Je ne suis pas un expert Drupal, mais selon le code source, 'drupal_write_record' fait un certain nombre de choses aux espaces réservés avant de faire 'drupal_query()'. Une de ces choses semble avoir réglé le problème. Bien sûr, il serait plus agréable de regarder la requête pour voir ce qui n'allait pas, mais cela semble avoir fonctionné –