【问题标题】:mysql query for replacing %s用于替换 %s 的 mysql 查询
【发布时间】:2012-09-08 07:51:56
【问题描述】:

我在 DB 中有很多值,其中包含 %s。我已经用 PHP 编写了代码来替换它们,但我需要一个查询。这可以在查询中完成吗?

我的价值观是 需求超出了所有%s 的预期,很遗憾,我们无法在我们之前电子邮件中所述的时间范围内运送您的%s 配件。 %s 我们希望通过%s 运送您的订单。

它可以有多个 %s 实例。我想将它们替换为 %1$s 进行第一次并发 %2$s 进行第二次并发。

我在我的代码中使用了正则表达式

if(preg_match_all('/(%s)/', $val, $match))

在一个循环中我这样做了

echo $val =str_replace("%s",'%'.++$j.'$s',$val,$count);

但是这一切都可以通过一个查询来完成吗?更不用说优化了。

【问题讨论】:

  • 只需将其传递给 sprintf,然后用它查询 db。
  • MySQL 实际上有一个 replace 方法,只要 google 一下,replace 就会用另一个字符串替换所有出现的字符串。大问题你需要可替换的内容是动态的(一个计数器),因此我建议创建并调用一个存储过程,它接收两个字符串并附加计数器。我相信它与您在 php 中所做的没有太大区别 - 但是如果您只需要用 $s 替换 %s ,那么使用 REPLACE 会快得多。
  • 另一种选择是将内容输出到文件,执行 sed(shell 命令)替换,然后将其加载回来
  • 我是通过代码完成的,只是好奇有一个查询

标签: php mysql regex replace


【解决方案1】:

您确定要这样做吗?您的数据库似乎包含旨在用作sprintf()printf() 的第一个参数的格式字符串:

$dbh = new PDO("mysql:dbname=$dbname;charset=utf8", $username, $password);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$qry = $dbh->prepare('SELECT format_string FROM my_table WHERE string_id = ?');

$qry->execute([1234]);
while ($row = $qry->fetch()) printf($row['format_string'], $s1, $s2, ... );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多