我有一個具有這種結構的 Oracle 表:column type key---------------------------------------------id integer primary keyuser_id integer foreign keycolony_id number(14) foreign keylast_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))。
1 回答

RISEBY
TA貢獻1856條經驗 獲得超5個贊
這真的不是OCI_B_INTflag的問題。這里真正的罪魁禍首是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);
}
- 1 回答
- 0 關注
- 119 瀏覽
添加回答
舉報
0/150
提交
取消