$sql = $conn->prepare("SELECT username, email FROM users WHERE username=? OR email = ?");
$sql->bind_param('ss', $uname, $email);
$sql->execute();
$result = $sql->get_result();
$row = $result->fetch_array(MYSQLI_ASSOC);
if ($row['username'] == $uname) {
echo "Username not availabe try different";
} elseif ($row['email'] == $email) {
echo "email is already taken diiferent";
} else {
$stmt = $conn->prepare("INSERT INTO users (username, email, pass, created) VALUES (?, ?, ?, ?)");
$stmt->bind_param('ssss', $username, $email, $pass, $created);
if ($stmt->execute()) {
echo "Registrated sucessfully. Login Now!";
} else {
echo "Something went wrong. Please try again";
}
}
该代码未运行。我不知道为什么。 如果我获取单行,那么它可以工作,但对于多行,它不起作用。
在这里,我想使用准备好的语句验证用户名和电子邮件是否已存在于数据库中。
最佳答案
最后,经过 3-4 小时的练习,我在这篇堆栈溢出文章的帮助下解决了这个问题:call-to-undefined-method-mysqli-stmtget-result
如果有人因 native 驱动程序而遇到同样的问题,请参阅本文。 这是对我有用的解决方案,如下所示:首先定义此函数
function fetchAssocStatement($stmt)
{
if($stmt->num_rows>0)
{
$result = array();
$md = $stmt->result_metadata();
$params = array();
while($field = $md->fetch_field()) {
$params[] = &$result[$field->name];
}
call_user_func_array(array($stmt, 'bind_result'), $params);
if($stmt->fetch())
return $result;
}
return null;
}
正如您所看到的,它创建了一个数组并使用行数据获取它,因为它在内部使用 $stmt->fetch()
,您可以像调用 一样调用它mysqli_result::fetch_assoc
(只需确保 $stmt 对象已打开并且结果已存储)。现在调用上面的函数:-
//mysqliConnection is your mysqli connection object
if($stmt = $mysqli_connection->prepare($query))
{
$stmt->execute();
$stmt->store_result();
while($assoc_array = fetchAssocStatement($stmt))
{
//do your magic
}
$stmt->close();
}
关于php - 无法使用准备好的对象语句从 mysql 获取多行数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54490703/