【问题标题】:Selectively Using Sed to Replace SQL syntax选择性地使用 Sed 替换 SQL 语法
【发布时间】:2017-03-20 22:12:38
【问题描述】:

我最近正在浏览一堆 php 代码,并且 SQL 语法因情况而异。我一直在研究它并对其进行修复以符合可读性。

我当前使用的命令是:

sed -i 's/select/SELECT/g;s/from/FROM/g;s/where/WHERE/g;s/limit/LIMIT/g;s/and/AND/g' /master/dashboard.php

然而,问题是其中一些词会在 html 表单错误消息等中弹出,我正在消磨时间修复这些错误。我宁愿更聪明地工作而不是更努力地工作。

假设每个mysql的格式都类似于so

mysqli_query($mysqli_con,"select * from contacts where username='$username' and password='$password' and active='1'");

如何让 sed 的正则表达式搜索查询部分,然后在其中执行替换?

高级冰雹玛丽,我永远爱你问题:如果我可以让正则表达式使用查询作为替换区域,是否可以将文件中的单词列表馈送/管道 sed 到用`字符括起来?

ie:我有一个包含联系人、用户名、密码、公司等的文件;和 sed -> `contacts`、`username`、`password`、`etc`。

示例文件输入代码段:

session_start();
$username = preg_replace("%[^-_.0-9A-Za-z@]%","",$_SESSION['username']);
$password = preg_replace("%[^-! _.0-9A-Za-z@]%","",$_SESSION['password']);
$date = date("r");
$ip = $REMOTE_ADDR;

$query = mysqli_query($mysqli_con,"select * from contacts where username='$username' and password='$password' and active='1'");
$data = mysqli_fetch_array($query);


if((mysqli_num_rows($query) == "0"))
{
    $_SESSION['message'] = "<font color='red'><b>" . _("Invalid login") . ":</b> " . _("The username and password you entered are not valid.") . "</font>";
    header('Location: /index.php');
}
else
{
$_SESSION['username'] = $data['username'];
$_SESSION['password'] = $data['password'];
$_SESSION['accountid'] = $data['accountid'];
$_SESSION['role'] = $data['role'];

$getCompany = mysqli_query($mysqli_con,"select * from companies where companyid='" . $data['accountid'] . "'");
$dataCompany = mysqli_fetch_array($getCompany);

include('/master/html/header.inc');
?>
<script type="text/javascript">
    $(document).ready(function()
    {
        resizeDashboard();

        $(window).resize(function() {

【问题讨论】:

  • 你不会喜欢结果,其中选定的单词会以看似无限的方式被破坏。有很多关键词。

标签: php mysql regex bash sed


【解决方案1】:

假设您的查询停留在一行上,您可以限制 sed 仅查找这些行:

sed -i '/mysqli_query/s/select/SELECT/...

第一部分/mysqli_query/address,这样只有匹配的行会受到substitution command 的影响。

您也可以用一个替换所有 sed 命令:

sed -i -E '/mysqli_query/s/\b(select|from|where|limit|and)\b/\U\1/g' /master/dashboard.php

\U 告诉 sed 使用大写字母,直至另行通知; \1 是搜索括号中捕获的值的 backreference

大小写更改为 a GNU extension,如果您使用的是 BSD sed(例如在 macOS 上)或其他一些不寻常的 sed,则将不起作用。

【讨论】:

  • 这成功了!感谢您分解旗帜之类的东西,我真的很感激。
猜你喜欢
  • 2016-04-27
  • 2016-09-05
  • 2015-06-01
  • 2014-11-27
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
相关资源
最近更新 更多