2

我有一个接收一些参数的 PHP 函数。每个参数对应一个 SQL 行的 VALUE。我想做的是根据参数更新值;但有一些参数不是强制性的。因此,如果参数设置为“keep”,则 VALUE 必须保持其当前值。这就是我卡住的地方。

这是功能:

function upt($id, $p1, $p2)
{
    if ($p1 === 'keep')
        $p1 = 'columnName1';
    if ($p2 === 'keep')
        $p2 = 'columnName2';
    $REQ = $DB->prepare('UPDATE ms_cart_products SET columnName1=:P1, columnName2=:P2 WHERE ID=:ID');
    $REQ->execute(array(
        ':P1' => $p1,
        ':P2' => $p2,
        ':ID' => $id));
    $REQ->closeCursor();
}

显然,这是行不通的(即使我暗中希望使 $p1 = 'columnName1' 能够像我直接在 SQL 控制台中创建 COL1=COL1 一样工作)。VALUE 按字面意思设置为“columnName”。

有任何想法吗 ?

谢谢你,弗洛里安

4

2 回答 2

1

让我们假设您使用 PostgreSQL 或 MySQL(我在这里没有提及其他 RDBMS,如果您使用其他东西请告诉我们)。然后你可以写一个UPDATElike

...
SET columnName1 = COALESCE(NULLIF(:your_value, 'keep'), columnName1)
...

NULLIF当提供的值不同时返回其第一个值,否则返回NULL. COALESCE然后返回第一个非 NULL 值。这样,如果您将 'keep' 传递给此表达式,则内部NULLIF部分的计算结果为 NULL,因此COALESCE返回值保留在columnName1. 否则NULLIF返回传递的值并COALESCE对其进行评估。

请参阅文档:

http://www.postgresql.org/docs/9.1/static/functions-conditional.html#FUNCTIONS-COALESCE-NVL-IFNULL

或者

http://dev.mysql.com/doc/refman/5.5/en/control-flow-functions.html#function_nullif

http://dev.mysql.com/doc/refman/5.5/en/comparison-operators.html#function_coalesce

于 2012-09-01T16:02:13.927 回答
0

如果我是你,我会创建一个类,但这也有效。

# Outside the function 
$col1;
$col2;

function upt($id, $p1, $p2)
{
    # Inside the function
    global $col1;
    global $col2;
    if ($p1 === 'keep')
    {
        $col1 = 'columnName1';
    }
    if ($p2 === 'keep')
    {
        $col2 = 'columnName2';
    }
    $REQ = $DB->prepare('UPDATE ms_cart_products SET columnName1=:P1, columnName2=:P2 WHERE ID=:ID');
    $REQ->execute(array(
        ':P1' => $col1,
        ':P2' => $col2,
        ':ID' => $id));
    $REQ->closeCursor();
}
于 2012-09-01T13:04:10.650 回答