PHP在现有查询中动态添加新列和值

时间:2019-07-12 00:45:14

标签: php mysql

我的应用程序执行这样的INSERT查询:

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

现在,我想重建我的应用程序,以便它将始终使用特定ID进行SELECT,INSERT,DELETE和UPDATE。 假设唯一的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;
    }
}

因此,此代码动态地向查询语句添加了额外条件。 使用 DELETE UPDATE 语句(与SELECT相同)也很容易实现 但是Iam试图针对 INSERT INTO 查询提出类似的建议。 如何使用新的companyId修改原始查询?

1 个答案:

答案 0 :(得分:0)

我想如果您有一个带有列名和值的关联数组,那么您很容易就可以使它变得更加动态,以备将来使用。假设您有一个列名称数组,其值例如为

$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