Php 登录系统,将mysqli转换为pdo错误

Php 登录系统,将mysqli转换为pdo错误,php,mysql,mysqli,pdo,Php,Mysql,Mysqli,Pdo,我正在尝试将一些MySQLi代码转换为Unity项目的PDO。我正在制作一个登录系统,我已经将一些MYSQLi更改为PDO,但是我在第33行遇到了一个错误: 致命错误:调用未定义的方法PDOStatement::fetch_assoc() 我试图找到PDO版本的fetch_assoc,结果发现: fetch(PDO::FETCH_ASSOC); 所以我把线路改成了 while($row = $result->fetch(PDO::FETCH_ASSOC)) { 现在是我的Unity D

我正在尝试将一些MySQLi代码转换为Unity项目的PDO。我正在制作一个登录系统,我已经将一些MYSQLi更改为PDO,但是我在第33行遇到了一个错误:

致命错误:调用未定义的方法PDOStatement::fetch_assoc()

我试图找到PDO版本的
fetch_assoc
,结果发现:

fetch(PDO::FETCH_ASSOC);
所以我把线路改成了

while($row = $result->fetch(PDO::FETCH_ASSOC)) {
现在是我的Unity DBcontroller,它有一个“Debug.Log(www.downloadHandler.text)”没有返回任何内容,登录消息也没有出现…向导们,请告诉我下一步要去哪里好吗?我想我应该说,当我使用MySQLi时,脚本工作正常,但我需要将其转换为此项目的PDO。下面是代码:

<?php
$servername = "***";
$username = "***";
$password = "***";
$dbname = "***";

//variables submitted by user
$loginUser = $_POST["loginUser"];
$loginPass = $_POST["loginPass"];

// Create Connection
$conn = new PDO("mysql:host=***;dbname=***",
"***",
"***",
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);

//Check Connection
if(!$conn){
    die("Connection failed.");
}

$sql = "SELECT password FROM users WHERE username = '" . $loginUser . "'";

$result = $conn->query($sql);

if ($result->fetchAll() > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        if($row["password"] == $loginPass){
            echo "Login Success. Welcome ", $loginUser, "!";        
        }
        else{
            echo "Wrong Credentials.";
        }
    }
} else {
    echo "Username does not exist.";
}
$conn = null;

?>
调用时,您将从查询中获取所有结果行,因此调用时没有剩余数据。由于您只希望返回一行,因此可以只调用一次
fetch

if ($row = $result->fetch(PDO::FETCH_ASSOC)) {
    if($row["password"] == $loginPass){
        echo "Login Success. Welcome ", $loginUser, "!";        
    }
    else{
        echo "Wrong Credentials.";
    }
}
else {
    echo "Username does not exist.";
}
注意事项:

  • 您对SQL注入非常开放,应该使用准备好的语句
  • 您不应该以纯文本形式存储密码,而应该使用PHP的和来存储和验证密码
  • 区分不正确的密码和无效的用户名通常被认为是不好的做法。对两者使用相同的错误消息
  • 您应该使用类似于以下代码的代码来避免这些问题:

    $sql = "SELECT password FROM users WHERE username = :username";
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(':username', $loginUser);
    $stmt->execute();
    if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        if(password_verify($loginPass, $row["password"])) {
            echo "Login Success. Welcome ", $loginUser, "!";        
        }
        else{
            echo "Wrong Credentials.";
        }
    }
    else {
        echo "Wrong Credentials.";
    }
    

    刚刚测试了您所做的更改,现在它又开始工作了!非常感谢。我感谢您对SQL注入的提醒,并将研究使用准备好的语句。谢谢!-刚刚看到编辑,我现在也做了这些更改:)@Dizlen查看我的编辑-我添加了一些代码来使用预处理语句警告:您对参数化预处理语句非常开放,应该使用参数化预处理语句,而不是手动生成查询。它们由或提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行。切勿以明文或使用MD5/SHA1存储密码!仅存储使用PHP创建的密码哈希,然后可以使用进行验证。看看这篇文章:了解更多关于@YourCommonSense的信息,为什么你认为这是一个重复的问题?因为OP试图使用来自不同API的函数,这在重复的文章中被清楚地解释为不可能。更不用说这个问题是一个边缘话题