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