【问题标题】:how to search a certain part in one field on SQL?如何在 SQL 的一个字段中搜索某个部分?
【发布时间】:2019-04-11 10:43:41
【问题描述】:

我正在使用 Codeigniter 执行一些任务,但在查询搜索中遇到问题。我在mysql中有以下数据:

order_billing
--------------
19001-00001-32222
13501-00021-31122
13344-02351-16072
18701-00001-30922
11123-12301-12122

order_billing 有 3 部分格式:number_1-number_2-number_3

我为这样的搜索表单

<input type="text" name="order_billing_1">-
<input type="text" name="order_billing_2">-
<input type="text" name="order_billing_3"> 

for with 条件时如何进行 SQL 查询

  • 输入“order_billing_1”搜索“number_1”
  • 输入“order_billing_2”搜索“number_2”
  • 输入“order_billing_3”搜索“number_3”

我做了一些这样的代码

$post = $this->input->post();
$search['number_1'] = $post['order_billing_1'];
$search['number_2'] = "-".$post['order_billing_2'];
$search['number_3'] = "-".$post['order_billing_3'];

这样的查询

$this->db->like('order_billing', '$search['number_1']', 'after');
$this->db->or_like('order_billing', '$search['number_2']', 'both');
$this->db->or_like('order_billing', '$search['number_3']', 'before');

但它仍然不正确。我仍然对如何在手动 SQL 查询中进行搜索感到困惑。

$search['number_1'] = $post['order_billing_1'];
$search['number_2'] = "-".$post['order_billing_2'];
$search['number_3'] = "-".$post['order_billing_3'];

查询

Select * from TABLE WHERE order_billing like ????

有人知道怎么解决吗?

【问题讨论】:

  • '$search['number_1']' 那里有一些多余的引号。
  • 当用户输入三个值之一或部分值时,预期的输出是什么?

标签: php mysql sql codeigniter


【解决方案1】:

为什么不把它编成一长串呢?

$order_billing = $post['order_billing_1']."-".
                 $post['order_billing_2']."-".
                 $post['order_billing_3'];

然后您可以在一个简单的查询中使用它。

请注意,我使用 $post 而不是 $_POST 来模仿你所做的。

【讨论】:

  • @SalmanA 因为问题以 3 个字符串结尾,并且想知道如何在查询中使用这些字符串来匹配 order_billing 列中的值。该列包含一个字符串,例如19001-00001-32222,因此现在可以使用一个简单的查询将该列中的所有值与$order_billing 中的串联字符串进行比较。
【解决方案2】:

在你想要的纯 SQL 中

SELECT * FROM TABLE WHERE order_billing = CONCAT('13344','-','02351','-','16072')

order_billing 是单列,因此需要使用单个字符串进行搜索。 CONCAT() 将您的三个输入字段放入一个字符串中。还有很多其他方法可以做到这一点。

小心 SQL 注入。并考虑标准化。

【讨论】:

  • “小心 SQL 注入。” Codeigniter 的 like()or_like() 应该保护 SQL 注入,但 SQL 注入反 SQL 注入部分在 Codeigniter 中确实很草率。我过去检查了代码是如何完成的,我震惊地发现它是一个基于Special Character Escape Sequences 保护的自定义函数,它对其他供应商也是如此,所以当攻击者滥用时,保护中可能存在漏洞字符集混合
【解决方案3】:

like '%something%' 在其他文本之间搜索“某物”

假设您正在搜索“1234”

用于订单结算 1 使用 -> like '1234-%' 对于订单计费 2 使用 -> like '%-1234-%' 用于订单结算 3 使用 -> like '%-1234'

【讨论】:

  • @kiko-software 的解决方案无法按预期工作,因为如果搜索订单结算 2 并且搜索订单结算 2 的值存在于订单结算 1 中,它将显示也起来了。
猜你喜欢
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 2016-04-07
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多