我希望用户能够更新他的信息,例如,如果他已经进入开始的phone1,phone2,phone3以便能够更改它们,但如果他将phone1留空,我想保留他的第一个条目。
直到现在我使用x3次(每个条目一个)这段代码:
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')并只更新用户想要的字段?
谢谢
答案 0 :(得分:0)
那么它取决于您对条目的含义,三个帖子值中的第一个或数据库中的上一个记录?!
假设用户只提供两个值
$_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();
}
}