2

いくつかのパラメーターを受け取るPHP関数があります。各パラメーターは、1つの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については触れませんが、他のものを使用している場合はお知らせください)。その後、あなたはUPDATE好きなものを書くことができます

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

NULLIF提供された値が異なる場合は最初の値を返し、それ以外の場合はを返しますNULLCOALESCE次に、最初の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 に答える