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() 错误