我的应用程序执行这样的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')
我的问题是:
companyId
列和匹配的id值吗?我通过搜索字符串
尝试了选项(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修改原始查询?
答案 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;
然后,您可以使用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;
?>