何时在PHP中使用OCI_B_INT?

问题描述 投票:0回答:1

我有一个具有这种结构的Oracle表:

column             type           key
---------------------------------------------
id                 integer        primary key
user_id            integer        foreign key
colony_id          number(14)     foreign key
last_upd_username  varchar2(50)
last_upd_date      date

我没有创建表,但我认为colony_id也应该是integer-而不是number (现在为时已晚,无法更改它)

我有一个查询,可以在此表中插入多行:

$colonies = array_map("intval", $post['colonies']);

# Assign colonies to $user_id
$sql = "INSERT INTO user_colonies (
    id,
    user_id,
    colony_id,
    last_upd_username,
    last_upd_date
  ) VALUES (
    user_colonies_seq.NEXTVAL,
    :user_id,
    :colony_id,
    :username,
    sysdate
  )";

$stmt = oci_parse($conn, $sql);
oci_bind_by_name($stmt, ":user_id", $user_id);
oci_bind_by_name($stmt, ":colony_id", $colony);
oci_bind_by_name($stmt, ":username", $username);

foreach($colonies as $colony) {
  $r = oci_execute($stmt, OCI_DEFAULT);
  if(!$r) {
    $e = oci_error($stmt);
    $result['err'][] = $e['message'];
  }
}

$result['msg'] = 'success';

oci_commit($conn);
oci_free_statement($stmt);

echo json_encode($result);

这种工作是因为查询运行良好($e['message'])始终为null。但是,当我查看插入的行时,colony_id没有任何意义,它们只是一堆从1到9的随机整数,而我期望的是实际ID(应为数千)。

我能够通过更改使其起作用

oci_bind_by_name($stmt, ":colony_id", $colony);

进入

oci_bind_by_name($stmt, ":colony_id", $colony, -1, OCI_B_INT);

通过使用OCI_B_INT,将使用正确的ID,并且一切正常。我不明白何时以及如何使用该标志,因为在没有该标志的情况下将OCI_B_INT绑定到$user_id效果很好。我可以看到的唯一区别是数据类型(":user_id"integer)。

php oracle integer oci
1个回答
0
投票

number(14)标志确实不是问题。真正的罪魁祸首是OCI_B_INT参数。

必须使用OUT绑定时指定maxlength,以便PHP分配足够的内存来保存返回的值。

对于IN绑定,如果设置了maxlength长度,则建议设置该语句用不同的值重新执行了多次PHP变量。否则,Oracle可能会将数据截断到最大长度。初始PHP变量值。如果您不知道最大长度将是,然后使用当前数据大小重新调用maxlength在每个oci_bind_by_name()呼叫之前。绑定不必要的大长度将影响数据库中的进程内存。

oci_execute()
© www.soinside.com 2019 - 2024. All rights reserved.