`
flex_莫冲
  • 浏览: 1095755 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

thinkphp不会识别unsigned int数据类型,会导致sql执行错误

 
阅读更多
数据库中是 unsigned int, 支持40多亿, 但用tp进行查询的时候, where方法会自动把大于2147483647的(有符号int最大值) 转化成 2147483647


print_r($condition);
$Mode->where($condition)->find();
echo $Mode->getlastSql();


结果:

Array
(
[sid] => 2147645095
[type] => icili
)
SELECT * FROM `al_qitadianying` WHERE ( `sid` = 2147483647 ) AND ( `type` = 'icili' ) LIMIT 1


sid 字段是 unsigned in

---------------------------------------------
下面是我自己的测试结果

我测试了,
$data['userID'] = "davidhuang";
$data['sysID'] = 2147645095;
$data['loginTime'] = datetime();
$data['loginStatus'] = 0;
$data['validStatus'] = 0;
$result = M("loginLog")->add($data);
dump(M()->getLastSql());
生成的sql是
INSERT INTO `login_log` (`userID`,`sysID`,`loginTime`,`loginStatus`,`validStatus`) VALUES ('davidhuang',-2147322201,'2013-11-19 09:58:44',0,0)
sysID的类型是
int(11) UNSIGNED
应该是个bug。

测试TP版本 3.1.3

看下tp的源码:
/**
* 数据类型检测
* access protected
* @param mixed $data 数据
* @param string $key 字段名
* return void
*/
protected function _parseType(&$data,$key) {
$fieldType = strtolower($this->fields['_type'][$key]);
if(false !== strpos($fieldType,'int')) {
$data[$key] = intval($data[$key]);
}elseif(false !== strpos($fieldType,'float') || false !== strpos($fieldType,'double')){
$data[$key] = floatval($data[$key]);
}elseif(false !== strpos($fieldType,'bool')){
$data[$key] = (bool)$data[$key];
}
}
它用的是intval,转换后的最大值是2147483647。
API说明:
intval($var, $base)
Get the integer value of a variable
link http://www.php.net/manual/en/function.intval.php
@param var mixed
The scalar value being converted to an integer
@param base int[optional]
The base for the conversion
return int The integer value of var on success, or 0 on failure. Empty arrays and objects return 0, non-empty arrays and objects return 1.
The maximum value depends on the system. 32 bit systems have a maximum signed integer range of -2147483648 to 2147483647. So for example on such a system, intval('1000000000000') will return 2147483647. The maximum signed integer value for 64 bit systems is 9223372036854775807.
Strings will most likely return 0 although this depends on the leftmost characters of the string. The common rules of integer casting apply.
分享到:
评论

相关推荐

    Thinkphp 连接 SQL SERVER 类

    这通常涉及到创建自定义的数据驱动(driver)或适配器(adapter),使得ThinkPHP能够理解并处理SQL Server的特定语法和特性。 1. **安装SQL Server PHP驱动**: 在使用ThinkPHP连接SQL Server之前,你需要确保已经...

    PHP安装ZBarCodeImage识别二维码功能,thinkphp5.0

    PHP安装ZBarCodeImage插件,实现识别二维码功能。thinkphp5.0识别二维码,php实现识别二维码功能。,php二维码识别功能。

    thinkphp5 连接SqlService需要的扩展

    `thinkphp5 连接SqlService需要的扩展`这个主题主要涉及如何在ThinkPHP5框架中配置和使用SQLServer数据库服务,这里我们详细探讨一下相关的知识点。 首先,`SqlService`通常指的是SQL Server服务,它是一个流行的...

    Thinkphp 连接 SQL SERVER 类+工具

    在开发阶段,可以开启调试模式,方便查看SQL执行信息和错误日志。在`Conf/config.php`中设置`debug`为`true`即可。 总结,`Thinkphp 连接 SQL SERVER 类+工具`是实现ThinkPHP框架与SQL Server数据库交互的关键。`...

    thinkphp3.2整合PHPExcel 数据导入导出完整示例

    在模型类中,我们可以通过ThinkPHP的`save()`或`add()`方法来插入数据,这些方法会处理SQL语句的生成和执行。 对于数据导出,我们需要创建一个新的控制器函数,根据用户请求从数据库中查询数据。这可能涉及复杂的...

    ThinkPHP 批量添加数据

    4. **错误处理**:在批量操作中,可能会遇到如数据格式错误、数据库连接问题等异常。因此,记得捕获并处理可能出现的错误。你可以使用try-catch语句来确保程序的健壮性: ```php try { $userModel->insertAll($...

    thinkPHP框架中执行原生SQL语句的方法

    ThinkPHP框架提供了方便的接口来执行这些原生SQL,这使得开发者能够灵活地利用数据库的强大功能。本篇文章将深入探讨如何在ThinkPHP中执行原生SQL语句,并对比`query()`和`execute()`这两个方法的使用场景和差异。 ...

    ThinkPHP学习笔记(五)关联的SQL文件

    ThinkPHP学习笔记(五)关联的SQL文件

    thinkphp5解决sqlserver链接问题

    工作需要用到php5.5连sqlserver 2008 R2,发现最新版的php内置已经不支持mssql 了,需要用到sqlsrv。 微软提供了Microsoft Drivers for PHP for SQL Server。

    Thinkphp批量更新数据的方法汇总

    以下小编给大家列出了三种实现thinkphp批量更新数据的方法,写的不好还请见谅,有意见欢迎提出,共同学习进步! 方法一: //批量修改 data二维数组 field关键字段 参考ci 批量修改函数 传参方式 function batch_...

    ThinkPHP数据操作指南

    ThinkPHP数据操作指南ThinkPHP数据操作指南ThinkPHP数据操作指南ThinkPHP数据操作指南ThinkPHP数据操作指南ThinkPHP数据操作指南

    thinkPHP调用枚举类型

    thinkPHP调用枚举类型,里面根据参数不同返回值不同,初步只封装了input(radio、check)、td、select等。

    thinkphp+pgsql

    例如,ThinkPHP 默认的数据库驱动可能不支持 PostgreSQL 特有的数据类型或 SQL 语法。 #### 三、解决方案 为了解决上述兼容性问题,我们需要进行以下几步操作: ##### 1. 修改数据库配置文件 首先,需要修改 ...

    李炎恢thinkphp讲义代码

    在数据库操作方面,ThinkPHP提供了简便的数据操作接口,包括查询、插入、更新和删除等,同时也支持复杂的关联查询。学习者可以通过讲义了解到如何使用ActiveRecord模式操作数据库,以及如何编写SQL语句。 模板引擎...

    Thinkphp3和SqlServer2005完美整合

    Thinkphp3.0 + SqlServer 2005 本人由于最近项目中使用的数据库是Sql 2005的,经过测算官方的无法正常使用,所以,我就重新写了 底层的数据库抽象层。 php 5.2.6版本以下,可以用php官方的接口连接数据库,无需...

    ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例

    本篇文章将深入探讨如何在ThinkPHP3.2.3框架中实现执行原生SQL语句,包括查询、插入、更新和删除操作。 首先,我们要了解ThinkPHP3.2.3中的Model层,它是用于处理数据模型的,包含了与数据库交互的主要方法。在执行...

    thinkphp5.1 系统数据备份、还原

    在ThinkPHP5.1中,数据备份通常通过执行SQL语句来完成。框架提供了一套完整的数据库操作类库,包括数据备份接口。你可以创建一个控制器或者服务类,调用这些接口来备份指定的数据库。例如,可以使用`Db::execute()`...

    thinkphp_thinkphp_thinkphp5_

    本压缩包“thinkphp_thinkphp_thinkphp5_”包含了一个基于ThinkPHP5的模板开发实例,旨在帮助开发者快速理解和运用ThinkPHP5框架进行项目开发。 首先,我们要理解ThinkPHP5的核心设计理念——“简洁、快速、优雅”...

    thinkPHP5.0完全开发手册 chm类型

    11. **命令行工具**:ThinkPHP5.0提供了命令行接口(CLI),可以用来执行定时任务、数据迁移等后台操作。学习如何编写和运行Artisan命令。 12. **安全**:包括密码加密、CSRF防护、SQL注入预防等,了解如何确保应用...

    ThinkPHP v5.x命令执行利用工具(可getshell)

    在这个场景中,"ThinkPHP v5.x命令执行利用工具(可getshell)"指的是一个专门针对ThinkPHP v5.x版本的安全漏洞进行利用的工具,该工具能够使得攻击者通过命令执行漏洞获取服务器的shell访问权限。 命令执行漏洞...

Global site tag (gtag.js) - Google Analytics