1

ユーザーが最初に phone1、phone2、phone3 を入力して変更できるようにした場合など、ユーザーが自分の情報を更新できるようにしたいのですが、phone1 を空のままにしておくと、最初のエントリを保持したいと思います。

今まで、このコードを x3 回 (エントリごとに 1 回) 使用していました。

if(empty($_POST['phone1'])){
    $phone1='';
}else if(
    $stmt = $mysqli->prepare('UPDATE register SET Phone_No=? WHERE E_Mail=?'){
    $stmt->bind_param("ss", $phone1, $email); 
    $stmt->execute();
    $stmt->close();
}
//same for phone 2
//same for phone 3

これらのコードをコンパイルして、mysqli->prepare('update') を 1 回だけ記述し、ユーザーが必要とするフィールドのみを更新する方法はありますか?

ありがとうございました

4

1 に答える 1

0

それは、エントリの意味、3つの投稿値の最初の値、またはデータベース上の前のレコードによって異なります。

ユーザーが2つの値のみを提供するとします

$_POST['phone1'] = 34234034234;
$_POST['phone2'] = 32423423423;

あなたはこのようなことを試すことができます

$values = array_intersect_key( $_POST, array_flip( array('phone1','phone2','phone3') ) );

$query = 'update register set';

if ( isset($values['phone1']) ) $query.= ' Phone1_No = ?,';
if ( isset($values['phone2']) ) $query.= ' Phone2_No = ?,';
if ( isset($values['phone3']) ) $query.= ' Phone3_No = ?,';

$query = rtrim($query, ',') . ' where E_Mail = ?';

$stmt = $mysqli->prepare($query);

array_unshift($values, str_repeat('s', count($values) ) );

array_push($values, $_POST['email']); 

call_user_func_array( array($stmt, 'bind_param'), $values ); 

if ( !$stmt->execute() )
{
    // some error
}

$stmt->close();

または、古いソリューションを使い続けて、同じロジックを維持し、1から3までの単純なループを追加しながら、より整理されたものにします。

for ($i=1; $i < 3; ++$i)
{ 
    if ( !empty($_POST["phone{$i}"]) )
    {
        $stmt = $mysqli->prepare("update register set Phone{$i}_No = ? where E_Mail = ?");

        $stmt->bind_param('s', $_POST["phone{$i}"]); 

        $stmt->execute();

        $stmt->close();
    }
}
于 2012-11-18T13:17:16.290 に答える