我有一个具有这种结构的 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 并且一切正常。我不明白何时以及如何使用该标志,因为在没有标志的情况下绑定$user_id到":user_id"工作正常。我能看到的唯一区别是数据类型(integervs number(14))。
RISEBY