Получение HTTP ERROR 500 при попытке получить данные из базы данных Sybase с использованием odbc - PullRequest
0 голосов
/ 12 апреля 2019

Я настраиваю предыдущий проект PHP на платформе CodeIgniter и хочу получить некоторые данные из базы данных SYBASE с использованием ODBC.

Он отлично работает, когда данных не много, но когдамне нужно получить массивные данные, это просто дает мне HTTP ERROR 500.

В моем предыдущем проекте, где я не использую CI, я не получил эту ошибку, но у меня было некоторое time_limit_error, которое я исправил расширением 'max_execution_time ';

Я пробовал это на CI, но это бессмысленно, и ошибка, которую я получаю от CI, не является специфической, потому что он просто говорит «HTTP ERROR 500»;

Соединение установлено правильно, так какэто работает, когда мне не нужны массивные данные, но я не использую стандарты CI для этого, потому что у меня тоже были проблемы с этим.

Кто-нибудь знает, почему я получаю эту ошибку и почему я могу исправитьэто?

Я получил эту ошибку в журнале apache:

[Fri Apr 12 14:49:03.573513 2019] [php7:error] [pid 11768:tid 1964] [client ::1:55425] PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 35767312 bytes) in C:\\xampp\\htdocs\\CodeIgniter\\system\\core\\Output.php on line 198, referer: http://localhost/CodeIgniter/Samsic/provisoes 
[Fri Apr 12 14:49:03.574982 2019] [php7:error] [pid 11768:tid 1964] [client::1:55425] PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 35770368 bytes) in Unknown on line 0, referer: http://localhost/CodeIgniter/Samsic/provisoes

печать страницы:

