【问题标题】:pdo insert error: OCIStmtExecute: ORA-12899: value too large for columnpdo 插入错误:OCIStmtExecute:ORA-12899:值对于列来说太大
【发布时间】:2011-07-17 05:28:48
【问题描述】:

我有一个 PDO 插入问题。这是我的代码 sn-p。它将数据值(由用户提交)绑定到数据参数;

    ...
    if((is_int($actualVal)) || ($actualVal ==NULL)){
    print $actualVal .' is INT<br>';
    $objStatement->bindValue(':'. $value, $actualVal, PDO::PARAM_INT);
}

    else {
        print $actualVal .' is STR<br>';
        $objStatement->bindValue(':'. $value, $actualVal, PDO::PARAM_STR);
    };

例如,当我提供以下数据值时:

$objRental->setRentalFacultyId('29');
$objRental->setRentalResCenterId(17);
$objRental->setRentalPurpose("purpose");
$objRental->setRentalDateReturned("2011-10-01");
$objRental->setRentalDateRented("2008-01-05");
$objRental->setRentalDateSaved("2001-12-12");
$objRental->setRentalUserIdSaved('3');
$objRental->setRentalReturnStatus('Y');
$objRental->setRentalSupervisorId('5');

我得到的结果和错误如下: 结果:

int 23
23 is INT
string 'purpose' (length=7)
purpose is STR
int 17
17 is INT
int 29
29 is INT
string '2008-01-05' (length=10)
2008-01-05 is STR
string '2011-10-01' (length=10)
2011-10-01 is STR
string '2001-12-12' (length=10)
2001-12-12 is STR
int 5
5 is STR
int 3
3 is STR
string 'Y' (length=1)
Y is STR

错误:

SQLSTATE[HY000]: General error: 12899 OCIStmtExecute: ORA-12899: value too large for column "....." (actual: 19, maximum: 15) (ext\pdo_oci\oci_statement.c:146)

我认为问题似乎发生了,因为 PDO 正在改变我的数据值的数据长度。任何人都知道如何解决这个问题或更好地理解这个问题?请帮助我,我已经用尽了谷歌搜索选项!

【问题讨论】:

  • 我在 DB 中的数据类型长度实际上是这样的,所以我不认为我错误地提供了超过数据长度的值,即使这是显示的错误。数据类型长度:FACILITY_ID VARCHAR2 60 RENTAL_RC_ID VARCHAR2 60 RENTAL_DATE_RENT时间戳(6)RENTAL_DATE_RTURN时间戳(6)RENTAL_SUPVSOR VARCHAR2 15 RENTAL_DATE_S时间戳(6)RENTAL_STAFF_ID_S VARCHAR2 15 RENTAL_DATE_E时间戳(6)RENTAL_STAFF_ID_E VARCHAR2 15 RENTAL_VENUE VARCHAR2 100 RENTAL_RTURN_STATUS VARCHAR2 1 RENTAL_PURPOSE VARCHAR2 200 RENTAL_FACULTY_ID VARCHAR2 15 RENTAL_DATEDUE_RTURN,时间戳(6)

标签: php sql oracle10g pdo object-relational-model


【解决方案1】:

你的桌子上有这个:

RENTAL_FACULTY_ID Varchar2 15

你的 PHP 有这个:

$objRental->setRentalFacultyId('29');

但后来我们看到了:

29 is INT

因此,rental_faculty_id 在进入数据库时​​需要是一个字符串,但有人将其转换为整数,因为'29' 看起来像一个整数;某人很可能是if 条件:

if((is_int($actualVal)) || ($actualVal ==NULL)){
    print $actualVal .' is INT<br>';
    $objStatement->bindValue(':'. $value, $actualVal, PDO::PARAM_INT);
}
else {
    print $actualVal .' is STR<br>';
    $objStatement->bindValue(':'. $value, $actualVal, PDO::PARAM_STR);
}

如果你尝试为需要字符串的东西绑定一个数字,你会得到奇怪的行为。

您应该使用数据库模式(而不是传入的数据)来确定您是否应该与PDO::PARAM_INTPDO::PARAM_STR 绑定。 is_int 函数应该为 '29' 返回 false,所以在 setRentalFacultyId 调用和上面的 if 语句之间可能有一些东西试图“聪明”。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2015-02-19
    • 1970-01-01
    • 2021-05-09
    • 2015-05-27
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多