6

データベースを更新する必要がありexecute()、配列をパラメーターとして指定して PDO のメソッドを使用します。

アイデアは、NULL値を挿入しようとするとエラーが発生するということです...

送信されるクエリ/パラメータの例を次に示します。

生成されたクエリ:

UPDATE table SET name=?, id_extra1=?, id_extra2=? WHERE id_something=?

パラメータの配列:

array (size=8)
  'name' => string 'testing' (length=6)
  'id_extra1' => string '2' (length=1)
  'id_extra2' => null
  'id_something' => string '1958' (length=4)

したがって、NULL値はid_extra2

Iのコードid_extra2には、次のような条件があります(アイデアは、ID または 0 のいずれかがあり、DB 値を で更新する必要があるということですNULL) :

if ($_POST['id_extra2']==0) {
    $_POST['id_extra2'] = null;
}

$_POST['id_extra2']to''と toNULLと to を設定しようとしまし'null'たが、まだ機能しません。

4

2 に答える 2

2

実行する配列を渡す代わりに、bindValue の使用を検討してください。ここで言うように:

すべての値は PDO::PARAM_STR として扱われます。

UPDATE したい値を配列としてすでに持っているので、アプリケーションの残りの部分に対してこれをかなり透過的にすることができるはずです。たとえば、次のようなものを試してください。

<?php
function executeWithDataTypes(PDOStatement $sth, array $values) {
    $count = 1;
    foreach($values as $value) {
        $sth->bindValue($count, $values['value'], $values['type']);
        $count++;
    }

    return $sth->execute();
}

$sth = $handle->prepare("UPDATE table SET name = ?, id_extra1 = ?, id_extra2 = ? WHERE id_something = ?");

$values = array();
$values[] = array('value' => 'testing', 'type' => PDO::PARAM_STR);
$values[] = array('value' => 2, 'type' => PDO::PARAM_INT);
$values[] = array('value' => null, 'type' => PDO::PARAM_NULL);
$values[] = array('value' => 1958, 'type' => PDO::PARAM_INT);

$result = executeWithDataTypes($sth, $values);
?>

過去に bindParam を使用すると頭痛の種だったと指摘したように、bindValuebindParamの微妙な違いに注意してください。個人的には、スクリプトの理解を難しくする副作用があるため、bindParam を使用することはありませんが、もちろんこれらの効果が役立つ場合もあります。

編集:もちろん、次のようなことを行うことで、関数をさらに単純化し、渡された配列の追加のキーとして型を指定する必要をなくすことができます。

$type = PDO::PARAM_STR;
switch(true) {
    case is_null($value): $type = PDO::PARAM_NULL; break;
    case is_numeric($value): $type = PDO::PARAM_INT; break;
    // ...
    default: break;
}

配列に渡された値の型に基づいて型を決定します。ただし、フロートも数値であり、上記のswitchステートメントで間違った決定につながるため、エラーが発生しやすくなりますが、完全を期すために言及したいと思いました。

于 2013-07-18T13:21:00.380 に答える