Php 无法使用准备的对象语句从mysql获取多行数据

Php 无法使用准备的对象语句从mysql获取多行数据,php,mysqli,prepared-statement,mysqli-fetch-array,Php,Mysqli,Prepared Statement,Mysqli Fetch Array,此代码未运行。我不知道为什么。 如果我获取的是一行,那么它可以工作,但是对于多行,它不工作 在这里,我想使用准备好的语句验证数据库中是否已经存在用户名和电子邮件。确定。我试过: MYSQLi $sql = $conn->prepare("SELECT username, email FROM users WHERE username=? OR email = ?"); $sql->bind_param('ss', $uname, $email); $sql->execute()

此代码未运行。我不知道为什么。 如果我获取的是一行,那么它可以工作,但是对于多行,它不工作

在这里,我想使用准备好的语句验证数据库中是否已经存在用户名和电子邮件。

确定。我试过: MYSQLi

$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";
    }
}
PDO

$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);

对我来说很好。您得到一个500错误,因此请检查您的prepare语句。我认为有一个错误导致了500。

最后,经过3-4个小时的练习,我借助这篇堆栈溢出文章解决了这个问题:

如果任何人因为本机驱动程序而有相同的问题,请参阅本文。 下面给出了适合我的解决方案:首先定义这个函数

$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);
正如您所看到的,它创建了一个数组并使用行数据获取它,因为它在内部使用了
$stmt->fetch()
,您可以像调用
mysqli\u result::fetch\u assoc
一样调用它(只需确保$stmt对象已打开并存储了结果)。现在调用上述函数:-

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){mysqli_error($conn);放在某个地方,看看代码在哪里断了或有错误消息。你是不是弄错了什么地方?在chrome中检查时,会发现这个错误:jquery-3.3.1.min.js:2 POST 500(内部服务器错误)send@jquery-3.3.1.min.js:2 ajax@jquery-3.3.1.min.js:2(匿名)@login.php:208 dispatch@jquery-3.3.1.min.js:2 y.handle@jquery-3.3.1.min.js:2我知道这不是ajax或jquery的错误,因为我已经调试过了,一切都很好,就像数据来自表单一样,它可以获取一行数据,但不能处理多行。这里我想验证用户名和电子邮件是否是真实的dy是否使用准备好的语句退出数据库。谢谢。我已经做了您建议的所有事情,但仍然出现相同的错误。请向我显示上面的代码(无密码等)看起来您的“$username”没有在“insert”查询中设置请检查此github要点以获取完整的代码:谢谢回复。我已经检查了以下几点-1.数据库已连接。2.表单正在从ajax接收数据。3.使用w3school网站上提供的代码从数据库中选择数据工作正常,但我想实现它使用准备好的语句。4.使用准备好的语句将数据插入数据库工作正常。但我无法使用此语句验证电子邮件和密码。
//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();
}