Mysql_fetch_assoc 无法正常运行[关闭]

Posted

技术标签:

【中文标题】Mysql_fetch_assoc 无法正常运行[关闭]【英文标题】:Mysql_fetch_assoc not functioning correctly [closed] 【发布时间】:2012-08-25 00:23:55 【问题描述】:

无论如何,我都无法弄清楚我的代码中出现此错误的原因:

mysql_fetch_assoc(): 提供的参数不是有效的 MySQL 结果资源

这是我的 php 代码:

<?php

$session_id = $_SESSION['id'];

$getall = mysql_query("SELECT * FROM users WHERE id='' . $dbuser_id . ''");
$row = mysql_fetch_assoc($getall);

$fullnameDB         = $row['name'];
$emailDB            = $row['email'];
$usernameDB         = $row['username'];

$fullname           = strip_tags($_POST['fullname']);
$username           = strip_tags($_POST['username']);
$email              = strip_tags($_POST['email']);


if ($_POST['submit']) 

    $namecheck = mysql_query("SELECT username FROM users WHERE username='' . $username . ''");

    $count = mysql_num_rows($namecheck);

    if ($count !=0) 

        echo 'That username is already taken!';

     else 

        mysql_query("UPDATE users SET username=' . $username . ' WHERE id='' . $dbuser_id . ''");

        echo 'Your UN has been updated';

    

                        

?>

【问题讨论】:

警告您的代码可能容易受到 sql 注入攻击! 因为您的报价不匹配?您以双引号开头,并试图以两个撇号结尾。 请改进您的标题以匹配您的问题。请在此处发布您的相关代码。 请不要将mysql_* 函数用于新代码。它们不再维护,社区已经开始deprecation process。看到red box?相反,您应该了解prepared statements 并使用PDO 或MySQLi。如果您不能决定,this article 将帮助您选择。如果你想学习,here is a good PDO tutorial. Bobby Tables 【参考方案1】:
"SELECT username FROM users WHERE username='" . $username . "'"

不是

"SELECT username FROM users WHERE username='' . $username . ''"

但请考虑使用 mysqli 或 pdo 切换到参数化语句

【讨论】:

你应该更具体一些,因为这种类型的错误在 ImagineCustom 的代码中不止一次发生。 @think123 - 当我回答时,代码中只有一条 SQL 语句 是的,这是真的,那么您应该考虑编辑您的答案以获得更多赞成票。【参考方案2】:

这是您的代码的改进版本:

<?php

$session_id = $_SESSION['id'];

$getall = mysql_query("SELECT * FROM users WHERE id='" . $dbuser_id . "'");
$row = mysql_fetch_assoc($getall);

$fullnameDB         = $row['name'];
$emailDB            = $row['email'];
$usernameDB         = $row['username'];

$fullname           = mysql_real_escape_string($_POST['fullname']);
$username           = mysql_real_escape_string($_POST['username']);
$email              = mysql_real_escape_string($_POST['email']);


if ($_POST['submit']) 

    $namecheck = mysql_query("SELECT username FROM users WHERE username='" . $username . "'");

    $count = mysql_num_rows($namecheck);

    if ($count !=0) 

        echo 'That username is already taken!';

     else 

        mysql_query("UPDATE users SET username='" . $username . "' WHERE id='" . $dbuser_id . "'");

        echo 'Your UN has been updated';

    

                        

?>

你做错了,在你的查询中,你用双引号(“)开始它,但你试图在中途结束它,用单引号(')连接你的用户名,所以它不起作用。我也帮助清理您的输入,使其不易受到 SQL 注入的影响(如果不安全)。

编辑:正如其他用户所提到的,认真考虑切换到准备好的语句。

【讨论】:

在此处发布答案,而不是在 pastebin 上 谢谢,现在似乎可以工作了。 为什么有人反对我?我做错了吗? @John 你在责备他没有为 OP 做额外的工作? 请注意,这仍然容易受到 SQL 注入的攻击。 【参考方案3】:

您的代码中有错误,它容易受到SQL Injection attacks 的攻击。

使用此代码:

<?php
try 
    $session_id = session_id();
    $conn = mysqli_connect('localhost', 'any_user_other_than_root', 'secure_password', 'database');
    if(!$conn) throw new Exception('Could not connect to the database.');
    $dbuser_id = mysqli_real_escape_string($dbuser_id);
    $query = "SELECT * FROM users WHERE id='$dbuser_id'";
    $getall = mysqli_query($conn, $query);
    if(!$getall) throw new Exception('Database query failed!');
    $row = mysqli_fetch_assoc($getall);
    $fullname_db = $row['name'];
    $email_db = $row['email'];
    $username_db = $row['username'];
    $fullname = mysqli_real_escape_string($_POST['fullname']);
    $username = mysqli_real_escape_string($_POST['username']);
    $email = mysqli_real_escape_string($_POST['email']);
    if(isset($_POST['submit'])) 
        $namecheck = mysqli_query($conn, "SELECT username FROM users WHERE username='$username'");
        if(!$namecheck) throw new Exception('Name check failed!');
        $count = mysqli_num_rows($namecheck);
        if($count > 0) 
            echo 'That username is already taken!';
         else 
            $result = mysqli_query($conn, "UPDATE users SET username='$username' WHERE id='$dbuser_id'");
            if(!$result) throw new Exception('Could not update your UN.');
            echo 'Your UN has been updated';
        
    
 catch(Exception $e) 
    echo 'Error: ' . $e->getMessage();

?>

【讨论】:

请注意,在某些情况下,这仍然容易受到 SQL 注入攻击,您确实应该使用准备好的语句。 您应该尽量保持您的代码与 ImagineCustom 的原始代码尽可能相似,因为如果您以 ImagineCustom 可以理解的格式保存代码,这将有助于 ImagineCustom 更好地理解代码。 @think123 我尽可能地保持它接近,同时让它变得更好。 @Lusitanian - 我的意思是很快就会学习准备好的陈述和一般的OOP。 :-)

以上是关于Mysql_fetch_assoc 无法正常运行[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

mysql_fetch_array、mysql_fetch_assoc、mysql_fetch_object

mysql_ fetch_array 和 mysql_fetch_assoc 的区别

mysql_fetch_array,mysql_fetch_row,mysql_fetch_assoc区别

43)PHP,mysql_fetch_row 和mysql_fetch_assoc和mysql_fetch_array

mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows 等...期望参数1是资源

使用 MySQL 和 jQuery 比较数据库值和文本输入的问题 - 未定义索引和 mysql_fetch_assoc() 错误