【问题标题】:Mysql_fetch_assoc not functioning correctly [closed]Mysql_fetch_assoc 无法正常运行[关闭]
【发布时间】: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 并使用PDOMySQLi。如果您不能决定,this article 将帮助您选择。如果你想学习,here is a good PDO tutorial.

标签: php mysql sql


【解决方案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。 :-)
猜你喜欢
  • 2017-02-08
  • 2021-11-07
  • 2016-03-28
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多