我正在使用php和mysql创建一个身份验证文件,但我在这行中有这个错误:
$stmt2->bind_param('ss',$twitter_id, $name);
错误消息是
在...
中的非对象上调用成员函数bind_param()
我的错误在哪里?
VARCHAR
VARCHAR
如果用户已经注册,它应该显示一条消息“用户已注册”,如果用户未注册,则应在我的数据库中插入新的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();
}
答案 0 :(得分:0)
无耻的插件:我在a project I have on github中做了这件事。随意使用课程,无论你喜欢什么;他们大多是复制品。
真正的问题是$bd->prepare()
返回false
检查您是否确实正确地调用了它并将其设置为new mysqli(*params)
错误Call to a member function ... on a non-object in ...
表示$db
不是对象,这意味着它未实例化为对象。因此,$this->method()
是不可能的。 bind_param(string $format, mixed &*vars);
使用pass-by-reference,如果失败,则会抛出错误。
坚持下去就自己尝试一下:
$stmt->bind_param("ss", "string", "string");
要解决可能失败的问题,请检查$db->prepare()
是否返回true:
if ($query = $bd->prepare($sql)) {
//stuff
}
此外,在第一个查询中,为单个查询添加准备开销可能不是一个好主意,该查询仅检查行数而无需用户输入。
答案 1 :(得分:0)
这可能是拼写错误吗? $ bd是否存在或应该是$ db?
答案 2 :(得分:-2)
解决:它现在有效
$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";
}