1--TEST-- 2Bug #71448 (Binding reference overwritten on php7) 3--SKIPIF-- 4<?php 5$target_dbs = array('oracledb' => true, 'timesten' => true); // test runs on these DBs 6require(__DIR__.'/skipif.inc'); 7?> 8--FILE-- 9<?php 10 11require(__DIR__.'/connect.inc'); 12 13// Initialize 14 15$stmtarray = array( 16 "CREATE OR REPLACE FUNCTION bindfunc(var1 varchar2, var2 varchar2) 17 RETURN varchar2 18 AS var3 VARCHAR2(20); 19 BEGIN 20 var3 := CONCAT(var1, var2); 21 RETURN var3; 22 END;", 23 "CREATE OR REPLACE PROCEDURE bindproc(var1 IN string, var2 IN string, var3 IN OUT string) IS 24 BEGIN 25 var3 := CONCAT(var1, var3); 26 var3 := CONCAT(var3, var2); 27 END;" 28); 29 30oci8_test_sql_execute($c, $stmtarray); 31 32// Run test 33 34function bindvar($stmt, $name, $var) 35{ 36 oci_bind_by_name($stmt, $name, $var); 37} 38 39// Test 1: Bind input parameter in a local function 40$sql = "select :var1, :var2 from dual"; 41$cache1 = "INSTR1"; 42$cache2 = "INSTR2"; 43 44echo "Test 1: Bind input parameter in a local function\n"; 45$stmt = oci_parse($c, $sql); 46 47bindvar($stmt, ':var1', $cache1); 48bindvar($stmt, ':var2', $cache2); 49 50oci_execute($stmt); 51 52var_dump(oci_fetch_assoc($stmt)); 53 54oci_free_statement($stmt); 55 56// Test 2: Bind output parameter in a local function 57$sql = "begin :output1 := 'OUTSTR1'; :output2 := 'OUTSTR2'; end;"; 58$cache1 = "xxxxxx"; 59$cache2 = "xxxxxx"; 60 61echo "\nTest 2: Bind output parameter in a local function\n"; 62$stmt = oci_parse($c, $sql); 63 64bindvar($stmt, ':output1', $cache1); 65bindvar($stmt, ':output2', $cache2); 66 67oci_execute($stmt); 68 69var_dump($cache1); 70var_dump($cache2); 71 72oci_free_statement($stmt); 73 74// Test 3: Bind output parameter within the same scope of execute 75$sql = "begin :output1 := 'OUTSTR1'; :output2 := 'OUTSTR2'; end;"; 76$cache1 = "xxxxxx"; 77$cache2 = "xxxxxx"; 78 79echo "\nTest 3: Bind output parameter within the same scope of execute\n"; 80$stmt = oci_parse($c, $sql); 81 82oci_bind_by_name($stmt, ":output1", $cache1); 83oci_bind_by_name($stmt, ":output2", $cache2); 84 85oci_execute($stmt); 86 87var_dump($cache1); 88var_dump($cache2); 89 90oci_free_statement($stmt); 91 92// Test 4: Bind output parameter within the same scope of execute 93$sql= "begin :output := bindfunc(:var1, :var2); end;"; 94$cache1 = "STR1"; 95$cache2 = "STR2"; 96 97echo "\nTest 4: Bind output parameter within the same scope of execute\n"; 98$stmt = oci_parse($c, $sql); 99 100oci_bind_by_name($stmt, ":var1", $cache1, -1); 101oci_bind_by_name($stmt, ":var2", $cache2, -1); 102oci_bind_by_name($stmt, ":output", $cache3, 100); 103 104oci_execute($stmt); 105 106var_dump($cache3); 107 108// Test 5: Bind IN OUT parameter in a local function 109 110$sql = "call bindproc(:var1, :var2, :var3)"; 111$cache1 = 'STR1'; 112$cache2 = 'STR2'; 113$cache3 = ' '; 114 115echo "\nTest 5: Bind IN OUT parameter in a local function\n"; 116$stmt = oci_parse($c, $sql); 117 118bindvar($stmt, ':var1', $cache1); 119bindvar($stmt, ':var2', $cache2); 120bindvar($stmt, ':var3', $cache3); 121 122oci_execute($stmt); 123 124var_dump($cache1); 125var_dump($cache2); 126var_dump($cache3); 127 128oci_free_statement($stmt); 129 130// Test 6: Bind IN OUT parameter within the same scope of execute 131 132$sql = "call bindproc(:var1, :var2, :var3)"; 133$cache1 = 'STR1'; 134$cache2 = 'STR2'; 135$cache3 = ' '; 136 137echo "\nTest 6: Bind IN OUT parameter within the same scope of execute\n"; 138$stmt = oci_parse($c, $sql); 139 140oci_bind_by_name($stmt, ":var1", $cache1, -1); 141oci_bind_by_name($stmt, ":var2", $cache2, -1); 142oci_bind_by_name($stmt, ":var3", $cache3, 100); 143 144oci_execute($stmt); 145 146var_dump($cache1); 147var_dump($cache2); 148var_dump($cache3); 149 150// Cleanup 151 152$stmtarray = array( 153 "DROP FUNCTION bindfunc", 154 "DROP PROCEDURE bindproc" 155); 156 157oci8_test_sql_execute($c, $stmtarray); 158 159?> 160--EXPECT-- 161Test 1: Bind input parameter in a local function 162array(2) { 163 [":VAR1"]=> 164 string(6) "INSTR1" 165 [":VAR2"]=> 166 string(6) "INSTR2" 167} 168 169Test 2: Bind output parameter in a local function 170string(6) "xxxxxx" 171string(6) "xxxxxx" 172 173Test 3: Bind output parameter within the same scope of execute 174string(7) "OUTSTR1" 175string(7) "OUTSTR2" 176 177Test 4: Bind output parameter within the same scope of execute 178string(8) "STR1STR2" 179 180Test 5: Bind IN OUT parameter in a local function 181string(4) "STR1" 182string(4) "STR2" 183string(1) " " 184 185Test 6: Bind IN OUT parameter within the same scope of execute 186string(4) "STR1" 187string(4) "STR2" 188string(9) "STR1 STR2" 189