这是我以不同方式解决了很多次的问题,但是从来没有一个完美的解决方案。
我有一个要构建的SQL字符串:
arbitrary
现在,基于
Char
我要添加:
$sql = "UPDATE table";
$sql .= "SET";
$sql .= "sqlTableName = 'Y', column2 = value2";
并且基于
isset($_GET['value1'])
我想要:
$sql .= "sqlTableName = 'Y',"
要添加。
如果我在字符串之前或之后加上逗号,则会遇到麻烦。
现在我知道如何解决它,但是如何优雅地做到这一点?
答案 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);