Linux下的编码器文件名和加载帮助程序


Codeigniter file names and loading helpers under Linux

有些人可能认为这个问题已经被问了几百次了,但我仍然没有找到我所遇到的具体问题的答案。

我读过这些题目,但是没有一个能回答我的问题:

https://github.com/bcit-ci/CodeIgniter/issues/1805

codeigniter上传在linux上不工作

Codeigniter web应用程序不能与linux一起工作,但这里在windows上是好的

在windows和linux中使用codeigniter时的命名约定问题

我正在开发一个PHP应用程序。我在家里的测试服务器运行Windows,舞台服务器运行Ubuntu (Amazon AWS)。

  1. 我的应用程序工作得很完美,直到我需要创建一个助手:

    MY_form_helper.php
    

    在这个帮助程序中,我需要重写这个:

    function set_value($field = '', $default = '')
        {
            if (FALSE === ($OBJ =& _get_validation_object()))
            {
                if ( ! isset($_POST[$field]))
                {
                    return $default;
                }
                return form_prep($_POST[$field], $field);
            }
            return form_prep($OBJ->set_value($field, $default), $field);
        }
    
    与这个:

                function set_value($field = '', $default = '')
        {
            if (FALSE === ($OBJ =& _get_validation_object()))
            {
                if (isset($_POST[$field]))
                {
                    return form_prep($_POST[$field], $field);
                }
                if (isset($_GET[$field]))
                {
                    return form_prep($_GET[$field], $field);
                }
                    return $default;
            }
            return form_prep($OBJ->set_value($field, $default), $field);
        }
    

所以我保存了修改到

     MY_form_helper.php 

在windows上测试过了,一切都很好。所有PHP大师可能都知道现在发生了什么,我上传到linux服务器和错误:)

第一个错误是:

    An Error Was Encountered
    Unable to load the requested file: helpers/my_form_helper.php

好吧,linux是区分大小写的,所以我把所有的大写文件名都改成了小写。在那之后,迎接我的是一个空白的页面。

旁注:我有在名称中大写第一个字母的库(例如我使用flex_auth库),它总是在服务器上工作。我现在不知道为什么,因为它应该在Linux上失败,因为文件名中有大写字母——如果有人能解释一下就太好了。

我已经改变了配置在我的index.php显示所有的错误添加

    ini_set('display_errors', 1);

:

    if (defined('ENVIRONMENT'))
    {
        switch (ENVIRONMENT)
        {
            case 'development':
                error_reporting(E_ALL);
                ini_set('display_errors', 1);
            break;
            case 'testing':
            case 'production':
                error_reporting(0);
            break;
            default:
                exit('The application environment is not set correctly.');
        }
    }

我重新加载页面,现在我可以看到有致命错误:

    Fatal error: Cannot redeclare set_value() (previously declared in /var/www/html/stage/bik/system/helpers/form_helper.php:675) in /var/www/html/stage/bik/application/helpers/my_form_helper.php on line 5

这就是我被困的地方。我做了一个大禁忌,用我的代码编辑了CI核心系统文件中的form_helper。我需要它全部工作,因为我让人测试整个东西,我不能让他们等待。

所以有人能给我解释一下发生了什么吗?我对Linux比较陌生,一直使用Windows机器和服务器。但是我想随波逐流,像孩子们那样使用Linux。

  • 这里有更多的比特可能会有所帮助
  • MY_form_helper文件:

    <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 
    
    function set_value($field = '', $default = '')
    {
        if (FALSE === ($OBJ =& _get_validation_object()))
        {
            if (isset($_POST[$field]))
            {
                return form_prep($_POST[$field], $field);
            }
            if (isset($_GET[$field]))
            {
                return form_prep($_GET[$field], $field);
            }
                return $default;
        }
        return form_prep($OBJ->set_value($field, $default), $field);
    }
    

    这是我在控制器中加载它的方式:

    $this->load->helper('MY_form_helper');
    

    我把它移到linux服务器时,把两个大写字母都改成小写。

    现在有些让我难以置信的事情,我已经创建了MY_Input库,我正在从CI应用程序文件夹的核心文件夹加载它。这个东西的名字中有大写字母,它在Linux服务器上工作。

    <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
        class MY_Input extends CI_Input {
    
    function save_query($query_array){
        $CI =& get_instance();
        $CI->db->insert('ci_query', array('query_string' => http_build_query($query_array)));
        return $CI->db->insert_id();        
    }
    
    function load_query($query_id){
        $CI =& get_instance();
        $rows = $CI->db->get_where('ci_query', array('queryid' => $query_id))->result();
        if (isset($rows[0])) {
            parse_str($rows[0]->query_string, $_GET);
        }
    }
    
        }
    

    我还在学习PHP,我没有得到很多东西,我没有太多的经验,所以我真的很感激所有的帮助任何人可以给我。

    我希望我已经说清楚了我需要回答的问题。感谢任何愿意与我分享知识的人!

    我认为你可以把这个函数包装到类

    class MY_form_helper{
    static function  set_value($field = '', $default = '')
        {
            if (FALSE === ($OBJ =& _get_validation_object()))
            {
                if (isset($_POST[$field]))
                {
                    return form_prep($_POST[$field], $field);
                }
                if (isset($_GET[$field]))
                {
                    return form_prep($_GET[$field], $field);
                }
                    return $default;
            }
            return form_prep($OBJ->set_value($field, $default), $field);
        }
    }
    

    ,你可以这样称呼它:

    MY_form_helper::set_value($field, $default);
    

    或者你需要使用名称空间,但是这个更长