首页 > 解决方案 > PHP在现有查询中动态添加新列和值

问题描述

我的应用程序执行如下 INSERT 查询:

INSERT INTO table (`col1`, `col2`, `col3`) VALUES ('oneVal', 'twoVal', 'threeVal')

现在我想重建我的应用程序,所以它总是会选择、插入、删除和更新一个特定的 id。假设唯一ID被称为:companyId

我不想手动重写我的所有查询,所以我正在尝试编写一个函数,用 PHP 重写现有的 SQL 查询,这样它将在查询中包含companyId

如果 companyId 为“1”(companyId 并不总是“1”!),则期望的结果:

INSERT INTO table (`col1`, `col2`, `col3`, `companyId`) VALUES ('oneVal', 'twoVal', 'threeVal', '1')

我的问题是/是:

  1. PHP中有没有办法让我可以动态重写查询,以便它包含companyId列和匹配的id值?
  2. 有一个更好的方法吗?就像一些技巧将 MySQL 服务器设置为总是使用一个额外的值(在这种情况下companyId='1'

我通过搜索字符串尝试了选项(1)

) 价值观

找到该字符串后,我companyId在 ) 之前添加。现在到达查询的末尾,获取最右边的 ) 并在此之前添加值。

但这适用于一般情况吗?我认为可能有更好的方法来解决这个问题。

提前感谢社区!

编辑 1 更清楚 目前我已经构建了一个修改我的SELECT语句的函数。功能代码:

//If current query = SELECT query
if (containsString($sql, 'select')) {
    //Check if contains WHERE
    if (containsString($sql, 'where')) {
        //Yes
        //Add companyId after WHERE
        $sql = substr_replace($sql, '(companyId=?) AND ',  strpos($sql, 'WHERE') + 6, 0);
        //Explanation:
        //SELECT * FROM table WHERE deleted='No'; becomes -->
        //SELECT * FROM table WHERE (companyId=?) AND deleted='No';
    }else{
        //No
        //Get table , and after that INSERT WHERE companyId=?
        $tableName = explode(' from ', strtolower($sql))[1]; //Get part AFTER 'from'
        //First word after $tableName = tablename
        $tableName = explode(' ', $tableName)[0]; //First word after 'from' = tablename
        $sql = substr_replace($sql, 'WHERE (companyId=?) ',  strpos($sql, $tableName) + strlen($tableName) + 1, 0);
        //Explanation:
        //SELECT * FROM table ORDER BY id; becomes -->
        //SELECT * FROM table WHERE (companyId=?) ORDER BY id;
    }
}

所以这段代码动态地为查询语句添加了一个额外的条件。使用DELETEUPDATE语句(与 SELECT 相同)也可以轻松实现这一点,但我试图为INSERT INTO查询提出类似的方法。如何使用新的 companyId 修改原始查询?

标签: phpmysql

解决方案


我想如果你有一个包含列名和值的关联数组,那么你可以很容易地让它在未来变得更加动态。假设您有一个列名数组,其中包含它的值,例如

$data = ['col1'=>'val1','col2'=>'val2','col3'=>'val3','companyId'=>1];

$query = "INSERT INTO `yourtable` ( ".implode(' , ', array_keys($data)).") VALUES ('".implode("' , '", array_values($data))."')";
echo $query;

演示: https ://3v4l.org/udt1i

然后,您可以使用全局regex替换方式为所有 100 个查询添加列和值。

<?php
$re = '/\) VALUES (.+?(?=\)))/m';
$str = 'INSERT INTO table (`col1`, `col2`, `col3`) VALUES (\'oneVal\', \'twoVal\', \'threeVal\')';
$subst = ',`col4`) VALUES $1 , \'1\'';
$result = preg_replace($re, $subst, $str);
echo $result;
?>

演示https ://3v4l.org/rOQDG


推荐阅读