php - 何时在 PHP 中使用 OCI_B_INT?
问题描述
我有一个具有这种结构的 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"
工作正常。我能看到的唯一区别是数据类型(integer
vs number(14)
)。
解决方案
这真的不是OCI_B_INT
flag的问题。这里真正的罪魁祸首是maxlength
参数。
您必须指定
maxlength
何时使用 OUT 绑定,以便 PHP 分配足够的内存来保存返回的值。
maxlength
对于 IN 绑定,如果使用 PHP 变量的不同值多次重新执行语句,建议设置长度。否则 Oracle 可能会将数据截断为初始 PHP 变量值的长度。如果您不知道最大长度是多少,请oci_bind_by_name()
在每次调用之前使用当前数据大小重新oci_execute()
调用。绑定不必要的大长度将对数据库中的进程内存产生影响。
foreach($colonies as $colony) {
oci_bind_by_name($stmt, ":colony_id", $colony, -1, OCI_B_INT);
$r = oci_execute($stmt, OCI_DEFAULT);
}
推荐阅读
- sql - 保存日期的记录中字符串“- 4/24”的用途是什么?
- reactjs - 类型错误消息 - 当作为道具传递给点击事件时,函数不被识别为函数(这里是新手)
- angular - 如何通过 HTTPS 提供内容
- javascript - 如何修复“语法错误:意外的令牌:”
- javascript - 我对 Firestore 的 Cloud 函数的 onCreate 函数有疑问
- google-chrome - Vuex 在 Chrome 中的奇怪行为
- java - 为什么我们在这段代码中使用 new 来调用方法?
- c++ - Qt继承和类构造函数混淆
- python-2.7 - with conn: AttributeError: __exit__ 使用套接字接收消息时
- java - 初始化时打印超出范围