Php 致命错误:对第34行(path)中的非对象调用成员函数fetch_assoc()

Php 致命错误:对第34行(path)中的非对象调用成员函数fetch_assoc(),php,mysqli,Php,Mysqli,我正在尝试验证表单中的一些登录信息。安全性并没有那么重要,因为这对我和我的朋友来说只是一个小小的社交媒体问题,我有备份,所以我并不介意被黑客攻击,我只是在学习php 下面是我得到的错误: 致命错误:对非对象调用成员函数fetch_assoc() 在第34行的/srv/disk4/2177948/www/website.com/postlogin.php中 代码如下: 第34行标有// 注意:连接信息被审查,它在脚本中工作得非常好 <?php session_start(); $usrN

我正在尝试验证表单中的一些登录信息。安全性并没有那么重要,因为这对我和我的朋友来说只是一个小小的社交媒体问题,我有备份,所以我并不介意被黑客攻击,我只是在学习php

下面是我得到的错误:

致命错误:对非对象调用成员函数fetch_assoc() 在第34行的/srv/disk4/2177948/www/website.com/postlogin.php中

代码如下: 第34行标有//

注意:连接信息被审查,它在脚本中工作得非常好

<?php

session_start();

$usrName = $_POST['logInName'];
$pass = $_POST['logInPass'];
$servername = "censored";
$username = "censored";
$password = "censored";
$db_name = "censored";
$conn = mysqli_connect($servername, $username, $password, $db_name);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT usrName FROM loginInfo WHERE usrName='" . $usrName . "';";
$result = mysqli_query($conn,$sql);

if ($conn->query($sql) == TRUE) {
    while ($row = $result->fetch_assoc()) {
        $retrievedUsrName = $row["usrName"];
    }
} else {
    echo 'Error: ' . $conn->error;
}

$result->free;

if ($retrievedUsrName == $usrName) {
    $sql2 = "SELECT pw FROM logininfo WHERE pw='" . $pass . "';";
    $result2 = mysqli_query($conn,$sql2);

    while ($row = $result2->fetch_assoc()) { //Line 34
        $retrievedPass = $row["pw"];
    }
} else {
    echo 'Fant ikke brukernavnet i databasen. Spør Tommy.';
}

if ($retrievedPass == $pass) {
    header('Location: index.php');
} else {
    echo 'Fant ikke passordet i databasen. Spør Tommy.';
}

$result->free;

$conn->close;

?>


我猜,
$sql2
会返回一个错误,而不是一个有效行。如果您在区分大小写的环境中运行MySQL,则可能是您完全以小写形式访问表logininfo。在其他任何地方,你都把它叫做loginInfo,大写字母是
I
。哦,我的天啊。。。我只是花了几个小时来解决这个问题,谢谢你指出:不用担心!我们都有过这样的时刻:-)你应该使用
if($conn->query($sql)==TRUE){…}或者{echo'Error:'。$conn->Error;}
来查看所有查询中可能出现的sql错误。永远不要存储纯文本密码!请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用
密码\u hash()
。在散列之前,请确保对它们进行了清理或使用了任何其他清理机制。这样做会更改密码并导致不必要的额外编码。