无法使用准备好的对象语句从 mysql 获取多行数据
Unable to fetch multiple row data from mysql using prepared object statements
$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";
}
}
此代码不是 运行。我不知道为什么。
如果我正在获取单行,那么它可以工作,但对于多行,它就不起作用。
这里我想使用准备好的语句验证用户名和电子邮件是否已存在于数据库中。
好的。我试过了:
MYSQLi
$sql = $conn -> prepare("SELECT * FROM users WHERE username=? OR email = ?");
$sql -> bind_param('ss',$uname, $email);
$sql -> execute();
$result = $sql -> get_result();
$row=$result -> fetch_array(MYSQLI_ASSOC);
PDO
$sql = $conn -> prepare("SELECT username, email FROM users WHERE username= :uname OR email = :email");
$sql -> bindParam(':uname', $uname);
$sql -> bindParam(':email', $email);
$sql -> execute();
$row=$sql -> fetchAll();
print_r($row);
对我来说很好用。你得到一个 500 错误所以检查你的准备声明。我认为有一个错误导致 500。
最后,经过 3-4 小时的练习,我在这篇堆栈溢出文章的帮助下解决了这个问题:call-to-undefined-method-mysqli-stmtget-result
如果有人因为本机驱动程序而遇到同样的问题,请参阅本文。
这是对我有用的解决方案如下:首先定义这个函数
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();
}
$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";
}
}
此代码不是 运行。我不知道为什么。 如果我正在获取单行,那么它可以工作,但对于多行,它就不起作用。
这里我想使用准备好的语句验证用户名和电子邮件是否已存在于数据库中。
好的。我试过了: MYSQLi
$sql = $conn -> prepare("SELECT * FROM users WHERE username=? OR email = ?");
$sql -> bind_param('ss',$uname, $email);
$sql -> execute();
$result = $sql -> get_result();
$row=$result -> fetch_array(MYSQLI_ASSOC);
PDO
$sql = $conn -> prepare("SELECT username, email FROM users WHERE username= :uname OR email = :email");
$sql -> bindParam(':uname', $uname);
$sql -> bindParam(':email', $email);
$sql -> execute();
$row=$sql -> fetchAll();
print_r($row);
对我来说很好用。你得到一个 500 错误所以检查你的准备声明。我认为有一个错误导致 500。
最后,经过 3-4 小时的练习,我在这篇堆栈溢出文章的帮助下解决了这个问题:call-to-undefined-method-mysqli-stmtget-result
如果有人因为本机驱动程序而遇到同样的问题,请参阅本文。 这是对我有用的解决方案如下:首先定义这个函数
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();
}