PHP:mysql\u fetch\u assoc()希望参数1是资源,布尔值在第13行的[file]中给出

PHP:mysql\u fetch\u assoc()希望参数1是资源,布尔值在第13行的[file]中给出,php,mysql,Php,Mysql,我在标题中提到了这个错误,代码如下: <?php session_start(); ob_start(); include("connection.php"); $username = $_POST['username']; $password = $_POST['password']; $query = mysql_query("

我在标题中提到了这个错误,代码如下:

    <?php  session_start(); 
       ob_start();

                include("connection.php");

                $username = $_POST['username'];
                $password = $_POST['password'];

                $query = mysql_query("SELECT * FROM users WHERE user_username = '$username' AND user_password = '$password'",$conn)
                or die($query. "<br/><br/>".mysql_error());

                if($query = mysql_affected_rows() > 0) {
                    $record = mysql_fetch_assoc($query);
                    $validuser = $row['username'];
                    $_SESSION['valid'] = $validuser;
                    if(isset($_SESSION['valid']))
                    {
                        header('Location:  index.php');         
                    }
                    } else { ?>
                        <script>alert('Username not registered.')
                        </script>
<?php
                   }
                    exit();

?>

您的代码中包含以下内容:

if($query = mysql_affected_rows() > 0) {
mysql\u infected\u rows()
返回受影响的行数。如果大于0,则
$query
将为
TRUE
,否则将为
FALSE
$query
的值将始终是布尔值

mysql\u fetch\u assoc()
需要一个mysql资源作为其参数,但您将传递一个布尔值。这就是错误的原因

从mysql受影响的行()的文档中

获取与链接标识符关联的上次插入、更新、替换或删除查询所影响的行数

另一件事是,您正在运行一个
SELECT
语句,您可能需要
mysql\u num\u rows()

通常,您的
if
语句应该如下所示:

if(mysql_num_rows($query) > 0) {
    # code ...
}
您可以使用代码对其进行如下调整:

$num = mysql_num_rows($query);

if($num > 0) 
{
    while ($record = mysql_fetch_assoc($query)) 
    {
        $validuser = $row['username'];
        $_SESSION['valid'] = $validuser;
        if(isset($_SESSION['valid']))
        {
            header('Location:  index.php');         
        }
    }
}
else 
{
    # else block ...
}
另外,请注意,
mysql\u
函数已被弃用,很快将被删除。为了安全起见,您应该切换到MySQLi或PDO并开始使用参数化查询。

在此循环中:

if($query = mysql_affected_rows() > 0)
您正在将
$query
分配给表达式的结果。因此,
$query
将为True或False

然后在循环中,您正在执行以下操作:

$record = mysql_fetch_assoc($query);
这就是触发错误的地方,因为现在
$query
不再是
mysql\u query
方法的结果

要解决此问题,请更改您的if条件:

if(mysql_affected_rows() > 0)
您还应该这样做,因为旧的
mysql.*
函数将从PHP中删除。

更改此代码:

if($query = mysql_affected_rows() > 0) {
                    $record = mysql_fetch_assoc($query);
                    $validuser = $row['username'];
为此:

 if(mysql_num_rows($query) > 0) {
                $record = mysql_fetch_assoc($query);
                $validuser = $record['username'];

这里有一个提示:
mysql\u受影响的\u行
仅适用于插入、更新、替换或删除。您需要
mysql\u num\u rows
。在PHP中,mysql\u查询调用立即执行查询(它没有设置为需要提交的事务)。第二点你是对的;这应该是OP的另一个问题(最终)。谢谢你让我开心@用户2467945:不客气:)