【问题标题】:mysql and php function not displaying % percentage sign correctlymysql 和 php 函数未正确显示 % 百分比符号
【发布时间】:2018-04-29 22:15:07
【问题描述】:

我正在使用 codeigniter 构建一个 Web 应用程序。

此应用具有组播的自动配置网络接口,可根据卡信息生成无效的 IP 组播。在 app.txt conf 文件中,我输入以下数据

auto_ip4=239.106.%card.%number

它扫描卡号并在日志中输出 IP 多播,如本例 239.105.2.1 并且可以正常工作,但在前端 webgui 上出现问题。

我们有一个函数可以保存输入数据并将其存储在 mysql 数据库中; mysql表记录3个值ID、NAME、VALUE

值函数是数据存储的地方 239.105.%card.%number

当我按下保存时,记录看起来像这样:239.105.?rd.%number,当我导出它时,文本配置文件看起来像这样

auto_ip4=239.106.?rd.%number 

这是将数据值保存到mysql数据库的PHP表单代码

<?=form_open('config/edit/'.$config->id.'/valid')?>
<table class="form">
    <tr>
        <th>Config param</th>
        <td><?=$config->name?></td>
        <td><input type="text" name="value" value="<?=$config->value?>" /></td>
    </tr>

    <tr>
        <td colspan="2"><input type="submit" value="Save"/></td>
    </tr>
</table>
<?=form_close()?>

显然这只发生在第一个 % 符号上,第二个被正确存储。

【问题讨论】:

  • 嗨,它似乎与十六进制字符有某种关系,我已经测试过输入 .%ca cb cc cd ce cf 并且总是将其替换为 ?
  • 但如果我输入 239.106.%cord.%number 输入文本将被正确存储..
  • 您问题中的 PHP 代码 显示 表单,但不是 保存 它的代码。编辑您的问题以显示该代码。
  • 您似乎在保存时正在做一些事情,这把它搞砸了,所以代码很可能是问题的根源。这只是标准视图代码。
  • 当你将数据发送到服务器时,它是作为 GET 还是作为 PUT?如果数据是作为 GET 发送的,请务必对您的数据进行 URLEncode。

标签: php mysql codeigniter


【解决方案1】:

看到239.105.%card.%number 变为239.105.?rd.%number,并且您在cmets 中指定使用239.106.%cord.%number 正确获取文本

毫无疑问,问题的出现是因为您在某处搞砸了 urldecode() 函数。

查看https://www.w3schools.com/tags/ref_urlencode.asp

% 充当字符的开头以在 url 编码中进行编码。

%CA 被解码为 Ê

你的字符串239.105.%card.%number实际上已经变成239.106.Êrd.%number

您看到 ? 可能是因为您的输出应用程序无法显示 Ê,或者是因为您的数据库/表的字符集无法管理该特定特殊字符。例如,如果您使用的是 utf-8、utf-16 或任何基于拉丁语的字符集,在两边,您会看到 Ê

您的示例中显示的所有其余部分都有效:

  • %nu 在 %number
  • %co 在 %cord

不是有效的 url 编码字符,因此它们被存储为纯文本和/或未解码。这就是这种奇怪行为的原因。

如果不查看代码,很难准确地告诉您如何解决问题。

【讨论】:

  • 嗨,是的,我很舒尔,这是某种字符集..因为这正是正在发生的事情,我正在使用 codeigniter,我将尝试获取有关如何阻止这种情况发生的更多信息,因为我需要将其存储为纯文本而不是编码字符。
  • 那么我怎样才能阻止 codeigniter 选择这个纯文本 %card 并避免将其转换为 ?rd 导致 239.106.?rd.%number 而不是作为纯文本数据 239.106.% 进行复制card.%number
【解决方案2】:

这是某种字符集.. 我在 codeigniter 应用程序上的字符集设置为 UTF-8
配置文件 PHP代码: $config['charset'] = 'UTF-8';

数据库.php PHP代码: $db['default']['char_set'] = "iso-8859-1"; // 或 latin1 $db['default']['dbcollat​​'] = "latin1_general_ci"; // 或 latin1_swedish_ci

在我的 db mysql 上,我尝试设置相同的值,但问题仍然存在。因为数据输入 %card 它作为 ?rd 存储在 db 中,有趣的是,这仅发生在复制的写入函数上数据到 mysql 数据库,如果我通过 phpmyadmin 登录到数据库并在值 %card 上正确输入数据,那么我刷新用于输入数据以从数据库读回数据的配置页面 php,数据显示正确地作为%card,但是当我尝试写回数据库时,它编码错误并将其保存在数据库中作为?rd

【讨论】:

    【解决方案3】:
    <?php
    /**
    
     */
    
    class Config_model extends Model {
        var $id;
        var $name;
        var $value;
    
        public function __construct() {
            parent::Model();
        }
    
        public function findAll() {
            $query = $this->db->get('config');
            return $query->result();
        }
    
        public function find($id) {
            $query = $this->db->get_where('config', array('id' => $id));
            return $query->row();
        }
    
        public function findOneByName($name) {
            $query = $this->db->get_where('config', array('name' => $name));
            return $query->row();
        }
    
        public function countAll() {
            $query = $this->db->get('config');
            return $query->num_rows();
        }
    
        public function add($data) {
            $this->db->insert('config', $data);
            return $this->db->insert_id();
        }
    
        public function delete($id) {
            if ($this->db->delete('config', array('id' => $id))) return true;
        }
    
        public function update($id, $data) {
            $this->db->where('id', $id);
            $this->db->update('config', $data);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      相关资源
      最近更新 更多