PHP OCI BIND-IN & BIND-OUT ISSUE
У меня есть приложение базы данных PHP, и я получаю сообщение об ошибке при попытке связать и связать строковые переменные с помощью функций OCI. Если размер привязки слишком велик, значения привязываются к неправильным полям базы данных (нет ошибок Oracle, PHP или OCI; данные просто попадают в неправильные столбцы). Я написал следующий код, который определяет наибольшее значение размера привязки, которое я могу использовать на каждом сервере, который я использую. Это работает, но я не понимаю, почему существует такой предел. Это связано с параметром PHP .INI? Ограничение отличается на разных серверах (в диапазоне от 1333 до 4000), на которых установлены одинаковые версии PHP и Oracle. Я проверил везде, где могу придумать, но не могу придумать ответ. Я использую Zend Studio 7.2.1 и Oracle 11/g. Любая помощь будет принята с благодарностью.
// Determine value of MAXBINDSIZE. Note a database connection has already been established in "$conn".
$backupBy = "CAC";
$backupStatus = "Success";
$mx = 8000;//largest reasonable value (for me).
$my = $mx / 2;
$maxBindSize = 1000;//smallest reasonable value (for me).
$i = 0;
while ($my > 1)
{
$name = "TEST-" . $mx;
$query = "INSERT INTO DB_INFO (NAME, BACKUP_BY, BACKUP_STATUS)
VALUES ('{$name}', :BACKUPBY, :BACKUPSTATUS) RETURNING NAME INTO :NAME";
if ($q = oci_parse($conn, $query))
if (oci_bind_by_name($q, ":BACKUPBY", $backupBy, $mx))
if ( oci_bind_by_name($q, ":BACKUPSTATUS", $backupStatus, $mx))
if ( oci_bind_by_name($q, ":NAME", $name, $mx))
if (oci_execute($q))
{
$query = "select * from db_info where name='{$name}'";//'read back what we just wrote...
if (($q = oci_parse($conn, $query)) && oci_execute($q)) $row = oci_fetch_array($q);
}
if (!isset($row["BACKUP_BY"]) || ($row["BACKUP_BY"] != "{$backupBy}") || ($row["BACKUP_STATUS"] != "{$backupStatus}"))
$mx = $mx - $my;//no go, reduce max bind size
else
{
$maxBindSize = $mx; //save last successful value.
$mx = $mx + $my;
}
unset($row);
$my = intval($my / 2);
$i++;
if (($mx < 1000) ||($mx > 8000) || ($i > 16)) $my = 0;//paranoia
}
// Cleanup table, delete bogus entries and save largest successful value for next time.
$query = "delete from db_info where substr(name,1,4) = 'TEST'";
if ($q = oci_parse($conn, $query)) oci_execute($q);
$_SESSION["MAXBINDSIZE"] = $maxBindSize;
//