Php 写入文本文件工作不正常(CodeIgniter)

Php 写入文本文件工作不正常(CodeIgniter),php,codeigniter,Php,Codeigniter,我有一个简单的脚本,它将数据从MySQL写入文本文件,并立即下载文件,我的表单select inputs中几乎没有post参数,因此如果我更改某些内容并按submit按钮对数据进行排序并写入文件,我会得到包含旧数据的文件,这是以前的,所以,主要的问题是,如果我想得到好的信息后,我改变我的过滤器,我需要做的总是两次提交和第二次提交给我的最后一个信息好文件。我如何预防这个问题 public function all() { $this->load->helper('file');

我有一个简单的脚本,它将数据从MySQL写入文本文件,并立即下载文件,我的表单select inputs中几乎没有post参数,因此如果我更改某些内容并按submit按钮对数据进行排序并写入文件,我会得到包含旧数据的文件,这是以前的,所以,主要的问题是,如果我想得到好的信息后,我改变我的过滤器,我需要做的总是两次提交和第二次提交给我的最后一个信息好文件。我如何预防这个问题

public function all()
{
    $this->load->helper('file');

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="orders_all.txt"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: '.filesize('./assets/downloads/orders_all.txt'));

    $data = array(
        'customer_id' => $this->input->post('customer_id', TRUE), // Params from select inputs
        'product_id'  => $this->input->post('product_id', TRUE),
        'state'       => $this->input->post('state', TRUE),
        'date'        => $this->input->post('date', TRUE)
    );

    $result = $this->orders_model->get_orders_by_filter($data);
    $str    = '';

    foreach ($result as $row)
    {
        $str .= $row['customer_title'] . ';' . $row['product_title'] . ';' . $row['product_code'] . ';' . $row['quantity'] . ';' . $row['created_at']."\r\n";
    }

    if (write_file('./assets/downloads/orders_all.txt', $str))
    {
        readfile('./assets/downloads/orders_all.txt');
    }
}

您的
内容长度将是错误的,因为它正在读取一个不存在的文件

如果您只编写供他人下载的文件,请一起跳过该步骤(如果两个人同时调用脚本,也会导致问题!):

相反,您可以:

header('Content-Length: ' . strlen($str));
echo $str;
i、 e.计算字符串后,将内容长度标题移动到,只发送字符串而不写入文件

如果必须写入文件,则只需将标题移动到底部的“If”中即可

if (write_file('./assets/downloads/orders_all.txt', $str))
{
    header('Content-Length: '.filesize('./assets/downloads/orders_all.txt'));
    readfile('./assets/downloads/orders_all.txt');
}

您的
内容长度将是错误的,因为它正在读取一个不存在的文件

如果您只编写供他人下载的文件,请一起跳过该步骤(如果两个人同时调用脚本,也会导致问题!):

相反,您可以:

header('Content-Length: ' . strlen($str));
echo $str;
i、 e.计算字符串后,将内容长度标题移动到,只发送字符串而不写入文件

如果必须写入文件,则只需将标题移动到底部的“If”中即可

if (write_file('./assets/downloads/orders_all.txt', $str))
{
    header('Content-Length: '.filesize('./assets/downloads/orders_all.txt'));
    readfile('./assets/downloads/orders_all.txt');
}

尝试将所有
标题
放在代码的底部。尝试将所有
标题
放在代码的底部。您甚至可以将其删除,但它不是compulsay@Dagon:非常正确:)可以避免潜在的问题。还应该注意,如果您使用的是多字节字符,那么它实际上也可能是错误的。谢谢!这真的很有帮助。现在我明白了,不需要将数据写入文本文件,只需更改页眉即可。您甚至可以将其删除,这是不必要的compulsay@Dagon:非常正确:)可以避免潜在的问题。还应该注意,如果您使用的是多字节字符,那么它实际上也可能是错误的。谢谢!这真的很有帮助。现在我明白了,不需要将数据写入文本文件,只需要更改页眉即可。