4

PHPでプロフィールページを作成しました。このページには、住所と電話のフィールドが含まれており、ユーザーはデータを挿入するように求められます。その後、データは profile という名前のテーブルに保存されます。すべて正常に動作しますが、問題は、既にデータが含まれている場合にのみテーブルが更新されることです。どうすればそれを変更できますか (おそらく関数にある mysql クエリ)、データが空であってもテーブルに入力されるようにします。使用できる UPDATE OR INSERT INTO 構文のようなものはありますか? ありがとう

<?php


if ( isset($_GET['success']) === true && empty($_GET['success'])===true ){
echo'profile updated sucessfuly';
}else{

 if( empty($_POST) === false  &&  empty($errors) === true ){

    $update_data_profile = array(
                'address' => $_POST['address'],
                'telephone' => $_POST['telephone'],
                );


   update_user_profile($session_user_id, $update_data_profile);

   header('Location: profile_update.php?success');

   exit();


}else if ( empty($errors) === false ){
   echo output_errors($errors);
}

?>

そして、次の関数を使用して

function update_user_profile($user_id, $update_data_profile){

$update = array();

array_walk($update_data_profile, 'array_sanitize');

foreach($update_data_profile as $field => $data )
    {              
        $update[]='`' . $field . '` = \'' . $data . '\'';
}


     mysql_query(" UPDATE `profile` SET " . implode(',  ', $update) . " WHERE `user_id` = $user_id ") or die(mysql_error());


}
4

3 に答える 3

1

私は psu によって投稿された回答に不慣れであり、間違いなくそれをチェックしますが、簡単な読みから、これらの特別な構文を使用するときは非常に注意する必要があります。

頭に浮かぶ理由の 1 つは、情報を挿入または更新しているテーブルに何が起こっているのかを知らないことです。複数の一意が定義されている場合、深刻な問題が発生する可能性があり、これはアプリケーションのスケーリング時によくあることです。

2 構文への置換は、自分のアプリケーションではめったに起こりたくない機能です。テーブルに既にある行の列からデータを失いたくないので。

私は彼の答えが間違っていると言っているのではありません.

最初の記事で述べたように、私はこれを行う初心者かもしれませんが、現時点では次のことを好みます。

$result = mysql_query("select user_id from profile where user_id = $user_id limit 1");
if(mysql_num_rows($result) === 1){
    //do update like you did
}
else{
    /** 
     *  this next line is added after my comment, 
     *  you can now also leave the if(count()) part out, since the array will now alwayss
     *  hold data and the query won't get invalid because of an empty array
     **/
    $update_data_profile['user_id'] = $user_id;
    if(count($update_data_profile)){
        $columns = array();
        $values = array();
        foreach($update_data_profile as $field => $data){
            $columns[] = $field;
            $values[] = $data;
        }
        $sql = "insert into profile (" .  implode(",", $columns) .") values ('" . implode("','", $values) . "')" ;
        var_dump($sql); //remove this line, this was only to show what the code was doing
        /**update**/
        mysql_query($sql) or echo mysql_error();
    }
}
于 2013-02-11T18:57:41.123 に答える
0

user_id に対応するデータがテーブルにない場合、テーブルを更新することはできません。つまり、user_id と null を含む行、または他のフィールド用の何かが必要です。

a)テーブルにデータが含まれているかどうかを確認し、挿入されていない場合は更新を使用できます(理想的ではありません)

$result = mysql_query("UPDATE ...");       
if (mysql_affected_rows() == 0)    
    $result = mysql_query("INSERT ...");

b) このリンクを確認してください

http://www.kavoir.com/2009/05/mysql-insert-if-doesnt-exist-otherwise-update-the-existing-row.html

http://dev.mysql.com/doc/refman/5.0/en/replace.html

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

于 2013-02-11T18:45:58.240 に答える
0

@ステファノス

SQLクエリで「INSERT INTO」の代わりに「REPLACE INTO」コマンドを使用できます。

例えば

挿入クエリがあるとします

INSERT INTO EMPLOYEE (NAME,ADD) values ('ABC','XYZZ');

次のクエリを挿入と更新の組み合わせとして使用できるようになりました

REPLACE INTO EMPLOYEE (NAME,ADD) values ('ABC','XYZZ');

これが役立つことを願っています!

于 2013-02-13T14:03:24.553 に答える