无法使用准备好的对象语句从 mysql 获取多行数据 [重复]

Posted

技术标签:

【中文标题】无法使用准备好的对象语句从 mysql 获取多行数据 [重复]【英文标题】:Unable to fetch multiple row data from mysql using prepared object statements [duplicate] 【发布时间】:2019-06-26 16:36:33 【问题描述】:
$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";
    

此代码未运行。我不知道为什么。 如果我正在获取单行,那么它可以工作,但对于多行,它就不能工作。

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

【问题讨论】:

试试把 (!$stmt) mysqli_error($conn);在某些地方查看代码中断或任何错误消息。你是不是搞错了? 在 chrome 中检查时显示此错误:jquery-3.3.1.min.js:2 POST localhost//action.php 500 (Internal Server Error) 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 的错误,因为我已经对其进行了调试,一切都很好,就像数据来自表单一样,它也可以获取单行但不能用于多行.在这里,我想使用准备好的语句验证数据库中是否已经存在用户名和电子邮件。谢谢 【参考方案1】:

最后,经过 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();

【讨论】:

【参考方案2】:

好的。我努力了: 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。

【讨论】:

我已经完成了你建议的所有操作,但仍然出现同样的错误。 请给我看上面的代码(没有密码等) 看起来您的 '$username' 没有在 'insert' 查询中设置 完整代码请查看此 github gist:gist.github.com/Chandra0505/0705602f9a113d05d4f2e651b68c47d0 感谢您的回复。我已经检查了以下几点- 1. 数据库已连接。 2.表单正在接收来自ajax的数据。 3. 使用 w3school 网站上给出的代码从数据库中选择数据工作正常,但我想使用准备好的语句来实现它。 4. 使用准备好的语句将数据插入数据库的工作正常。但我无法使用此验证电子邮件和密码。

以上是关于无法使用准备好的对象语句从 mysql 获取多行数据 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP:准备好的语句无法从单引号中逃脱

运行准备好的语句 (MySQL/PHP)

从 PDO 准备好的语句中获取查询 [重复]

无法在准备好的 INSERT 语句中的 python mysql.connector 中使用 None (NULL) 值

无法使用准备好的语句从数据库中提取密码哈希

如何在 php 中创建安全的 mysql 准备语句?