我只是实现了我的网站的一个简单部分,它只是从标题中获取一个变量(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变量并且匹配,所以我不确定为什么会出错。
感谢您的帮助
答案 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注入攻击