mysql_fetch_assoc出错

时间:2012-01-08 17:21:58

标签: php mysql html

  

可能重复:
  php warning mysql_fetch_assoc

我只是实现了我的网站的一个简单部分,它只是从标题中获取一个变量(subid),然后检查数据库,然后输出与变量相关的其他字段。

但是我收到了这个错误 -

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/admin/public_html/report.php on line 14
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''/home/admin/public_html/log/log_274b43e6ad_New Text Document (7).txt.txt' at line 1

这是我的页面的代码,它完成了所有工作

include 'connect_to_mysql.php';
$sql_header = mysql_query("SELECT * FROM system");
$header_array = mysql_fetch_assoc($sql_header);
$total_scans = $header_array['total_scans'];
$malware_detected = $header_array['malware_detected'];
$total_users = $header_array['total_users'];

$report_id = $_GET['log'];
var_dump($report_id);
$sql_report = mysql_query("SELECT * FROM logs WHERE log_name='$report_id");
var_dump($sql_report);
$report_array = mysql_fetch_assoc($sql_report) or die(mysql_error());
$file_name = $report_array['file_name'];
$file_size = $report_array['file_size'];
$submission_date = $report_array['submission_date'];
$result = $report_array['result'];
$status = $report_array['status'];

关于什么可能出错的任何想法?我已经尝试了所有内容并检查了我的数据库,所有名称都是正确的,所有内容,我甚至检查了数据库中的$ report_id变量并且匹配,所以我不确定为什么会出错。

感谢您的帮助

3 个答案:

答案 0 :(得分:4)

您的代码没有进行任何错误检查,所以当查询失败时,查询会无声地破坏也就不足为奇了。检查错误,它会告诉您出现了什么问题 - 如何执行此操作会在manual on mysql_query()或此reference question.中列出。例如:

$sql_report = mysql_query("SELECT * FROM logs WHERE log_name='$report_id");

// Bail out on error 
if (!$sql_report)  
  { 
    trigger_error("Database error: ".mysql_error(), E_USER_ERROR); 
    die();
   }

在您的具体情况下,您错过了

中的结束'
WHERE log_name='$report_id")

此外,您展示的代码容易受到SQL injection的攻击。你需要逃避你使用的每一个值:

$report_id = mysql_real_escape_string($_GET['log']);

要使其正常工作,您需要将查询中的每个值放入引号中。

答案 1 :(得分:0)

您忘记了引用'$report_id'

答案 2 :(得分:0)

这里有两件事需要注意:

1)使用mysql_fetch_assoc()发出警告。 传递给它的参数不是vaide mysql资源时会发生此警告,即 mysql_connect()返回null对象(无法返回连接对象)。这种转换是由于传递给mysql_connect()的参数是错误的数据库凭证这一事实引起的。

这个案例通常使用

进行追踪
is_resource($con) 

如果$ con是有效资源,则返回true。

2)错误描述中描述的错误是由于查询语法错误造成的。

"SELECT * FROM logs WHERE log_name='$report_id"  

这里你为$ report_id

省略了大括号
"SELECT * FROM logs WHERE log_name='$report_id'"

3)数据库访问: 访问数据库的generel方法是使用一个类,该类通过setUname(),SetPasswd()等访问器方法访问数据库凭证,其中方法本身将在将凭据传递给数据库之前修剪,转义和清理凭据。 这样可以防止sql注入攻击