> <?php ini_set("memory_limit", "256M");  ?> <!DOCTYPE html> <html>
> <head>    <title></title>     <style>     body{       font-size: 0.9em;   }
>   .container{         width: 100%;        height: 100%;   }
> 
>   @media print {      @page { margin: 20px; }         body { margin: 1.6cm; }     }
>   table, th, td {         border: 1px solid black;    </style> </head> <body
> onload="window.print()">  <?php $this->load->view('header'); ?>   <?=
> $resultado; ?>
> 
> </body> </html>

Контроллер:

<?php
ini_set("memory_limit", "256M");
defined('BASEPATH') OR exit('No direct script access allowed');

class Pagamentos extends CI_Controller {

    function __construct(){
        parent::__construct();
        $this->load->model('Pagamentos_model', '', TRUE);
        $this->load->library('session');
    }

    public function index(){
        $data['form'] = 'Pagamentosform';
        $this->load->view('norm',$data);

        }
    public function content(){
        $ano = addslashes($this->input->post('anop'));
        $session_data = array('anop' => $ano);
        $this->session->set_userdata($session_data);
        $codigo = addslashes($this->session->codigo);
        $resultado=$this->Pagamentos_model->read($codigo,$ano);
        $data['form'] = 'Pagamentosform';
        $data['res'] = 'Pagamentoscontent';
        $data['resultado'] = $resultado;
        $this->load->view('norm',$data);


    }

    public function imprimir(){
        $ano =  addslashes($this->session->anop);
        $codigo = addslashes($this->session->codigo);
        $resultado = $this->Pagamentos_model->imprimir($ano,$codigo);
        $data['resultado'] = $resultado;
        $this->load->view('imprimirTemplate',$data);


    }

    public function grafico(){
        $data['form'] = 'Pagamentosform';
        $data['res'] = 'grafico';
        $codigo = addslashes($this->session->codigo);
        $ano = addslashes($this->session->anop);
        $grafico = $this->Pagamentos_model->grafico($ano,$codigo);
        $data['data'] = $grafico;
        $this->load->view('norm',$data);


    }   

}

Функция моделиимпримир:

public function imprimir($ano,$codigo){
        require(APPPATH.'libraries/odbc_conn.php');
        $query = odbc_exec($db, 'Select * from GP_Vw_Valores_Pagos where Ano='.$ano.' and Codigo='.$codigo.' order by CD');
        $row=odbc_fetch_array($query);
        $output= '<h1 style="text-align: center;"> Pagamentos'.$ano.' </h1>  <table class="table" style="width: 100%; margin-bottom:40px; margin-top: 15px; ">
      <thead>
        <tr style="font-size: 1em;margin-bottom: 15px;text-align: center;">
          <th scope="col">CD</th>
          <th scope="col">Descrição</th>
          <th scope="col">Tipo</th>
          <th scope="col">Janeiro</th>
          <th scope="col">Fevereiro</th>
          <th scope="col">Março</th>
          <th scope="col">Abril</th>
          <th scope="col">Maio</th>
          <th scope="col">Junho</th>
          <th scope="col">Julho</th>
          <th scope="col">Agosto</th>
          <th scope="col">Setembro</th>
          <th scope="col">Outubro</th>
          <th scope="col">Novembro</th>
          <th scope="col">Dezembro</th>

        </tr> 
        </thead>';

        while($row){
            $output .= '<tr style="text-align: center;">
        <td>' .$row["CD"].'</td>
          <td>'.iconv("CP850", "UTF-8", $row['Descricao']).'</td>
          <td>VI</td>
          <td>' .number_format($row['Vl01'] , 2, '.', '').'</td>
          <td>' .number_format($row['Vl02'] , 2, '.', '').'</td>
          <td>' .number_format($row['Vl03'] , 2, '.', '').'</td>
          <td>' .number_format($row['Vl04'] , 2, '.', '').'</td>
          <td>' .number_format($row['Vl05'] , 2, '.', '').'</td>
          <td>' .number_format($row['Vl06'] , 2, '.', '').'</td>
          <td>' .number_format($row['Vl07'] , 2, '.', '').'</td>
          <td>' .number_format($row['Vl08'] , 2, '.', '').'</td>
          <td>' .number_format($row['Vl09'] , 2, '.', '').'</td>
          <td>' .number_format($row['Vl10'] , 2, '.', '').'</td>
          <td>' .number_format($row['Vl11'] , 2, '.', '').'</td>
          <td>' .number_format($row['Vl12'] , 2, '.', '').'</td>
               </tr>
               <tr style="text-align: center;">
        <td></td>
          <td></td>
          <td>QT</td>
          <td>' .number_format($row['Qt01'] , 2, '.', '').'</td>
          <td>' .number_format($row['Qt02'] , 2, '.', '').'</td>
          <td>' .number_format($row['Qt03'] , 2, '.', '').'</td>
          <td>' .number_format($row['Qt04'] , 2, '.', '').'</td>
          <td>' .number_format($row['Qt05'] , 2, '.', '').'</td>
          <td>' .number_format($row['Qt06'] , 2, '.', '').'</td>
          <td>' .number_format($row['Qt07'] , 2, '.', '').'</td>
          <td>' .number_format($row['Qt08'] , 2, '.', '').'</td>
          <td>' .number_format($row['Qt09'] , 2, '.', '').'</td>
          <td>' .number_format($row['Qt10'] , 2, '.', '').'</td>
          <td>' .number_format($row['Qt11'] , 2, '.', '').'</td>
          <td>' .number_format($row['Qt12'] , 2, '.', '').'</td>
               </tr>  ';
        }

        return $output;


    }

1 Ответ

1 голос
/ 12 апреля 2019

Редактировать

ОК, вы получаете эту ошибку памяти, потому что вы объединяете всю таблицу в строковую переменную внутри бесконечного цикла и пытаетесь вывести это.

НЕ ДЕЛАЙТЕ ЭТОГО НА МОДЕЛИ.

Из вашей модели вы должны вернуть значения, которые будут использоваться в представлении, непосредственно создавая ваше представление.

У вас много исправлений в этом коде:

  • Не объединяйте для создания макета, он может стать ОГРОМНЫМ и в конечном итоге не хватит памяти.
  • Ваш HTML не работает (например, </table>)
  • Ваш цикл, кажется, работает вечно while($row) <- возможно, это вызывает ошибку, вы нигде не меняете $ row, я думаю, это должно быть <code>while($row=odbc_fetch_row($query)).
  • Я не знаю вашу систему, но вы можете попробовать CodeIgniter для подключения по ODBC: https://www.codeigniter.com/user_guide/database/configuration.html
  • addslashes небезопасно, вместо этого следует использовать prepared statement: http://www.securityidiots.com/Web-Pentest/SQL-Injection/addslashes-bypass-sql-injection.html

Первая попытка

Возможно, вам не хватает памяти, поскольку вы сказали, что загружаете много данных.

Попробуйте найти лучшее значение для ваших нужд

ini_set("memory_limit", "256M");

Вам нужно запустить это перед загрузкой данных, или вы можете изменить настройки php для всей системы.

...