gpt4 book ai didi

php - 基于数组中的数据创建 SQL 查询

转载 作者:行者123 更新时间:2023-11-29 05:48:49 24 4
gpt4 key购买 nike

我正试图找到一种方法来简化与我们的数据库通信的现有功能。该函数目前有多个参数(最多15个),每次添加或更新记录时,都需要所有参数。

我有以下 PHP 函数(简化):

function addSomethingToDB($var1, $var2, $var3, $var4...) {

# Do SQL Injection checks
...

$query = 'INSERT INTO `table` (`var1`,`var2`,`var3`,`var4`) VALUES ($var1, $var2, $var3, $var4)';

# OR

$stmt = $db->prepare('INSERT INTO `table` (`var1`,`var2`,`var3`,`var4`) VALUES (?,?,?,?)');
$stmt->bind_param('ssss', $var1, $var2, $var3, $var4);

}

如果你有多个变量,上面的代码显然会变得相当困惑。如果不是所有变量都需要,则很难使用。因此,我尝试了第二种情况,我要么有一个主要/必需参数,后跟一个数组,要么我只有一个数组作为参数。

function addSomethingToDB($var1, array $attributes) {}

这里的目标是允许数组有一个更灵活的方法,以防将来需要扩展 SQL 查询,或者基于可选值构建 SQL 查询。

例如:

如果未提供 Var2 和 Var4,数组将如下所示:

{
'var1': 'Var1_Value',
'var3': 'Var3_Value'
}

SQL 将是:

$query = 'INSERT INTO `table` (`var1`,`var3`) VALUES ($var1, $var3);

如您所见,在上述场景中,查询仅针对必要的值进行了调整。

我想要尝试实现的是根据提供的值构建 SQL 查询。第一个是我假设有一个 IF ELSE 语句或一个 SWITCH。这给了我一些奇怪的东西,如下所示:

function getlogs($type, $id='') {

$types = array('client_log', 'system_log', 'user_log', 'api_log', 'project_log', 'lead_log');

if (in_array($type, $types)) {

if ('client_log' == $type) {
if (!empty($id)) {
$query = 'SELECT * FROM `logs` WHERE `client_id` = ' . $id . ' AND `type` = "client_log"';
} else {
$query = 'SELECT * FROM `logs` WHERE `type` = "client_log"';
}
} elseif ('project_log' == $type) {
if (!empty($id)) {
$query = 'SELECT * FROM `logs` WHERE `project_id` = ' . $id . ' AND `type` = "project_log"';
} else {
$query = 'SELECT * FROM `logs` WHERE `type` = "project_log"';
}
} elseif ('user_log' == $type) {
if (!empty($id)) {
$query = 'SELECT * FROM `logs` WHERE `staff_id` = ' . $id . ' AND `type` = "staff_log"';
} else {
$query = 'SELECT * FROM `logs` WHERE `type` = "staff_log"';
}
} elseif ('lead_log' == $type) {
if (!empty($id)) {
$query = 'SELECT * FROM `logs` WHERE `client_id` = ' . $id . ' AND `type` = "lead_log"';
} else {
$query = 'SELECT * FROM `logs` WHERE `type` = "lead_log"';
}
} else {
$query = 'SELECT * FROM `logs` WHERE `type` = ' . $type;
}

$logs = Config::$db->query($query);
return $logs->fetch_all(MYSQLI_ASSOC);


} else {
return 'invalid log type';
}

$stmt->close();

}

上面不是我想写的代码,它是一个类似的例子,其中调用了与日志类型相关的查询。但那是一大堆不好看的烂摊子。另外,上面的代码没有使用我希望使用的数组。

最后,我希望编写的代码主要与更新现有记录有关。所以,假设我们有一个用户。用户有电子邮件、密码和地址。根据上面的代码(第一个),每次用户更新他的任何一个字段时,我们都会更新电子邮件、密码和地址。我想避免这种情况。

我的假设是我必须这样做:

# 1. Loop Array using maybe For or Foreach
# 2. Have a whitelisted array of allowed values.
# 3. Append to query if an Array value exists.
# 4. Run query.

我担心我的问题出在第 3 点。我似乎无法弄清楚如何在不经过大量困惑的 IF ELSE 语句的情况下构建查询。

现在,到目前为止,我肯定已经围绕 SO 进行了搜索以找到类似的问题,但是,与 SQL 和数组相关的搜索几乎完全与添加“在单个 SQL 查询中添加多行”或类似问题有关。

最佳答案

您可以使用数组来解决这个问题,其中键是列名并包含值

$columns = [
'field1' => 'value1',
'field2' => 'value2',
'field3' => 'value3',
'field4' => 'value4'
];
addSomethingToDB($columns);
function addSomethingToDB($cols){

# Do SQL Injection checks

$query = "INSER INTO `tablename` ( ".implode(",",array_keys($cols))." ) VALUES ( '".implode("','",array_values($cols))."' )";
}

关于php - 基于数组中的数据创建 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56730365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com