Php Drupal函数db_query()为不太大的整数存储溢出值

Php Drupal函数db_query()为不太大的整数存储溢出值,php,drupal,drupal-6,Php,Drupal,Drupal 6,我在自定义模块的出口挂钩中有以下代码: $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(),

我在自定义模块的出口挂钩中有以下代码:

$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);
    }
$diff的值偶尔会以2147483647的形式保存在数据库中,我相信这是PHP中INT的溢出值。当我通过watchdog记录值时,我可以确认它没有被设置为2147483647,而是实际值,它是一个三位数的整数

典型值(通过记录确认):

  • 708
  • 408
  • 413
执行时间列为int(11)

我似乎找不到这个问题的根源。我尝试过的事情:

  • 使用%d而不是%b作为值
  • 将$diff分配给一个新的整型变量
  • 检查预插入时是否存在此错误值
  • 确认$diff的值对于PHP中的INT不是太大
  • 已尝试使用%n,请重新:
似乎db_查询(“插入…”)已被弃用,取而代之的是

试试看


鉴于在构建查询时这肯定是一个掩蔽问题(而不是数据库问题),也许这样做会更好。

执行时间列是什么类型?@Pekka-谢谢,添加到帖子中。int(11)你能在将完成的查询发送到服务器之前转储它吗?有没有Drupal的方法可以做到这一点?@Justin我不知道(我对Drupal不太了解),使用
Drupal\u write\u record
不是个坏主意,但其余的都是错的
drupal\u write\u record
是一个方便的函数,它使用db\u查询本身,这是drupal中查询的标准方式。@googletorp我不是drupal专家,但根据源代码,
drupal\u write\u record
在执行
drupal\u查询()
之前对占位符做了很多事情。其中一件事情似乎解决了这个问题。当然,最好是查看查询,看看哪里出了问题,但这似乎奏效了out@googletorp是的,这似乎已经解决了OP的问题,所以看起来很好(尽管我想知道最后是怎么回事,OP说他以前用了
%d
而不是
%b
,但没有用)。@Pekka,实际上,它对占位符本身没有任何作用。它只是构造了一个非常类似于OP自己的查询。不同之处在于,它可以使用模式信息来填写用
hook\u模式定义的默认值,并且它将使用正确的占位符(%d表示INT)。不管怎样,我否决了你,因为你写了一些完全错误的东西
db_query
是创建查询的方法,使用%d时,OP所做的应该是有效的。真正的问题可能在于方案定义,或者OP没有复制查询中的所有信息。@Pekka,当我在编写时不小心提交了评论时,重新发布了评论,并且花了太长时间对其进行阐述,无法对其进行编辑。我还没说完,你就已经回复了。