【问题标题】:How Can I Retrieve hass or comma separated value from database using codeigniter? [duplicate]如何使用codeigniter从数据库中检索hass或逗号分隔值? [复制]
【发布时间】:2019-07-14 00:34:15
【问题描述】:

我参与了一个 CodeIgniter 项目。在这个项目中,另一个开发人员在数据库中插入 cat_id,包括 # 分隔,如 #1#。当插入两个 cat_id 时,值存储在数据库中,如 #1##2#。

现在我想检索 cat_id 并将其加入另一个表。

【问题讨论】:

  • 你明白我的问题吗?
  • 我想从 #1##2# 中检索 1 和 2。我不更改数据库或插入代码
  • “我想从 #1##2# 中检索 1 和 2。我不更改数据库或插入代码”转换代码和数据库以支持规范化比您尝试的要快得多弄清楚这一点,相信我,您不会使用额外的代码来解析 #1##2# 中的 cat_id

标签: php mysql codeigniter phpmyadmin


【解决方案1】:

你可以试试这个,

$str = "#1##2#";
preg_match_all('|\d+|',$str,$matches);
print_r($matches);

这里正在工作demo

【讨论】:

  • 一般的方法是在使用preg_match_all(...)之前先初始化$matches数组$matches = array(); $matches = []; (PHP5-7),以避免代码中稍后出现关于缺少$matches变量的警告和可能的流控制错误
  • 请告诉我 PHP 中的错误报告级别,它将针对匹配的未定义变量抛出警告/通知。 By Documentation of preg_match_all。据我所知,$matches 正在那里定义。
  • “据我所知,$matches 是在那里定义的。”现在我确实看起来好多了,它是 &$matches,它是一个参考,因此它不会产生丢失的警告。好吧,我会给你一个其他原因(不太重要)然后错过可能的 IDE 代码自动完成支持 $matches 变量。 . 另外,一般意义上,当变量通过引用自动设置时,也总是初始化变量,就像在这种情况下,那么你在我的选项中遵循良好的编程习惯。
  • 好的@RaymondNijland 我会记录下来。我始终坚持基本原则,E_ALL 在我编写代码时始终处于活动状态。谢谢。
  • $matches @RahulMeshram 怎么样
【解决方案2】:

好的,我在第一次尝试时犯了一个错误(在下面找到),希望这应该可以工作:

$text = "#1##2##10000";
$ids = array_filter(explode('#', $text));

// output
array(3) { [1]=> string(1) "1" [3]=> string(1) "2" [5]=> string(5) "10000" }

如果您想将数组键重新设置为从 0 开始,则奖励:

$ids = array_values(array_filter(explode('#', $text)));

// output
array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(5) "10000" }

旧的错误答案:

$text = "#1##2#";

$ids = [];
for ($i=0; $i < strlen($text); $i++) { 
    if ($text[$i] != '#') {
        $ids[] = $text[$i];
    }
}

var_dump($ids);
// produced result
array(2) { [0]=> string(1) "1" [1]=> string(1) "2" }

【讨论】:

  • 嗨,它返回空白
  • 嗨,你确定 $text 变量不为空还是什么的,我刚刚在本地测试了代码,它就像一个魅力。我已将我的输出添加到答案中。
  • “它就像一个魅力。”用$text = "#1##2##10000"; 测试它...
  • @RaymondNijland 我刚刚做了,这是输出:array(7) { [0]=> string(1) "1" [1]=> string(1) "2" [2 ]=> 字符串(1) "1" [3]=> 字符串(1) "0" [4]=> 字符串(1) "0" [5]=> 字符串(1) "0" [6]= > string(1) "0" },我觉得没问题
  • 嗯不...10000 是那个字符串中的一个数字,对吗?
【解决方案3】:

我想从 #1##2# 中检索 1 和 2。我不更改数据库 或插入代码

我强烈建议您将 PHP 代码和 MySQL 表更改为支持规范化。
因为从#1##2# 获取(“解析”)cat_id 号码所需的查询完全是一场噩梦,并且性能不佳。
查询看起来或多或少像这样,没有额外连接到另一个表。

SELECT 
  DISTINCT
   REVERSE(
      REVERSE(
     SUBSTRING_INDEX(SUBSTRING_INDEX(<table>.<column>, '##', rows.row), '##', -1) 
   ) >> 1 ) AS cat_id
FROM (
  SELECT 
   @row := @row + 1 AS ROW
  FROM (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row1
  CROSS JOIN (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row2  
  CROSS JOIN (
    SELECT @row := 0 
  ) init_user_params
)
 ROWS
CROSS JOIN 
 <table>

但是我觉得下一个问题来了。

如何将该 SQL 转换为 codeignitor 的代码?

所以现在一个 PHP 例子来解析 cat_ids

PHP 代码

<?php
  $text = "#1##2##10000";

  $cat_ids = explode("##", trim($text, '#'));

  var_dump($cat_ids);
?>

结果

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(5) "10000"
}

【讨论】:

  • 一个移动应用程序正在使用数据库运行。所以我不能改变这个数据库。是的,这对我来说很难。你对我的下一个问题是正确的。
  • “移动应用程序正在使用数据库运行”@MinhazurRahaman 在听说您没有构建应用程序版本检查器来阻止并强制用户下载移动应用程序更新后,我假设?跨度>
  • “是的,这对我来说很难。你对我的下一个问题是正确的”如果我的 SQL 代码有效,你应该只有 cat_id,你仍然需要加入.. Codeignitor 支持 $this-&gt;db-&gt;query('YOUR QUERY HERE'); @ 987654321@ 直接查询访问 请记住,当使用用户输入时,其中的 SQL 可能会发生 SQL 注入,因此您需要使用 $this-&gt;db-&gt;escape(..) 来保护它们。这是最简单的方法。
猜你喜欢
  • 1970-01-01
  • 2019-05-14
  • 2016-11-12
  • 2018-08-10
  • 2020-05-21
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多