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;
//

0 ответов

Другие вопросы по тегам