【问题标题】:Check if user already exist检查用户是否已经存在
【发布时间】:2015-05-05 06:44:21
【问题描述】:

我第一次在stackoverflow上发帖

如果通过 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);
   }
?>

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

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

【问题讨论】:

    标签: mysql steam


    【解决方案1】:

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

    $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;
    }
    

    附:我正在使用面向对象的mysqli_ 函数

    mysqli-&gt;execute() 如果语句成功则返回 TRUE,否则将返回 FALSE,但无论如何,如果是 INSERTUPDATEDELETEmysqli 对象也将包含 @987654334 @ 属性,表示受语句影响的行数。
    因此,即使execute 有效,您也可以检查实际插入了多少行。

    【讨论】:

    • 我说我没有选择数据库,但是在 mysql_connect 中我的数据库在第四个参数中,它在 mysqli 中会是什么样子?
    • 您可能输入了错误的数据库名称,或者您忘记创建一个。查看更新的答案以查看 mysqli_ 用法的示例
    • 脚本运行良好,但是当执行 INSERT 时,if($_insert->execute) 中的回显根本没有执行我不知道为什么 ^^
    • 感谢所有队友,你帮了我很多,我不能投票给你,但谢谢:D
    • 我们在这里尽我们所能提供帮助,请记住避免旧的和不安全的mysql_。祝你有美好的一天:)
    【解决方案2】:

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

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

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

    如有必要,请连同 steamID64 一起插入其他字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 2023-03-22
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多