2016-07-23 6 views
1

ユーザが初めてログインするたびに、そのユーザに関する情報を保存します。ユーザーが既にエントリを持っていて、エントリの期限が切れている場合は、更新する必要があります。私の問題は、すでにエントリがあるかどうかを確認するために、データベースとユーザーを比較しようとしています。私は正常にユーザーの詳細をログに記録しますが、ユーザーがログインするたびにこれを行います。以下で私のコードを見つけることができます。クエリ結果を現在のユーザと比較する

$conn = new mysqli('host', 'user', 'password', 'db'); 
if ($conn->connect_error) { 
    die("Error; Contact Support!"); 
} 

$stmt = $conn->prepare("select * from users where steamid=? "); 
$stmt->bind_param('s', $steamprofile['steamid']); 
$stmt->execute(); 
$stmt->store_result(); 
$stmt->bind_result($res); 
$duplicate = mysqli_num_rows($res); 
if ($duplicate == 0) { 
    $stmt1 = $conn->prepare("REPLACE INTO `users` SET `steamid` = ?,`realname` = ?,`username` = ?"); 
    $stmt1->bind_param('sss', $steamprofile['steamid'], $steamprofile['realname'], $steamprofile['personaname']); 
    $stmt1->execute(); 
    $stmt1->store_result(); 
    $stmt1->bind_result($res1); 
    if ($res1 === TRUE) { 
     echo ""; 
    } 
    $stmt1->close(); 
    $stmt->close(); 
    mysqli_close($conn); 
} 

答えて

0

のための新しいユーザーおよび更新のためのINSERTを使用すべきだと思う:

$conn = new mysqli('host', 'user', 'password', 'db'); 
if ($conn->connect_error) { 
    die("Error; Contact Support!"); 
} 

$query = "INSERT INTO `users` SET `steamid` = ?,`realname` = ?,`username` = ? ON DUPLICATE KEY UPDATE realname=? , username=?" 
$stmt1 = $conn->prepare($query); 
$stmt1->bind_param('sssss', $steamprofile['steamid'], 
     $steamprofile['realname'], $steamprofile['personaname'], 
     $steamprofile['realname'], $steamprofile['personaname']); 
$stmt1->execute(); 
$stmt1->store_result(); 
$stmt1->bind_result($res1); 
if ($res1 === TRUE) { 
    echo ""; 
} 
$stmt1->close(); 
mysqli_close($conn); 

最初にクエリを実行して、レコードが既に存在するかどうかを確認する必要はありません。

はまた、クエリは、ユーザー名をバインドする必要はありませんし、本名は二回paramsはその場合には

$query = "INSERT INTO `users` SET `steamid` = ?,`realname` = ?,`username` = ? ON DUPLICATE KEY UPDATE realname=VALUES(realname) , username=VALUES(username)" 

ようにも書くことができることに注意してください。

これはREPLACE INTOよりも優れている点に注意してください。置換する列が1つだけではなく、行全体が置換されるためです。したがってREPLACE INTOは、索引を再計算する必要が生じる可能性があります。

0

あなたがタイプミス

duplicate = mysqli_num_rows($res); 

代わりの

$duplicate = mysqli_num_rows($res); 

を持っていることでした(しかし、これはエラーを発生させるべきではないのですか?)

あなたは

("REPLACE INTO `users` SET `steamid` = ?,`realname` = ?,`username` = ?") 
を使用

私はあなたがあなたが単にDUPLICATE KEY UPDATE ..にINSERTを使用して、すべてこの複雑なロジックを回避することができ、既存のユーザー

("INSERT INTO `users` (`steamid`,`realname`, `username`) values(?, ?,?") 

("UPDATE `users` SET `steamid` = ?,`realname` = ?,`username` = ? 
    WHERE `your_user_id` = ? ") 
+0

'$ duplicate'は信じていないと信じていますが、エラーは発生しません。私は、ユーザーが既にDBエントリを持っているかどうかを確認する方法については少しも手掛かりがありませんが、これは私の悲しい試みです。 @scaisEdge – Nhabbott

+0

steam idはuser_idですか? .. $ steamprofile ['steamid'] ..egの適切な値を持っていることを確認してください。var_dump($ steamprofile ['steamid']); $ duplicateのようにチェックしてください:var_dump($ duplicate); – scaisEdge

関連する問題