使用php和mysql stmt检查用户是否存在

使用php和mysql stmt检查用户是否存在,php,mysql,authentication,Php,Mysql,Authentication,我正在使用php和mysql创建一个身份验证文件,但我在这一行中有一个错误: $stmt2->bind_param('ss',$twitter_id, $name); 错误消息是 对中的非对象调用成员函数bind_param() 我的错在哪里 我的数据库中的$name是一个VARCHAR 我的数据库中的$twitter\u id是一个VARCHAR $bd是我的数据库连接 如果用户已经注册,它应该向我显示一条消息,说“用户已经注册”,如果用户没有注册,它应该在我的数据库中插入一个新的

我正在使用php和mysql创建一个身份验证文件,但我在这一行中有一个错误:

$stmt2->bind_param('ss',$twitter_id, $name);
错误消息是

对中的非对象调用成员函数bind_param()

我的错在哪里

  • 我的数据库中的$name是一个
    VARCHAR
  • 我的数据库中的$twitter\u id是一个
    VARCHAR
  • $bd是我的数据库连接
如果用户已经注册,它应该向我显示一条消息,说“用户已经注册”,如果用户没有注册,它应该在我的数据库中插入一个新的id和名称

session_start();
if (!isset($_SESSION['userdata'])) {
    header("location: index.php");
} else {
    $userdata = $_SESSION['userdata'];
    $name = $userdata->name;
    $twitter_id = $userdata->id;
    $stmt = $bd->prepare("SELECT ID_TWITTER FROM USERS");
    $stmt->execute();                
    $stmt->bind_result($checkUser);
    if ($stmt->fetch()) {
    if($checkUser!==$twitter_id){
            $cSQL = "INSERT INTO USERS (ID_TWITTER, FULL_NAME) VALUES(?,?)";
            $stmt2 = $bd->prepare($cSQL);
            $stmt2->bind_param('ss',$twitter_id, $name);
            $stmt2->execute();
            $stmt2->close();
    } else {
        echo "User already exits";
    }
    }
    $stmt->close();
}

无耻的插头:我做这件事的确切时间。你可以随心所欲地使用这些课程;它们大多是可复制的

您真正的问题是返回的值为false。
检查您是否正确调用了它,并将其设置为
newmysqli(*params)

调用成员函数时出现错误
。。。在…
中的非对象上,意味着
$db
不是对象,这意味着它没有实例化为对象。因此,
$this->method()
是不可能的<代码>绑定参数(字符串$格式,混合和*变量)使用按引用传递,如果失败,则抛出错误。 你自己试试,把这个插进去:

$stmt->bind_param("ss", "string", "string");
要解决此问题(可能会失败),请检查
$db->prepare()
是否返回true:

if ($query = $bd->prepare($sql)) {
    //stuff
}

此外,在第一个查询中,添加prepare for单个查询的开销可能不是一个好主意,该查询只检查行数而不检查用户输入。

这可能是一个输入错误吗?$bd存在还是应该是$db?

已解决:它现在可以工作了

        $stmt = $bd->prepare("SELECT ID_PROVIDER FROM USERS WHERE ID_PROVIDER = ?");
        $stmt->bind_param('s', $twitter_id);
        $stmt->execute();
        $stmt->bind_result($checkUser);
        while ($stmt->fetch()) {
            $result = $checkUser;
        }
        if (empty($result)) {
            $cSQL = "INSERT INTO USERS (ID_TWITTER, FULL_NAME) 
           VALUES(?,?)";
            $stmt2 = $bd->prepare($cSQL);
            $stmt2->bind_param('ss', $twitter_id, $name);
            $stmt2->execute();
            $stmt2->close();
        }else {
    echo "User already exits";
}

您能将您的列名与db/表中的列名进行比较吗?我相信这可能是一个输入错误问题。是的,我已经检查过了,它的名称相同bind_param发送两个参数到值$stmt2->bind_param('ss',$twitter_id,$name);在代码中添加这一行-echo ini_get('display_errors');然后看看你得到了什么错误。谢谢,我已经试过了,但是它显示了对非对象上的成员函数bind_param()调用的相同错误消息,你得到的是相同的错误消息吗?因为该错误消息来自对非类的对象调用类函数。此外,当不插入用户输入并简单地获取一行时,使用简单的
$bd->query()
可以省去您的头疼。我感觉可能是这样的(在我的答案上检查修订历史),但我给OP的好处是怀疑。