如何优雅地解决“逗号问题”?

时间:2019-12-13 21:13:04

标签: php sql

这是我以不同方式解决了很多次的问题,但是从来没有一个完美的解决方案。

我有一个要构建的SQL字符串:

arbitrary

现在,基于

Char

我要添加:

$sql = "UPDATE table";
$sql .= "SET"; 
$sql .= "sqlTableName = 'Y', column2 = value2";

并且基于

isset($_GET['value1'])

我想要:

$sql .= "sqlTableName = 'Y',"

要添加。

如果我在字符串之前或之后加上逗号,则会遇到麻烦。

现在我知道如何解决它,但是如何优雅地做到这一点?

2 个答案:

答案 0 :(得分:6)

将值放入数组中,然后使用数组联接方法。具体语法取决于您使用的编程语言。

您选择的标签根本无法确定其含义,但看起来像您在使用PHP。

<?php
    $values = [ $_GET['value1'], $_GET['value2'] ];
    print join(", ", $values);

(显然,由于数组中的值的数量对于您的情况是可变的,因此您可能会使用push方法动态生成它,并且将用户输入直接粘贴到SQL中是很危险的。)

答案 1 :(得分:1)

您可以构建一个包含所有要更新字段的数组,然后将它们合并在一起。

$sql = "UPDATE table SET "; 

$setArray = [];
if(isset($_GET['value1'])){
    $setArray[] = "sqlTableName = 'Y'";
}
if(isset($_GET['value2'])){
    $setArray[] = "sqlTableName2 = 'Y'";
}

echo $sql.implode(', ', $setArray);

当您具有硬编码的值时,这非常简单。使用用户输入变得更加困难,必须将其参数化。您需要在单独的表中收集值。

这里是一个示例,说明如何使用PDO来实现。

$setFields = [];
$setValues = [];
if (isset($_GET['value1'])) {
    $setFields[] = "sqlTableName = ?";
    $setValues[] = $_GET['value1'];
}
if (isset($_GET['value2'])) {
    $setFields[] = "sqlTableName2 = 'Y'";
    $setValues[] = $_GET['value2'];
}

$pdo = new PDO($dsn, $user, $pass, [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES => false
]);

$pdo->prepare("UPDATE table SET ".implode(', ', $setFields))->execute($setValues);