This is readily apparent when you actually read the documentation for oci_bind_by_name … but, if you quickly skim through the doc and get mostly what it’s telling you, you can lose data when implementing oci_bind_by_name in your code. That’s because the variable that gets bound into the name is a reference. It’s right there in the description
And again in the more verbose part of the description
Well? They really mean It!
I usually iterate through arrays with for $x=0; $x<count($arrayOfData);$x++ — which is fine because $arrayOfData[$x] is a valid location in memory that contains the data I want. I had a program, though, that accepted user input. Input that frequently contains a bunch of extraneous newline characters in the middle of the data. To avoid making the users clean up their input, I just threw an array_filter on the input. But I don’t need the reorganized data, so I didn’t “waste” the cycles to re-index the filtered array. Instead, I used
$iIterator=0; for( $itemInput in array_filter( $arrayOfData ) ) { oci_bind_by_name($stmt, ‘:placeholder’.$iIterator++, $itemInput); }
Which is fine in most circumstances. But, with oci_bind_by_name … the memory address where $inputItem happened to be stashed is bound to the names :placeholder0, :placeholder1, …, :placeholdern – that memory address happened to still contain the last element of arrayOfData I happened to stash there because the server isn’t so busy that memory is being reallocated a fraction of a second later. But this loop does not bind each element of arrayOfData to its corresponding placeholder — instead of saying “select * from MyTable where ID IN (1,2,3,4,5)” … I had “select * from MyTable where ID IN (5,5,5,5,5)”.
In this case you need to use the array index
for( $x = 0; $x < count( $arrayOfData ); $x++ ) { $strPlaceholderName = ":inputclli".$x; oci_bind_by_name($stmt, $strPlaceholderName, $arrayOfData[$x]); }
So each unique memory address is bound to a placeholder.