php - 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')
我的问题是/是:
- PHP中有没有办法让我可以动态重写查询,以便它包含
companyId
列和匹配的id值? - 有一个更好的方法吗?就像一些技巧将 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 相同)也可以轻松实现这一点,但我试图为INSERT INTO查询提出类似的方法。如何使用新的 companyId 修改原始查询?
解决方案
我想如果你有一个包含列名和值的关联数组,那么你可以很容易地让它在未来变得更加动态。假设您有一个列名数组,其中包含它的值,例如
$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;
?>
推荐阅读
- ember.js - 如何初始化 Ember 模型 ID?
- javascript - 如何在 React Native 中将 flexbox 用于文本组件?水平环绕,垂直增量
- vba - 当另一个文本框在报告中增加其大小时如何停止增加文本框的大小
- ssl - 支持社区版的 TLS
- python - 如何按每一行处理大json文件并有效地转换为csv?
- python - 在文本后搜索 BeautifulSoup,需要从表行中获取所有数据
- python - 将浮点值列表传递给函数时出错
- c# - 通过 Apache Kafka 发送 .csv 等文件
- excel - 即使在更正之后,Excel 也会自动更改为日期格式
- javascript - 使用 Angular 将 Firestore 数据放入数组中