检查用户是否已经存在

Check if user already exist

我第一次 post 在 Whosebug

如果 api 获得的 steamid 已经存在于 'steamID64' 列中,我想什么也不做。 但如果没有,请在同一列中插入新的 steamid

这是我编码的内容:

<?php
    if(isset($_SESSION['steamid'])) {

       include ('steamauth/userInfo.php'); //access steam informations

       $ID64 = $steamprofile['steamid'];


       $link = mysql_connect('xxx','xxx', 'xxx', 'xxx');

       $query = "SELECT steamID64 FROM Users WHERE steamID64=".$ID64;
       $result = mysql_query($query, $link);
       $rowcount = mysql_num_rows($result);

       if($rowcount == 0) 
       {
          $newUser = "INSERT INTO Users SET steamID64='$ID64'";
          mysql_query($newUser, $link);
          mysql_free_result($result);
       else 
       {
          echo "User already exist"; //only for debug purpose
       }

       mysql_close($link);
   }
?>

问题是他 运行 其他但我的用户 table 是空的 那我哪里错了? 0_o

我知道有人问过这个问题,但我已经尝试了所有我发现的问题

假设您的 table 只有一个字段,请将您的代码更改为:

$newUser = "INSERT INTO Users(steamID64) VALUES('".$ID64."')";

但是,我建议研究 PDO,因为它容易受到 SQL 注入攻击。

如有必要,请插入其他字段以及 steamID64。

您可以通过执行以下操作来尝试查看查询是否实际运行或抛出错误:

$query = "SELECT steamID64 FROM Users WHERE steamID64='".$ID64."'";
$result = mysql_query($query, $link) or die (mysql_error($link));
$rowcount = mysql_num_rows($result);

插入查询也有问题,应该是:

$newUser = "INSERT INTO Users (steamID64)  VALUES ('".$ID64.'")";

无论如何,您应该尝试使用 PDO 或 Mysqli 准备语句来防止 SQL 注入,因为 mysql_ 已被弃用且不安全。

更新

在使用 mysqli_ 之前,请阅读 http://php.net/manual/en/book.mysqli.php

上的文档

无论如何,使用mysqli_你的代码会变成这样:

$ID64 = $steamprofile['steamid'];
$link=mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);
$_selectQuery="SELECT steamID64 FROM Users WHERE steamID64=?";
$_select=$link->prepare($_selectQuery);
$_select->bind_param('s',$ID64);
if($_select->execute()) {
    $_select->store_result();
    $rowcount=$_select->num_rows;
    if($rowcount==0) {
        $_select->free_result();
        $_insertQuery="INSERT INTO Users (steamID64) VALUES (?)";
        $_insert=$link->prepare($_insertQuery);
        $_insert->bind_param('s',$ID64);

        if($_insert->execute()) {
            //NEW RECORD INSERTED
        } else {
            echo $link->error;
        }
        $_insert->free_result();
    } else {
        //DUPLICATE ENTRY
    }
} else {
    echo $link->error;
}

P.S。我正在使用面向对象 mysqli_ 函数

mysqli->execute() return如果语句成功则为 TRUE,否则它将 return FALSE,但是,无论如何,在 INSERT、[=19 的情况下=] 或 DELETE mysqli 对象还将包含一个 affected_rows 属性,表示受该语句影响的行数。
因此,即使 execute 有效,您也可以检查实际插入了多少行。